blob: c0d6c52db8008130f4dbbe83d198030fceeee83e [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
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000298 const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000299
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000300 CheckPreprocessingOptions(D, Args);
301
302 Args.AddLastArg(CmdArgs, options::OPT_C);
303 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000304
305 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000306 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 (A = Args.getLastArg(options::OPT_MD)) ||
308 (A = Args.getLastArg(options::OPT_MMD))) {
309 // Determine the output location.
310 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000311 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000312 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000313 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000314 } else if (Output.getType() == types::TY_Dependencies) {
315 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000316 } else if (A->getOption().matches(options::OPT_M) ||
317 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000318 DepFile = "-";
319 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000320 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000321 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 }
323 CmdArgs.push_back("-dependency-file");
324 CmdArgs.push_back(DepFile);
325
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
328 const char *DepTarget;
329
330 // If user provided -o, that is the dependency target, except
331 // when we are only generating a dependency file.
332 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
333 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000334 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000335 } else {
336 // Otherwise derive from the base input.
337 //
338 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000339 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000340 llvm::sys::path::replace_extension(P, "o");
341 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000342 }
343
344 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000345 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000346 QuoteTarget(DepTarget, Quoted);
347 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000348 }
349
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000350 if (A->getOption().matches(options::OPT_M) ||
351 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000352 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000353 if ((isa<PrecompileJobAction>(JA) &&
354 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
355 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000356 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000357 }
358
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000359 if (Args.hasArg(options::OPT_MG)) {
360 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000361 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000362 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000363 CmdArgs.push_back("-MG");
364 }
365
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000367 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000368
369 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000370 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000371 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000372
Daniel Dunbara442fd52010-06-11 22:00:13 +0000373 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000374 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000375 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000376 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000377 CmdArgs.push_back(Args.MakeArgString(Quoted));
378
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000379 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000380 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000381 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000382 }
383 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384
Douglas Gregor111af7d2009-04-18 00:34:01 +0000385 // Add -i* options, and automatically translate to
386 // -include-pch/-include-pth for transparent PCH support. It's
387 // wonky, but we include looking for .gch so we can support seamless
388 // replacement into a build system already set up to be generating
389 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000390 int YcIndex = -1, YuIndex = -1;
391 {
392 int AI = -1;
393 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
394 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
395 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
396 // Walk the whole i_Group and skip non "-include" flags so that the index
397 // here matches the index in the next loop below.
398 ++AI;
399 if (!A->getOption().matches(options::OPT_include))
400 continue;
401 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
402 YcIndex = AI;
403 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
404 YuIndex = AI;
405 }
406 }
407 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
408 Driver::InputList Inputs;
409 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
410 assert(Inputs.size() == 1 && "Need one input when building pch");
411 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
412 Inputs[0].second->getValue()));
413 }
414
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000415 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000416 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000417 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000418 ++AI;
419
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000420 if (getToolChain().getDriver().IsCLMode() &&
421 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000422 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000423 // include is compiled into foo.h, and everything after goes into
424 // the .obj file. /Yufoo.h means that all includes prior to and including
425 // foo.h are completely skipped and replaced with a use of the pch file
426 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
427 // just mean that the last one wins.) If /Yc and /Yu are both present
428 // and refer to the same file, /Yc wins.
429 // Note that OPT__SLASH_FI gets mapped to OPT_include.
430 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
431 // cl.exe seems to support both flags with different values, but that
432 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000433 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000434 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
435 if (PchIndex != -1) {
436 if (isa<PrecompileJobAction>(JA)) {
437 // When building the pch, skip all includes after the pch.
438 assert(YcIndex != -1 && PchIndex == YcIndex);
439 if (AI >= YcIndex)
440 continue;
441 } else {
442 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000443 if (AI < PchIndex) {
444 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000445 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000446 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000447 if (AI == PchIndex) {
448 A->claim();
449 CmdArgs.push_back("-include-pch");
450 CmdArgs.push_back(
451 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
452 continue;
453 }
454 }
455 }
456 } else if (A->getOption().matches(options::OPT_include)) {
457 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000458 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
459 RenderedImplicitInclude = true;
460
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000461 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000463
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000464 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000465 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000466 SmallString<128> P(A->getValue());
467 // We want the files to have a name like foo.h.pch. Add a dummy extension
468 // so that replace_extension does the right thing.
469 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000470 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000471 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000472 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000473 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000474 }
475
Douglas Gregor111af7d2009-04-18 00:34:01 +0000476 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000477 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000478 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000479 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000480 }
481
Douglas Gregor111af7d2009-04-18 00:34:01 +0000482 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000483 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000484 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000485 FoundPCH = UsePCH;
486 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000488 }
489
490 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000491 if (IsFirstImplicitInclude) {
492 A->claim();
493 if (UsePCH)
494 CmdArgs.push_back("-include-pch");
495 else
496 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000497 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000498 continue;
499 } else {
500 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000501 D.Diag(diag::warn_drv_pch_not_first_include) << P
502 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000503 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000504 }
Saleem Abdulrasool88879e62016-06-17 17:23:16 +0000505 } else if (A->getOption().matches(options::OPT_isystem_after)) {
506 // Handling of paths which must come late. These entries are handled by
507 // the toolchain itself after the resource dir is inserted in the right
508 // search order.
509 // Do not claim the argument so that the use of the argument does not
510 // silently go unnoticed on toolchains which do not honour the option.
511 continue;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000512 }
513
514 // Not translated, render as usual.
515 A->claim();
516 A->render(Args, CmdArgs);
517 }
518
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000519 Args.AddAllArgs(CmdArgs,
520 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
521 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000522
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000523 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000524
525 // FIXME: There is a very unfortunate problem here, some troubled
526 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
527 // really support that we would have to parse and then translate
528 // those options. :(
529 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
530 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000531
532 // -I- is a deprecated GCC feature, reject it.
533 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000534 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535
536 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
537 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000538 StringRef sysroot = C.getSysRoot();
539 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000540 if (!Args.hasArg(options::OPT_isysroot)) {
541 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000542 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000543 }
544 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000545
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000547 // FIXME: We should probably sink the logic for handling these from the
548 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000549 // CPATH - included following the user specified includes (but prior to
550 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000552 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000553 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000554 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000555 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000556 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000557 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000558 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000559 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000560
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 // Optional AuxToolChain indicates that we need to include headers
562 // for more than one target. If that's the case, add include paths
563 // from AuxToolChain right after include paths of the same kind for
564 // the current target.
565
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000566 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000568 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000569 if (AuxToolChain)
570 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
571 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000572
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000573 // Add system include arguments for all targets but IAMCU.
574 if (!IsIAMCU) {
575 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
576 if (AuxToolChain)
Artem Belevichfa11ab52015-11-17 22:28:46 +0000577 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000578 } else {
579 // For IAMCU add special include arguments.
580 getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs);
581 }
Artem Belevichfa11ab52015-11-17 22:28:46 +0000582
583 // Add CUDA include arguments, if needed.
584 if (types::isCuda(Inputs[0].getType()))
585 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000586}
587
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000588// FIXME: Move to target hook.
589static bool isSignedCharDefault(const llvm::Triple &Triple) {
590 switch (Triple.getArch()) {
591 default:
592 return true;
593
Tim Northover9bb857a2013-01-31 12:13:10 +0000594 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000595 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000596 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000597 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000598 case llvm::Triple::thumb:
599 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000600 if (Triple.isOSDarwin() || Triple.isOSWindows())
601 return true;
602 return false;
603
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000604 case llvm::Triple::ppc:
605 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000606 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000607 return true;
608 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000609
David Majnemerdcecd932015-05-23 19:23:55 +0000610 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000611 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000612 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000614 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000615 }
616}
617
Robert Lytton0e076492013-08-13 09:43:10 +0000618static bool isNoCommonDefault(const llvm::Triple &Triple) {
619 switch (Triple.getArch()) {
620 default:
621 return false;
622
623 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000624 case llvm::Triple::wasm32:
625 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000626 return true;
627 }
628}
629
Renato Goline17c5802015-07-27 23:44:42 +0000630// ARM tools start.
631
632// Get SubArch (vN).
633static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
634 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000635 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000636}
637
638// True if M-profile.
639static bool isARMMProfile(const llvm::Triple &Triple) {
640 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000641 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000642 return Profile == llvm::ARM::PK_M;
643}
644
645// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000646static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
647 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000648 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
649 CPU = A->getValue();
650 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
651 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000652 if (!FromAs)
653 return;
654
655 for (const Arg *A :
656 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
657 StringRef Value = A->getValue();
658 if (Value.startswith("-mcpu="))
659 CPU = Value.substr(6);
660 if (Value.startswith("-march="))
661 Arch = Value.substr(7);
662 }
Renato Goline17c5802015-07-27 23:44:42 +0000663}
664
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000665// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000666// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000667static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000668 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000669 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000670 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
671 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000672 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
673}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000674
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000675// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000676static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000677 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000678 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000679 unsigned FPUID = llvm::ARM::parseFPU(FPU);
680 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000681 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
682}
683
Bradley Smithbbf5a002015-11-18 16:33:48 +0000684// Decode ARM features from string like +[no]featureA+[no]featureB+...
685static bool DecodeARMFeatures(const Driver &D, StringRef text,
686 std::vector<const char *> &Features) {
687 SmallVector<StringRef, 8> Split;
688 text.split(Split, StringRef("+"), -1, false);
689
690 for (StringRef Feature : Split) {
691 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
692 if (FeatureName)
693 Features.push_back(FeatureName);
694 else
695 return false;
696 }
697 return true;
698}
699
Renato Golin7c542b42015-07-27 23:44:45 +0000700// Check if -march is valid by checking if it can be canonicalised and parsed.
701// getARMArch is used here instead of just checking the -march value in order
702// to handle -march=native correctly.
703static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000704 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = ArchName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Renato Golin7c542b42015-07-27 23:44:45 +0000715// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
716static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
717 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000718 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000719 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000720 std::pair<StringRef, StringRef> Split = CPUName.split("+");
721
Renato Goline17c5802015-07-27 23:44:42 +0000722 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000723 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
724 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000725 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000726}
727
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000728static bool useAAPCSForMachO(const llvm::Triple &T) {
729 // The backend is hardwired to assume AAPCS for M-class processors, ensure
730 // the frontend matches that.
731 return T.getEnvironment() == llvm::Triple::EABI ||
732 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
733}
734
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000735// Select the float ABI as determined by -msoft-float, -mhard-float, and
736// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000737arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
738 const Driver &D = TC.getDriver();
739 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 auto SubArch = getARMSubArchVersionNumber(Triple);
741 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000742 if (Arg *A =
743 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
744 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000745 if (A->getOption().matches(options::OPT_msoft_float)) {
746 ABI = FloatABI::Soft;
747 } else if (A->getOption().matches(options::OPT_mhard_float)) {
748 ABI = FloatABI::Hard;
749 } else {
750 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
751 .Case("soft", FloatABI::Soft)
752 .Case("softfp", FloatABI::SoftFP)
753 .Case("hard", FloatABI::Hard)
754 .Default(FloatABI::Invalid);
755 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000756 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000757 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000758 }
759 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000760
761 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
762 // "apcs-gnu".
763 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000764 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000765 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
766 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000767 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 }
769
770 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000771 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000772 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000773 case llvm::Triple::Darwin:
774 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000775 case llvm::Triple::IOS:
776 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000779 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000780 break;
781 }
Tim Northover756447a2015-10-30 16:30:36 +0000782 case llvm::Triple::WatchOS:
783 ABI = FloatABI::Hard;
784 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000785
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000786 // FIXME: this is invalid for WindowsCE
787 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000788 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000789 break;
790
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000791 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000792 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000793 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000794 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000795 break;
796 default:
797 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000799 break;
800 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000801 break;
802
Daniel Dunbar78485922009-09-10 23:00:09 +0000803 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000804 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000805 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000806 case llvm::Triple::EABIHF:
807 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000808 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000809 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000810 case llvm::Triple::EABI:
811 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000812 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000813 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000814 case llvm::Triple::Android:
815 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000816 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000817 default:
818 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000819 if (Triple.isOSBinFormatMachO() &&
820 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
821 ABI = FloatABI::Hard;
822 else
823 ABI = FloatABI::Soft;
824
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000825 if (Triple.getOS() != llvm::Triple::UnknownOS ||
826 !Triple.isOSBinFormatMachO())
827 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000828 break;
829 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000830 }
831 }
832
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000833 assert(ABI != FloatABI::Invalid && "must select an ABI");
834 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000835}
836
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000837static void getARMTargetFeatures(const ToolChain &TC,
838 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000839 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000840 std::vector<const char *> &Features,
841 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000842 const Driver &D = TC.getDriver();
843
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000844 bool KernelOrKext =
845 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000846 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000847 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
848 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
849
Nico Weber6e0ebae2015-04-29 21:16:40 +0000850 if (!ForAS) {
851 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
852 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
853 // stripped out by the ARM target. We should probably pass this a new
854 // -target-option, which is handled by the -cc1/-cc1as invocation.
855 //
856 // FIXME2: For consistency, it would be ideal if we set up the target
857 // machine state the same when using the frontend or the assembler. We don't
858 // currently do that for the assembler, we pass the options directly to the
859 // backend and never even instantiate the frontend TargetInfo. If we did,
860 // and used its handleTargetFeatures hook, then we could ensure the
861 // assembler and the frontend behave the same.
862
863 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000864 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000865 Features.push_back("+soft-float");
866
867 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000869 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000870 } else {
871 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
872 // to the assembler correctly.
873 for (const Arg *A :
874 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
875 StringRef Value = A->getValue();
876 if (Value.startswith("-mfpu=")) {
877 WaFPU = A;
878 } else if (Value.startswith("-mcpu=")) {
879 WaCPU = A;
880 } else if (Value.startswith("-mhwdiv=")) {
881 WaHDiv = A;
882 } else if (Value.startswith("-march=")) {
883 WaArch = A;
884 }
885 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000886 }
887
Renato Golin7c542b42015-07-27 23:44:45 +0000888 // Check -march. ClangAs gives preference to -Wa,-march=.
889 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000890 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000891 if (WaArch) {
892 if (ArchArg)
893 D.Diag(clang::diag::warn_drv_unused_argument)
894 << ArchArg->getAsString(Args);
895 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000896 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000897 // FIXME: Set Arch.
898 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
899 } else if (ArchArg) {
900 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000901 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000902 }
903
Renato Golin7c542b42015-07-27 23:44:45 +0000904 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
905 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000906 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000907 if (WaCPU) {
908 if (CPUArg)
909 D.Diag(clang::diag::warn_drv_unused_argument)
910 << CPUArg->getAsString(Args);
911 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000912 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000913 } else if (CPUArg) {
914 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000915 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000916 }
John Brawna95c1a82015-05-08 12:52:18 +0000917
Renato Golin23459c62015-07-30 16:40:17 +0000918 // Add CPU features for generic CPUs
919 if (CPUName == "native") {
920 llvm::StringMap<bool> HostFeatures;
921 if (llvm::sys::getHostCPUFeatures(HostFeatures))
922 for (auto &F : HostFeatures)
923 Features.push_back(
924 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
925 }
926
927 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
928 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
929 if (WaFPU) {
930 if (FPUArg)
931 D.Diag(clang::diag::warn_drv_unused_argument)
932 << FPUArg->getAsString(Args);
933 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
934 Features);
935 } else if (FPUArg) {
936 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
937 }
938
939 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
940 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
941 if (WaHDiv) {
942 if (HDivArg)
943 D.Diag(clang::diag::warn_drv_unused_argument)
944 << HDivArg->getAsString(Args);
945 getARMHWDivFeatures(D, WaHDiv, Args,
946 StringRef(WaHDiv->getValue()).substr(8), Features);
947 } else if (HDivArg)
948 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
949
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000950 // Setting -msoft-float effectively disables NEON because of the GCC
951 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000952 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000953 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000954 // Also need to explicitly disable features which imply NEON.
955 Features.push_back("-crypto");
956 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000957
Eric Christopher269c2a22015-04-04 03:34:43 +0000958 // En/disable crc code generation.
959 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000960 if (A->getOption().matches(options::OPT_mcrc))
961 Features.push_back("+crc");
962 else
963 Features.push_back("-crc");
964 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000965
Akira Hatanakac2694822015-07-07 08:28:42 +0000966 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
967 // neither options are specified, see if we are compiling for kernel/kext and
968 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000969 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
970 options::OPT_mno_long_calls)) {
971 if (A->getOption().matches(options::OPT_mlong_calls))
972 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000973 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
974 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000975 Features.push_back("+long-calls");
976 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000977
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 // Kernel code has more strict alignment requirements.
979 if (KernelOrKext)
980 Features.push_back("+strict-align");
981 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
982 options::OPT_munaligned_access)) {
983 if (A->getOption().matches(options::OPT_munaligned_access)) {
984 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
985 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
986 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000987 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
988 // access either.
989 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
990 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000991 } else
992 Features.push_back("+strict-align");
993 } else {
994 // Assume pre-ARMv6 doesn't support unaligned accesses.
995 //
996 // ARMv6 may or may not support unaligned accesses depending on the
997 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
998 // Darwin and NetBSD targets support unaligned accesses, and others don't.
999 //
1000 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
1001 // which raises an alignment fault on unaligned accesses. Linux
1002 // defaults this bit to 0 and handles it as a system-wide (not
1003 // per-process) setting. It is therefore safe to assume that ARMv7+
1004 // Linux targets support unaligned accesses. The same goes for NaCl.
1005 //
1006 // The above behavior is consistent with GCC.
1007 int VersionNum = getARMSubArchVersionNumber(Triple);
1008 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +00001009 if (VersionNum < 6 ||
1010 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +00001011 Features.push_back("+strict-align");
1012 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1013 if (VersionNum < 7)
1014 Features.push_back("+strict-align");
1015 } else
1016 Features.push_back("+strict-align");
1017 }
1018
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001019 // llvm does not support reserving registers in general. There is support
1020 // for reserving r9 on ARM though (defined as a platform-specific register
1021 // in ARM EABI).
1022 if (Args.hasArg(options::OPT_ffixed_r9))
1023 Features.push_back("+reserve-r9");
1024
Dimitry Andric08107392016-01-06 07:42:18 +00001025 // The kext linker doesn't know how to deal with movw/movt.
1026 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001027 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001028}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001029
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001030void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1031 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001032 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001033 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001034 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001035 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001037 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001038 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001039 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001040 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001041 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001042 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001043 } else {
1044 ABIName = "apcs-gnu";
1045 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001046 } else if (Triple.isOSWindows()) {
1047 // FIXME: this is invalid for WindowsCE
1048 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001049 } else {
1050 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001051 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001052 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001053 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001054 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001055 ABIName = "aapcs-linux";
1056 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001057 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001058 case llvm::Triple::EABI:
1059 ABIName = "aapcs";
1060 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001061 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001062 if (Triple.getOS() == llvm::Triple::NetBSD)
1063 ABIName = "apcs-gnu";
1064 else
1065 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001066 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001067 }
1068 }
1069 CmdArgs.push_back("-target-abi");
1070 CmdArgs.push_back(ABIName);
1071
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001072 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001073 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001074 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001075 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001077 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001078 CmdArgs.push_back("-mfloat-abi");
1079 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001080 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001081 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001082 CmdArgs.push_back("-mfloat-abi");
1083 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001084 } else {
1085 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001086 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001087 CmdArgs.push_back("-mfloat-abi");
1088 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001089 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001090
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001092 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1093 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001094 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001095 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001096 CmdArgs.push_back("-arm-global-merge=false");
1097 else
1098 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001099 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001100
Bob Wilson9c8af452013-04-11 18:53:25 +00001101 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001102 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001103 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001104}
Renato Goline17c5802015-07-27 23:44:42 +00001105// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001106
Tim Northover573cbee2014-05-24 12:52:07 +00001107/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1108/// targeting.
1109static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001110 Arg *A;
1111 std::string CPU;
1112 // If we have -mtune or -mcpu, use that.
1113 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001114 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001115 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001116 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001117 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001118 }
1119
Kevin Qin110db6f2014-07-18 07:03:22 +00001120 // Handle CPU name is 'native'.
1121 if (CPU == "native")
1122 return llvm::sys::getHostCPUName();
1123 else if (CPU.size())
1124 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001125
James Molloy9b1586b2014-04-17 12:51:17 +00001126 // Make sure we pick "cyclone" if -arch is used.
1127 // FIXME: Should this be picked by checking the target triple instead?
1128 if (Args.getLastArg(options::OPT_arch))
1129 return "cyclone";
1130
1131 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001132}
1133
Tim Northover573cbee2014-05-24 12:52:07 +00001134void Clang::AddAArch64TargetArgs(const ArgList &Args,
1135 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1137 llvm::Triple Triple(TripleStr);
1138
1139 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1140 Args.hasArg(options::OPT_mkernel) ||
1141 Args.hasArg(options::OPT_fapple_kext))
1142 CmdArgs.push_back("-disable-red-zone");
1143
1144 if (!Args.hasFlag(options::OPT_mimplicit_float,
1145 options::OPT_mno_implicit_float, true))
1146 CmdArgs.push_back("-no-implicit-float");
1147
Craig Topper92fc2df2014-05-17 16:56:41 +00001148 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001149 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1150 ABIName = A->getValue();
1151 else if (Triple.isOSDarwin())
1152 ABIName = "darwinpcs";
1153 else
1154 ABIName = "aapcs";
1155
1156 CmdArgs.push_back("-target-abi");
1157 CmdArgs.push_back(ABIName);
1158
Bradley Smith9ff64332014-10-13 10:16:06 +00001159 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1160 options::OPT_mno_fix_cortex_a53_835769)) {
1161 CmdArgs.push_back("-backend-option");
1162 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1163 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1164 else
1165 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001166 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001167 // Enabled A53 errata (835769) workaround by default on android
1168 CmdArgs.push_back("-backend-option");
1169 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001170 }
1171
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001172 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001173 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1174 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001175 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001176 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001177 CmdArgs.push_back("-aarch64-global-merge=false");
1178 else
1179 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001180 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001181}
1182
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001183// Get CPU and ABI names. They are not independent
1184// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001185void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1186 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001187 const char *DefMips32CPU = "mips32r2";
1188 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001189
Daniel Sanders2bf13662014-07-10 14:40:57 +00001190 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1191 // default for mips64(el)?-img-linux-gnu.
1192 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1193 Triple.getEnvironment() == llvm::Triple::GNU) {
1194 DefMips32CPU = "mips32r6";
1195 DefMips64CPU = "mips64r6";
1196 }
Renato Golin7c542b42015-07-27 23:44:45 +00001197
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001198 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Petar Jovanovic009494f2016-05-17 10:46:10 +00001199 if (Triple.isAndroid()) {
1200 DefMips32CPU = "mips32";
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001201 DefMips64CPU = "mips64r6";
Petar Jovanovic009494f2016-05-17 10:46:10 +00001202 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00001203
Brad Smithba26f582015-01-06 02:53:17 +00001204 // MIPS3 is the default for mips64*-unknown-openbsd.
1205 if (Triple.getOS() == llvm::Triple::OpenBSD)
1206 DefMips64CPU = "mips3";
1207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001208 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001209 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001210
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001211 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001212 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001213 // Convert a GNU style Mips ABI name to the name
1214 // accepted by LLVM Mips backend.
1215 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001216 .Case("32", "o32")
1217 .Case("64", "n64")
1218 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001219 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001220
1221 // Setup default CPU and ABI names.
1222 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001223 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001224 default:
1225 llvm_unreachable("Unexpected triple arch name");
1226 case llvm::Triple::mips:
1227 case llvm::Triple::mipsel:
1228 CPUName = DefMips32CPU;
1229 break;
1230 case llvm::Triple::mips64:
1231 case llvm::Triple::mips64el:
1232 CPUName = DefMips64CPU;
1233 break;
1234 }
1235 }
1236
Daniel Sanders0ca86fe2016-06-06 12:02:21 +00001237 if (ABIName.empty() &&
1238 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
1239 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
1240 ABIName = llvm::StringSwitch<const char *>(CPUName)
1241 .Case("mips1", "o32")
1242 .Case("mips2", "o32")
1243 .Case("mips3", "n64")
1244 .Case("mips4", "n64")
1245 .Case("mips5", "n64")
1246 .Case("mips32", "o32")
1247 .Case("mips32r2", "o32")
1248 .Case("mips32r3", "o32")
1249 .Case("mips32r5", "o32")
1250 .Case("mips32r6", "o32")
1251 .Case("mips64", "n64")
1252 .Case("mips64r2", "n64")
1253 .Case("mips64r3", "n64")
1254 .Case("mips64r5", "n64")
1255 .Case("mips64r6", "n64")
1256 .Case("octeon", "n64")
1257 .Case("p5600", "o32")
1258 .Default("");
1259 }
1260
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001261 if (ABIName.empty()) {
1262 // Deduce ABI name from the target triple.
1263 if (Triple.getArch() == llvm::Triple::mips ||
1264 Triple.getArch() == llvm::Triple::mipsel)
1265 ABIName = "o32";
1266 else
1267 ABIName = "n64";
1268 }
1269
1270 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001271 // Deduce CPU name from ABI name.
1272 CPUName = llvm::StringSwitch<const char *>(ABIName)
Daniel Sanders07c86542016-05-27 14:30:23 +00001273 .Case("o32", DefMips32CPU)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 .Cases("n32", "n64", DefMips64CPU)
1275 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001276 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001277
1278 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001279}
1280
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001281std::string mips::getMipsABILibSuffix(const ArgList &Args,
1282 const llvm::Triple &Triple) {
1283 StringRef CPUName, ABIName;
1284 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1285 return llvm::StringSwitch<std::string>(ABIName)
1286 .Case("o32", "")
1287 .Case("n32", "32")
1288 .Case("n64", "64");
1289}
1290
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001291// Convert ABI name to the GNU tools acceptable variant.
1292static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1293 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001294 .Case("o32", "32")
1295 .Case("n64", "64")
1296 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001297}
1298
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001299// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1300// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001301static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1302 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001303 if (Arg *A =
1304 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1305 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001306 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001307 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001308 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001309 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001310 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001311 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1312 .Case("soft", mips::FloatABI::Soft)
1313 .Case("hard", mips::FloatABI::Hard)
1314 .Default(mips::FloatABI::Invalid);
1315 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001317 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001318 }
1319 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001320 }
1321
1322 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001323 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 // Assume "hard", because it's a default value used by gcc.
1325 // When we start to recognize specific target MIPS processors,
1326 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001327 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001328 }
1329
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001330 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1331 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001332}
1333
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001334static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001335 std::vector<const char *> &Features,
1336 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001337 StringRef FeatureName) {
1338 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001339 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001340 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001341 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001343 }
1344}
1345
Daniel Sanders379d44b2014-07-16 11:52:23 +00001346static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1347 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001348 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001349 StringRef CPUName;
1350 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001351 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001352 ABIName = getGnuCompatibleMipsABIName(ABIName);
1353
Daniel Sandersfeb61302014-08-08 15:47:17 +00001354 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1355 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001356
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001357 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1358 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359 // FIXME: Note, this is a hack. We need to pass the selected float
1360 // mode to the MipsTargetInfoBase to define appropriate macros there.
1361 // Now it is the only method.
1362 Features.push_back("+soft-float");
1363 }
1364
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001365 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001366 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001367 if (Val == "2008") {
1368 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1369 Features.push_back("+nan2008");
1370 else {
1371 Features.push_back("-nan2008");
1372 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1373 }
1374 } else if (Val == "legacy") {
1375 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1376 Features.push_back("-nan2008");
1377 else {
1378 Features.push_back("+nan2008");
1379 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1380 }
1381 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001382 D.Diag(diag::err_drv_unsupported_option_argument)
1383 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001384 }
1385
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001386 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1387 options::OPT_mdouble_float, "single-float");
1388 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1389 "mips16");
1390 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1391 options::OPT_mno_micromips, "micromips");
1392 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1393 "dsp");
1394 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1395 "dspr2");
1396 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1397 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001398
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001399 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32
1400 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and
1401 // nooddspreg.
Daniel Sanders379d44b2014-07-16 11:52:23 +00001402 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1403 options::OPT_mfp64)) {
1404 if (A->getOption().matches(options::OPT_mfp32))
1405 Features.push_back(Args.MakeArgString("-fp64"));
1406 else if (A->getOption().matches(options::OPT_mfpxx)) {
1407 Features.push_back(Args.MakeArgString("+fpxx"));
1408 Features.push_back(Args.MakeArgString("+nooddspreg"));
1409 } else
1410 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001411 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001412 Features.push_back(Args.MakeArgString("+fpxx"));
1413 Features.push_back(Args.MakeArgString("+nooddspreg"));
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001414 } else if (mips::isFP64ADefault(Triple, CPUName)) {
1415 Features.push_back(Args.MakeArgString("+fp64"));
1416 Features.push_back(Args.MakeArgString("+nooddspreg"));
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001417 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001418
Daniel Sanders28e5d392014-07-10 10:39:51 +00001419 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1420 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001421}
1422
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001423void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001424 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001425 const Driver &D = getToolChain().getDriver();
1426 StringRef CPUName;
1427 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001428 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001429 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001430
1431 CmdArgs.push_back("-target-abi");
1432 CmdArgs.push_back(ABIName.data());
1433
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001434 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1435 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001436 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001437 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001438 CmdArgs.push_back("-mfloat-abi");
1439 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001440 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001441 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001442 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001443 CmdArgs.push_back("-mfloat-abi");
1444 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001445 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001446
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001447 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1448 if (A->getOption().matches(options::OPT_mxgot)) {
1449 CmdArgs.push_back("-mllvm");
1450 CmdArgs.push_back("-mxgot");
1451 }
1452 }
1453
Simon Atanasyanc580b322013-05-11 06:33:44 +00001454 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1455 options::OPT_mno_ldc1_sdc1)) {
1456 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1457 CmdArgs.push_back("-mllvm");
1458 CmdArgs.push_back("-mno-ldc1-sdc1");
1459 }
1460 }
1461
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001462 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1463 options::OPT_mno_check_zero_division)) {
1464 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1465 CmdArgs.push_back("-mllvm");
1466 CmdArgs.push_back("-mno-check-zero-division");
1467 }
1468 }
1469
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001470 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001471 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001472 CmdArgs.push_back("-mllvm");
1473 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1474 A->claim();
1475 }
Simon Dardisd0e83ba2016-05-27 15:13:31 +00001476
1477 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
1478 StringRef Val = StringRef(A->getValue());
1479 if (mips::hasCompactBranches(CPUName)) {
1480 if (Val == "never" || Val == "always" || Val == "optimal") {
1481 CmdArgs.push_back("-mllvm");
1482 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val));
1483 } else
1484 D.Diag(diag::err_drv_unsupported_option_argument)
1485 << A->getOption().getName() << Val;
1486 } else
1487 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
1488 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001489}
1490
Hal Finkel8eb59282012-06-11 22:35:19 +00001491/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1492static std::string getPPCTargetCPU(const ArgList &Args) {
1493 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001494 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001495
1496 if (CPUName == "native") {
1497 std::string CPU = llvm::sys::getHostCPUName();
1498 if (!CPU.empty() && CPU != "generic")
1499 return CPU;
1500 else
1501 return "";
1502 }
1503
1504 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 .Case("common", "generic")
1506 .Case("440", "440")
1507 .Case("440fp", "440")
1508 .Case("450", "450")
1509 .Case("601", "601")
1510 .Case("602", "602")
1511 .Case("603", "603")
1512 .Case("603e", "603e")
1513 .Case("603ev", "603ev")
1514 .Case("604", "604")
1515 .Case("604e", "604e")
1516 .Case("620", "620")
1517 .Case("630", "pwr3")
1518 .Case("G3", "g3")
1519 .Case("7400", "7400")
1520 .Case("G4", "g4")
1521 .Case("7450", "7450")
1522 .Case("G4+", "g4+")
1523 .Case("750", "750")
1524 .Case("970", "970")
1525 .Case("G5", "g5")
1526 .Case("a2", "a2")
1527 .Case("a2q", "a2q")
1528 .Case("e500mc", "e500mc")
1529 .Case("e5500", "e5500")
1530 .Case("power3", "pwr3")
1531 .Case("power4", "pwr4")
1532 .Case("power5", "pwr5")
1533 .Case("power5x", "pwr5x")
1534 .Case("power6", "pwr6")
1535 .Case("power6x", "pwr6x")
1536 .Case("power7", "pwr7")
1537 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001538 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 .Case("pwr3", "pwr3")
1540 .Case("pwr4", "pwr4")
1541 .Case("pwr5", "pwr5")
1542 .Case("pwr5x", "pwr5x")
1543 .Case("pwr6", "pwr6")
1544 .Case("pwr6x", "pwr6x")
1545 .Case("pwr7", "pwr7")
1546 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001547 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001548 .Case("powerpc", "ppc")
1549 .Case("powerpc64", "ppc64")
1550 .Case("powerpc64le", "ppc64le")
1551 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001552 }
1553
1554 return "";
1555}
1556
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001557static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1558 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001559 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001560 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001561
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001562 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1563 if (FloatABI == ppc::FloatABI::Soft &&
1564 !(Triple.getArch() == llvm::Triple::ppc64 ||
1565 Triple.getArch() == llvm::Triple::ppc64le))
1566 Features.push_back("+soft-float");
1567 else if (FloatABI == ppc::FloatABI::Soft &&
1568 (Triple.getArch() == llvm::Triple::ppc64 ||
1569 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001570 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001571 << "soft float is not supported for ppc64";
1572
Eric Christopher643bb6a2013-10-16 20:40:08 +00001573 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001574 AddTargetFeature(Args, Features, options::OPT_faltivec,
1575 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001576}
1577
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001578ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1579 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1580 if (Arg *A =
1581 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1582 options::OPT_mfloat_abi_EQ)) {
1583 if (A->getOption().matches(options::OPT_msoft_float))
1584 ABI = ppc::FloatABI::Soft;
1585 else if (A->getOption().matches(options::OPT_mhard_float))
1586 ABI = ppc::FloatABI::Hard;
1587 else {
1588 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1589 .Case("soft", ppc::FloatABI::Soft)
1590 .Case("hard", ppc::FloatABI::Hard)
1591 .Default(ppc::FloatABI::Invalid);
1592 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1593 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1594 ABI = ppc::FloatABI::Hard;
1595 }
1596 }
1597 }
1598
1599 // If unspecified, choose the default based on the platform.
1600 if (ABI == ppc::FloatABI::Invalid) {
1601 ABI = ppc::FloatABI::Hard;
1602 }
1603
1604 return ABI;
1605}
1606
Ulrich Weigand8afad612014-07-28 13:17:52 +00001607void Clang::AddPPCTargetArgs(const ArgList &Args,
1608 ArgStringList &CmdArgs) const {
1609 // Select the ABI to use.
1610 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001611 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001612 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001613 case llvm::Triple::ppc64: {
1614 // When targeting a processor that supports QPX, or if QPX is
1615 // specifically enabled, default to using the ABI that supports QPX (so
1616 // long as it is not specifically disabled).
1617 bool HasQPX = false;
1618 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1619 HasQPX = A->getValue() == StringRef("a2q");
1620 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1621 if (HasQPX) {
1622 ABIName = "elfv1-qpx";
1623 break;
1624 }
1625
Ulrich Weigand8afad612014-07-28 13:17:52 +00001626 ABIName = "elfv1";
1627 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001628 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001629 case llvm::Triple::ppc64le:
1630 ABIName = "elfv2";
1631 break;
1632 default:
1633 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001634 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001635
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001636 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1637 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1638 // the option if given as we don't have backend support for any targets
1639 // that don't use the altivec abi.
1640 if (StringRef(A->getValue()) != "altivec")
1641 ABIName = A->getValue();
1642
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001643 ppc::FloatABI FloatABI =
1644 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1645
1646 if (FloatABI == ppc::FloatABI::Soft) {
1647 // Floating point operations and argument passing are soft.
1648 CmdArgs.push_back("-msoft-float");
1649 CmdArgs.push_back("-mfloat-abi");
1650 CmdArgs.push_back("soft");
1651 } else {
1652 // Floating point operations and argument passing are hard.
1653 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1654 CmdArgs.push_back("-mfloat-abi");
1655 CmdArgs.push_back("hard");
1656 }
1657
Ulrich Weigand8afad612014-07-28 13:17:52 +00001658 if (ABIName) {
1659 CmdArgs.push_back("-target-abi");
1660 CmdArgs.push_back(ABIName);
1661 }
1662}
1663
1664bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1665 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1666 return A && (A->getValue() == StringRef(Value));
1667}
1668
Tom Stellard6674c702013-04-01 20:56:53 +00001669/// Get the (LLVM) name of the R600 gpu we are targeting.
1670static std::string getR600TargetGPU(const ArgList &Args) {
1671 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001672 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001673 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 .Cases("rv630", "rv635", "r600")
1675 .Cases("rv610", "rv620", "rs780", "rs880")
1676 .Case("rv740", "rv770")
1677 .Case("palm", "cedar")
1678 .Cases("sumo", "sumo2", "sumo")
1679 .Case("hemlock", "cypress")
1680 .Case("aruba", "cayman")
1681 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001682 }
1683 return "";
1684}
1685
Jacques Pienaard964cc22016-03-28 21:02:54 +00001686static std::string getLanaiTargetCPU(const ArgList &Args) {
1687 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1688 return A->getValue();
1689 }
1690 return "";
1691}
1692
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001693sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1694 const ArgList &Args) {
1695 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1696 if (Arg *A =
1697 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1698 options::OPT_mfloat_abi_EQ)) {
1699 if (A->getOption().matches(options::OPT_msoft_float))
1700 ABI = sparc::FloatABI::Soft;
1701 else if (A->getOption().matches(options::OPT_mhard_float))
1702 ABI = sparc::FloatABI::Hard;
1703 else {
1704 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1705 .Case("soft", sparc::FloatABI::Soft)
1706 .Case("hard", sparc::FloatABI::Hard)
1707 .Default(sparc::FloatABI::Invalid);
1708 if (ABI == sparc::FloatABI::Invalid &&
1709 !StringRef(A->getValue()).empty()) {
1710 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1711 ABI = sparc::FloatABI::Hard;
1712 }
1713 }
1714 }
1715
1716 // If unspecified, choose the default based on the platform.
1717 // Only the hard-float ABI on Sparc is standardized, and it is the
1718 // default. GCC also supports a nonstandard soft-float ABI mode, also
1719 // implemented in LLVM. However as this is not standard we set the default
1720 // to be hard-float.
1721 if (ABI == sparc::FloatABI::Invalid) {
1722 ABI = sparc::FloatABI::Hard;
1723 }
1724
1725 return ABI;
1726}
1727
1728static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1729 std::vector<const char *> &Features) {
1730 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1731 if (FloatABI == sparc::FloatABI::Soft)
1732 Features.push_back("+soft-float");
1733}
1734
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001735void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001736 ArgStringList &CmdArgs) const {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001737 //const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001738 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001739
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001740 sparc::FloatABI FloatABI =
1741 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001742
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001743 if (FloatABI == sparc::FloatABI::Soft) {
1744 // Floating point operations and argument passing are soft.
1745 CmdArgs.push_back("-msoft-float");
1746 CmdArgs.push_back("-mfloat-abi");
1747 CmdArgs.push_back("soft");
1748 } else {
1749 // Floating point operations and argument passing are hard.
1750 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1751 CmdArgs.push_back("-mfloat-abi");
1752 CmdArgs.push_back("hard");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001753 }
1754}
1755
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001756void Clang::AddSystemZTargetArgs(const ArgList &Args,
1757 ArgStringList &CmdArgs) const {
1758 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1759 CmdArgs.push_back("-mbackchain");
1760}
1761
Richard Sandiford4652d892013-07-19 16:51:51 +00001762static const char *getSystemZTargetCPU(const ArgList &Args) {
1763 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1764 return A->getValue();
1765 return "z10";
1766}
1767
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001768static void getSystemZTargetFeatures(const ArgList &Args,
1769 std::vector<const char *> &Features) {
1770 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001771 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001772 if (A->getOption().matches(options::OPT_mhtm))
1773 Features.push_back("+transactional-execution");
1774 else
1775 Features.push_back("-transactional-execution");
1776 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001777 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001778 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001779 if (A->getOption().matches(options::OPT_mvx))
1780 Features.push_back("+vector");
1781 else
1782 Features.push_back("-vector");
1783 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001784}
1785
Chandler Carruth953fb082013-01-13 11:46:33 +00001786static const char *getX86TargetCPU(const ArgList &Args,
1787 const llvm::Triple &Triple) {
1788 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001789 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001790 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001791 return "core-avx2";
1792
Chandler Carruth953fb082013-01-13 11:46:33 +00001793 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001794 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001795
1796 // FIXME: Reject attempts to use -march=native unless the target matches
1797 // the host.
1798 //
1799 // FIXME: We should also incorporate the detected target features for use
1800 // with -native.
1801 std::string CPU = llvm::sys::getHostCPUName();
1802 if (!CPU.empty() && CPU != "generic")
1803 return Args.MakeArgString(CPU);
1804 }
1805
Reid Kleckner3123eff2015-06-30 16:32:04 +00001806 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1807 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1808 StringRef Arch = A->getValue();
1809 const char *CPU;
1810 if (Triple.getArch() == llvm::Triple::x86) {
1811 CPU = llvm::StringSwitch<const char *>(Arch)
1812 .Case("IA32", "i386")
1813 .Case("SSE", "pentium3")
1814 .Case("SSE2", "pentium4")
1815 .Case("AVX", "sandybridge")
1816 .Case("AVX2", "haswell")
1817 .Default(nullptr);
1818 } else {
1819 CPU = llvm::StringSwitch<const char *>(Arch)
1820 .Case("AVX", "sandybridge")
1821 .Case("AVX2", "haswell")
1822 .Default(nullptr);
1823 }
1824 if (CPU)
1825 return CPU;
1826 }
1827
Chandler Carruth953fb082013-01-13 11:46:33 +00001828 // Select the default CPU if none was given (or detection failed).
1829
1830 if (Triple.getArch() != llvm::Triple::x86_64 &&
1831 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001832 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001833
1834 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1835
1836 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001837 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001838 if (Triple.getArchName() == "x86_64h")
1839 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001840 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001841 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001842
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001843 // Set up default CPU name for PS4 compilers.
1844 if (Triple.isPS4CPU())
1845 return "btver2";
1846
Alexey Bataev286d1b92014-01-31 04:07:13 +00001847 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001848 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001849 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001850
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001851 // Everything else goes to x86-64 in 64-bit mode.
1852 if (Is64Bit)
1853 return "x86-64";
1854
1855 switch (Triple.getOS()) {
1856 case llvm::Triple::FreeBSD:
1857 case llvm::Triple::NetBSD:
1858 case llvm::Triple::OpenBSD:
1859 return "i486";
1860 case llvm::Triple::Haiku:
1861 return "i586";
1862 case llvm::Triple::Bitrig:
1863 return "i686";
1864 default:
1865 // Fallback to p4.
1866 return "pentium4";
1867 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001868}
1869
Dan Gohmanc2853072015-09-03 22:51:53 +00001870/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1871static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1872 // If we have -mcpu=, use that.
1873 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1874 StringRef CPU = A->getValue();
1875
1876#ifdef __wasm__
1877 // Handle "native" by examining the host. "native" isn't meaningful when
1878 // cross compiling, so only support this when the host is also WebAssembly.
1879 if (CPU == "native")
1880 return llvm::sys::getHostCPUName();
1881#endif
1882
1883 return CPU;
1884 }
1885
1886 return "generic";
1887}
1888
Renato Golin7c542b42015-07-27 23:44:45 +00001889static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1890 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001892 default:
1893 return "";
1894
Amara Emerson703da2e2013-10-31 09:32:33 +00001895 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001896 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001897 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001898
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001899 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001900 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001901 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001902 case llvm::Triple::thumbeb: {
1903 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001904 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001905 return arm::getARMTargetCPU(MCPU, MArch, T);
1906 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001907 case llvm::Triple::mips:
1908 case llvm::Triple::mipsel:
1909 case llvm::Triple::mips64:
1910 case llvm::Triple::mips64el: {
1911 StringRef CPUName;
1912 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001913 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001914 return CPUName;
1915 }
1916
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001917 case llvm::Triple::nvptx:
1918 case llvm::Triple::nvptx64:
1919 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1920 return A->getValue();
1921 return "";
1922
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001923 case llvm::Triple::ppc:
1924 case llvm::Triple::ppc64:
1925 case llvm::Triple::ppc64le: {
1926 std::string TargetCPUName = getPPCTargetCPU(Args);
1927 // LLVM may default to generating code for the native CPU,
1928 // but, like gcc, we default to a more generic option for
1929 // each architecture. (except on Darwin)
1930 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1931 if (T.getArch() == llvm::Triple::ppc64)
1932 TargetCPUName = "ppc64";
1933 else if (T.getArch() == llvm::Triple::ppc64le)
1934 TargetCPUName = "ppc64le";
1935 else
1936 TargetCPUName = "ppc";
1937 }
1938 return TargetCPUName;
1939 }
1940
1941 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001942 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001943 case llvm::Triple::sparcv9:
1944 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001945 return A->getValue();
1946 return "";
1947
1948 case llvm::Triple::x86:
1949 case llvm::Triple::x86_64:
1950 return getX86TargetCPU(Args, T);
1951
1952 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001953 return "hexagon" +
1954 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001955
Jacques Pienaard964cc22016-03-28 21:02:54 +00001956 case llvm::Triple::lanai:
1957 return getLanaiTargetCPU(Args);
1958
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001959 case llvm::Triple::systemz:
1960 return getSystemZTargetCPU(Args);
1961
1962 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001963 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001964 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001965
1966 case llvm::Triple::wasm32:
1967 case llvm::Triple::wasm64:
1968 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001969 }
1970}
1971
Alp Tokerce365ca2013-12-02 12:43:03 +00001972static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001973 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001974 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1975 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1976 // forward.
1977 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001978 std::string Plugin =
1979 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001980 CmdArgs.push_back(Args.MakeArgString(Plugin));
1981
1982 // Try to pass driver level flags relevant to LTO code generation down to
1983 // the plugin.
1984
1985 // Handle flags for selecting CPU variants.
1986 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1987 if (!CPU.empty())
1988 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001989
James Molloyf97fdae2015-12-21 10:44:36 +00001990 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1991 StringRef OOpt;
1992 if (A->getOption().matches(options::OPT_O4) ||
1993 A->getOption().matches(options::OPT_Ofast))
1994 OOpt = "3";
1995 else if (A->getOption().matches(options::OPT_O))
1996 OOpt = A->getValue();
1997 else if (A->getOption().matches(options::OPT_O0))
1998 OOpt = "0";
1999 if (!OOpt.empty())
2000 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
2001 }
2002
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00002003 if (IsThinLTO)
2004 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00002005
2006 // If an explicit debugger tuning argument appeared, pass it along.
2007 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
2008 options::OPT_ggdbN_Group)) {
2009 if (A->getOption().matches(options::OPT_glldb))
2010 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
2011 else if (A->getOption().matches(options::OPT_gsce))
2012 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
2013 else
2014 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
2015 }
Alp Tokerce365ca2013-12-02 12:43:03 +00002016}
2017
Sanjay Patel2987c292015-06-11 14:53:41 +00002018/// This is a helper function for validating the optional refinement step
2019/// parameter in reciprocal argument strings. Return false if there is an error
2020/// parsing the refinement step. Otherwise, return true and set the Position
2021/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00002022static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002023 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00002024 const char RefinementStepToken = ':';
2025 Position = In.find(RefinementStepToken);
2026 if (Position != StringRef::npos) {
2027 StringRef Option = A.getOption().getName();
2028 StringRef RefStep = In.substr(Position + 1);
2029 // Allow exactly one numeric character for the additional refinement
2030 // step parameter. This is reasonable for all currently-supported
2031 // operations and architectures because we would expect that a larger value
2032 // of refinement steps would cause the estimate "optimization" to
2033 // under-perform the native operation. Also, if the estimate does not
2034 // converge quickly, it probably will not ever converge, so further
2035 // refinement steps will not produce a better answer.
2036 if (RefStep.size() != 1) {
2037 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2038 return false;
2039 }
2040 char RefStepChar = RefStep[0];
2041 if (RefStepChar < '0' || RefStepChar > '9') {
2042 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2043 return false;
2044 }
2045 }
2046 return true;
2047}
2048
2049/// The -mrecip flag requires processing of many optional parameters.
2050static void ParseMRecip(const Driver &D, const ArgList &Args,
2051 ArgStringList &OutStrings) {
2052 StringRef DisabledPrefixIn = "!";
2053 StringRef DisabledPrefixOut = "!";
2054 StringRef EnabledPrefixOut = "";
2055 StringRef Out = "-mrecip=";
2056
2057 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2058 if (!A)
2059 return;
2060
2061 unsigned NumOptions = A->getNumValues();
2062 if (NumOptions == 0) {
2063 // No option is the same as "all".
2064 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2065 return;
2066 }
2067
2068 // Pass through "all", "none", or "default" with an optional refinement step.
2069 if (NumOptions == 1) {
2070 StringRef Val = A->getValue(0);
2071 size_t RefStepLoc;
2072 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2073 return;
2074 StringRef ValBase = Val.slice(0, RefStepLoc);
2075 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2076 OutStrings.push_back(Args.MakeArgString(Out + Val));
2077 return;
2078 }
2079 }
2080
2081 // Each reciprocal type may be enabled or disabled individually.
2082 // Check each input value for validity, concatenate them all back together,
2083 // and pass through.
2084
2085 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002086 OptionStrings.insert(std::make_pair("divd", false));
2087 OptionStrings.insert(std::make_pair("divf", false));
2088 OptionStrings.insert(std::make_pair("vec-divd", false));
2089 OptionStrings.insert(std::make_pair("vec-divf", false));
2090 OptionStrings.insert(std::make_pair("sqrtd", false));
2091 OptionStrings.insert(std::make_pair("sqrtf", false));
2092 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2093 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00002094
2095 for (unsigned i = 0; i != NumOptions; ++i) {
2096 StringRef Val = A->getValue(i);
2097
2098 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2099 // Ignore the disablement token for string matching.
2100 if (IsDisabled)
2101 Val = Val.substr(1);
2102
2103 size_t RefStep;
2104 if (!getRefinementStep(Val, D, *A, RefStep))
2105 return;
2106
2107 StringRef ValBase = Val.slice(0, RefStep);
2108 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2109 if (OptionIter == OptionStrings.end()) {
2110 // Try again specifying float suffix.
2111 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2112 if (OptionIter == OptionStrings.end()) {
2113 // The input name did not match any known option string.
2114 D.Diag(diag::err_drv_unknown_argument) << Val;
2115 return;
2116 }
2117 // The option was specified without a float or double suffix.
2118 // Make sure that the double entry was not already specified.
2119 // The float entry will be checked below.
2120 if (OptionStrings[ValBase.str() + 'd']) {
2121 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2122 return;
2123 }
2124 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002125
Sanjay Patel2987c292015-06-11 14:53:41 +00002126 if (OptionIter->second == true) {
2127 // Duplicate option specified.
2128 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2129 return;
2130 }
2131
2132 // Mark the matched option as found. Do not allow duplicate specifiers.
2133 OptionIter->second = true;
2134
2135 // If the precision was not specified, also mark the double entry as found.
2136 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2137 OptionStrings[ValBase.str() + 'd'] = true;
2138
2139 // Build the output string.
2140 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2141 Out = Args.MakeArgString(Out + Prefix + Val);
2142 if (i != NumOptions - 1)
2143 Out = Args.MakeArgString(Out + ",");
2144 }
2145
2146 OutStrings.push_back(Args.MakeArgString(Out));
2147}
2148
Eric Christopherc54920a2015-03-23 19:26:05 +00002149static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002150 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002151 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002152 // If -march=native, autodetect the feature list.
2153 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2154 if (StringRef(A->getValue()) == "native") {
2155 llvm::StringMap<bool> HostFeatures;
2156 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2157 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002158 Features.push_back(
2159 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002160 }
2161 }
2162
Jim Grosbach82eee262013-11-16 00:53:35 +00002163 if (Triple.getArchName() == "x86_64h") {
2164 // x86_64h implies quite a few of the more modern subtarget features
2165 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2166 Features.push_back("-rdrnd");
2167 Features.push_back("-aes");
2168 Features.push_back("-pclmul");
2169 Features.push_back("-rtm");
2170 Features.push_back("-hle");
2171 Features.push_back("-fsgsbase");
2172 }
2173
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002174 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002175 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002176 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002177 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002178 Features.push_back("+sse4.2");
2179 Features.push_back("+popcnt");
2180 } else
2181 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002182 }
2183
Eric Christopherc54920a2015-03-23 19:26:05 +00002184 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002185 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2186 StringRef Arch = A->getValue();
2187 bool ArchUsed = false;
2188 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002189 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002190 if (Arch == "AVX" || Arch == "AVX2") {
2191 ArchUsed = true;
2192 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2193 }
2194 }
2195 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002196 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002197 if (Arch == "IA32") {
2198 ArchUsed = true;
2199 } else if (Arch == "SSE" || Arch == "SSE2") {
2200 ArchUsed = true;
2201 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2202 }
2203 }
2204 if (!ArchUsed)
2205 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2206 }
2207
Jim Grosbach82eee262013-11-16 00:53:35 +00002208 // Now add any that the user explicitly requested on the command line,
2209 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002210 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002211}
2212
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002213void Clang::AddX86TargetArgs(const ArgList &Args,
2214 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002215 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002216 Args.hasArg(options::OPT_mkernel) ||
2217 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002218 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002219
Bob Wilson2616e2e2013-02-10 16:01:41 +00002220 // Default to avoid implicit floating-point for kernel/kext code, but allow
2221 // that to be overridden with -mno-soft-float.
2222 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2223 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002224 if (Arg *A = Args.getLastArg(
2225 options::OPT_msoft_float, options::OPT_mno_soft_float,
2226 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002227 const Option &O = A->getOption();
2228 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2229 O.matches(options::OPT_msoft_float));
2230 }
2231 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002232 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002233
2234 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2235 StringRef Value = A->getValue();
2236 if (Value == "intel" || Value == "att") {
2237 CmdArgs.push_back("-mllvm");
2238 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2239 } else {
2240 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2241 << A->getOption().getName() << Value;
2242 }
2243 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002244
2245 // Set flags to support MCU ABI.
Andrey Turetskiye8e1ffe2016-06-20 10:31:39 +00002246 if (Arg *A = Args.getLastArg(options::OPT_miamcu, options::OPT_mno_iamcu)) {
2247 if (A->getOption().matches(options::OPT_miamcu)) {
2248 CmdArgs.push_back("-mfloat-abi");
2249 CmdArgs.push_back("soft");
2250 CmdArgs.push_back("-mstack-alignment=4");
2251 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002252 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002253}
2254
Tony Linthicum76329bf2011-12-12 21:14:55 +00002255void Clang::AddHexagonTargetArgs(const ArgList &Args,
2256 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002257 CmdArgs.push_back("-mqdsp6-compat");
2258 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002259
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002260 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2261 std::string N = llvm::utostr(G.getValue());
2262 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002263 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002264 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002265 }
2266
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002267 if (!Args.hasArg(options::OPT_fno_short_enums))
2268 CmdArgs.push_back("-fshort-enums");
2269 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002270 CmdArgs.push_back("-mllvm");
2271 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002272 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002273 CmdArgs.push_back("-mllvm");
2274 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002275}
2276
Jacques Pienaard964cc22016-03-28 21:02:54 +00002277void Clang::AddLanaiTargetArgs(const ArgList &Args,
2278 ArgStringList &CmdArgs) const {
2279 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2280 StringRef CPUName = A->getValue();
2281
2282 CmdArgs.push_back("-target-cpu");
2283 CmdArgs.push_back(Args.MakeArgString(CPUName));
2284 }
2285 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2286 StringRef Value = A->getValue();
2287 // Only support mregparm=4 to support old usage. Report error for all other
2288 // cases.
2289 int Mregparm;
2290 if (Value.getAsInteger(10, Mregparm)) {
2291 if (Mregparm != 4) {
2292 getToolChain().getDriver().Diag(
2293 diag::err_drv_unsupported_option_argument)
2294 << A->getOption().getName() << Value;
2295 }
2296 }
2297 }
2298}
2299
Dan Gohmane3d71e12016-01-07 01:00:21 +00002300void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2301 ArgStringList &CmdArgs) const {
2302 // Default to "hidden" visibility.
2303 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2304 options::OPT_fvisibility_ms_compat)) {
2305 CmdArgs.push_back("-fvisibility");
2306 CmdArgs.push_back("hidden");
2307 }
2308}
2309
Kevin Qin110db6f2014-07-18 07:03:22 +00002310// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002311static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002312 std::vector<const char *> &Features) {
2313 SmallVector<StringRef, 8> Split;
2314 text.split(Split, StringRef("+"), -1, false);
2315
Benjamin Kramer72e64312015-09-24 14:48:49 +00002316 for (StringRef Feature : Split) {
Renato Golin3b8709c2016-05-25 12:36:31 +00002317 const char *result = llvm::StringSwitch<const char *>(Feature)
2318 .Case("fp", "+fp-armv8")
2319 .Case("simd", "+neon")
2320 .Case("crc", "+crc")
2321 .Case("crypto", "+crypto")
2322 .Case("fp16", "+fullfp16")
2323 .Case("profile", "+spe")
Sjoerd Meijerba7a16f2016-06-03 14:08:20 +00002324 .Case("ras", "+ras")
Renato Golin3b8709c2016-05-25 12:36:31 +00002325 .Case("nofp", "-fp-armv8")
2326 .Case("nosimd", "-neon")
2327 .Case("nocrc", "-crc")
2328 .Case("nocrypto", "-crypto")
2329 .Case("nofp16", "-fullfp16")
2330 .Case("noprofile", "-spe")
Sjoerd Meijerba7a16f2016-06-03 14:08:20 +00002331 .Case("noras", "-ras")
Renato Golin3b8709c2016-05-25 12:36:31 +00002332 .Default(nullptr);
2333 if (result)
2334 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002335 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002336 D.Diag(diag::err_drv_no_neon_modifier);
2337 else
2338 return false;
2339 }
2340 return true;
2341}
2342
2343// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2344// decode CPU and feature.
2345static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2346 std::vector<const char *> &Features) {
2347 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2348 CPU = Split.first;
Renato Golin3b8709c2016-05-25 12:36:31 +00002349 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
2350 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
Sjoerd Meijer90df4a72016-06-02 10:48:37 +00002351 CPU == "kryo" || CPU == "cortex-a73") {
Renato Golin3b8709c2016-05-25 12:36:31 +00002352 Features.push_back("+neon");
2353 Features.push_back("+crc");
2354 Features.push_back("+crypto");
2355 } else if (CPU == "cyclone") {
2356 Features.push_back("+neon");
2357 Features.push_back("+crypto");
2358 } else if (CPU == "generic") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002359 Features.push_back("+neon");
2360 } else {
Renato Golin3b8709c2016-05-25 12:36:31 +00002361 return false;
2362 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002363
2364 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2365 return false;
2366
2367 return true;
2368}
2369
2370static bool
2371getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2372 const ArgList &Args,
2373 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002374 std::string MarchLowerCase = March.lower();
2375 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002376
Renato Golin3b8709c2016-05-25 12:36:31 +00002377 if (Split.first == "armv8-a" || Split.first == "armv8a") {
2378 // ok, no additional features.
2379 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
2380 Features.push_back("+v8.1a");
2381 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2382 Features.push_back("+v8.2a");
2383 } else {
2384 return false;
2385 }
2386
2387 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002388 return false;
2389
2390 return true;
2391}
2392
2393static bool
2394getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2395 const ArgList &Args,
2396 std::vector<const char *> &Features) {
2397 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002398 std::string McpuLowerCase = Mcpu.lower();
2399 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002400 return false;
2401
2402 return true;
2403}
2404
2405static bool
2406getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2407 const ArgList &Args,
2408 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002409 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002410 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002411 if (MtuneLowerCase == "native")
2412 MtuneLowerCase = llvm::sys::getHostCPUName();
2413 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002414 Features.push_back("+zcm");
2415 Features.push_back("+zcz");
2416 }
2417 return true;
2418}
2419
2420static bool
2421getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2422 const ArgList &Args,
2423 std::vector<const char *> &Features) {
2424 StringRef CPU;
2425 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002426 std::string McpuLowerCase = Mcpu.lower();
2427 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002428 return false;
2429
2430 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2431}
2432
Justin Bognerf9052562015-11-13 23:07:31 +00002433static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002434 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002435 Arg *A;
2436 bool success = true;
2437 // Enable NEON by default.
2438 Features.push_back("+neon");
2439 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2440 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2441 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2442 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002443 else if (Args.hasArg(options::OPT_arch))
2444 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2445 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002446
2447 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2448 success =
2449 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2450 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2451 success =
2452 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002453 else if (Args.hasArg(options::OPT_arch))
2454 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2455 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002456
2457 if (!success)
2458 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002459
2460 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2461 Features.push_back("-fp-armv8");
2462 Features.push_back("-crypto");
2463 Features.push_back("-neon");
2464 }
Bradley Smith418c5932014-05-02 15:17:51 +00002465
2466 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002468 if (A->getOption().matches(options::OPT_mcrc))
2469 Features.push_back("+crc");
2470 else
2471 Features.push_back("-crc");
2472 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002473
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002474 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2475 options::OPT_munaligned_access))
2476 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2477 Features.push_back("+strict-align");
2478
Justin Bognerf9052562015-11-13 23:07:31 +00002479 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002480 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002481}
2482
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002483static void getHexagonTargetFeatures(const ArgList &Args,
2484 std::vector<const char *> &Features) {
2485 bool HasHVX = false, HasHVXD = false;
2486
Eric Christopher49062a52015-12-22 03:12:34 +00002487 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2488 // doing dependent option handling here rather than in initFeatureMap or a
2489 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002490 for (auto &A : Args) {
2491 auto &Opt = A->getOption();
2492 if (Opt.matches(options::OPT_mhexagon_hvx))
2493 HasHVX = true;
2494 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2495 HasHVXD = HasHVX = false;
2496 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2497 HasHVXD = HasHVX = true;
2498 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2499 HasHVXD = false;
2500 else
2501 continue;
2502 A->claim();
2503 }
2504
2505 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2506 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2507}
2508
Dan Gohmanc2853072015-09-03 22:51:53 +00002509static void getWebAssemblyTargetFeatures(const ArgList &Args,
2510 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002511 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002512}
2513
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002514static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2515 std::vector<const char *> &Features) {
2516 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2517 StringRef value = dAbi->getValue();
2518 if (value == "1.0") {
2519 Features.push_back("+amdgpu-debugger-insert-nops");
Konstantin Zhuravlyove6dbd902016-05-26 19:36:39 +00002520 Features.push_back("+amdgpu-debugger-reserve-regs");
2521 Features.push_back("+amdgpu-debugger-emit-prologue");
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002522 } else {
2523 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2524 }
2525 }
2526
2527 handleTargetFeaturesGroup(
2528 Args, Features, options::OPT_m_amdgpu_Features_Group);
2529}
2530
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002531static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002532 const ArgList &Args, ArgStringList &CmdArgs,
2533 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002534 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002535 std::vector<const char *> Features;
2536 switch (Triple.getArch()) {
2537 default:
2538 break;
2539 case llvm::Triple::mips:
2540 case llvm::Triple::mipsel:
2541 case llvm::Triple::mips64:
2542 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002543 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002544 break;
2545
2546 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002547 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002548 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002549 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002550 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002551 break;
2552
2553 case llvm::Triple::ppc:
2554 case llvm::Triple::ppc64:
2555 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002556 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002557 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002558 case llvm::Triple::systemz:
2559 getSystemZTargetFeatures(Args, Features);
2560 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002561 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002562 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002563 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002564 break;
2565 case llvm::Triple::x86:
2566 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002567 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002568 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002569 case llvm::Triple::hexagon:
2570 getHexagonTargetFeatures(Args, Features);
2571 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002572 case llvm::Triple::wasm32:
2573 case llvm::Triple::wasm64:
2574 getWebAssemblyTargetFeatures(Args, Features);
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00002575 break;
2576 case llvm::Triple::sparc:
2577 case llvm::Triple::sparcel:
2578 case llvm::Triple::sparcv9:
2579 getSparcTargetFeatures(D, Args, Features);
Dan Gohmanc2853072015-09-03 22:51:53 +00002580 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002581 case llvm::Triple::r600:
2582 case llvm::Triple::amdgcn:
2583 getAMDGPUTargetFeatures(D, Args, Features);
2584 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002585 }
Rafael Espindola43964802013-08-21 17:34:32 +00002586
2587 // Find the last of each feature.
2588 llvm::StringMap<unsigned> LastOpt;
2589 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2590 const char *Name = Features[I];
2591 assert(Name[0] == '-' || Name[0] == '+');
2592 LastOpt[Name + 1] = I;
2593 }
2594
2595 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2596 // If this feature was overridden, ignore it.
2597 const char *Name = Features[I];
2598 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2599 assert(LastI != LastOpt.end());
2600 unsigned Last = LastI->second;
2601 if (Last != I)
2602 continue;
2603
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002604 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002605 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002606 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002607}
2608
David Majnemerae394812014-12-09 00:12:30 +00002609static bool
2610shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2611 const llvm::Triple &Triple) {
2612 // We use the zero-cost exception tables for Objective-C if the non-fragile
2613 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2614 // later.
2615 if (runtime.isNonFragile())
2616 return true;
2617
2618 if (!Triple.isMacOSX())
2619 return false;
2620
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002621 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002622 (Triple.getArch() == llvm::Triple::x86_64 ||
2623 Triple.getArch() == llvm::Triple::arm));
2624}
2625
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002626/// Adds exception related arguments to the driver command arguments. There's a
2627/// master flag, -fexceptions and also language specific flags to enable/disable
2628/// C++ and Objective-C exceptions. This makes it possible to for example
2629/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002630static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002631 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002632 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002633 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002634 const Driver &D = TC.getDriver();
2635 const llvm::Triple &Triple = TC.getTriple();
2636
Chad Rosier4fab82c2012-03-26 22:04:46 +00002637 if (KernelOrKext) {
2638 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2639 // arguments now to avoid warnings about unused arguments.
2640 Args.ClaimAllArgs(options::OPT_fexceptions);
2641 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2642 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2643 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2644 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2645 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002646 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002647 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002648
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002649 // See if the user explicitly enabled exceptions.
2650 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2651 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002652
David Majnemerae394812014-12-09 00:12:30 +00002653 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2654 // is not necessarily sensible, but follows GCC.
2655 if (types::isObjC(InputType) &&
2656 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002657 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002658 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002659
David Majnemerae394812014-12-09 00:12:30 +00002660 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002661 }
2662
2663 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002664 // Disable C++ EH by default on XCore and PS4.
2665 bool CXXExceptionsEnabled =
2666 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002667 Arg *ExceptionArg = Args.getLastArg(
2668 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2669 options::OPT_fexceptions, options::OPT_fno_exceptions);
2670 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002671 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002672 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2673 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002674
2675 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002676 if (Triple.isPS4CPU()) {
2677 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2678 assert(ExceptionArg &&
2679 "On the PS4 exceptions should only be enabled if passing "
2680 "an argument");
2681 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2682 const Arg *RTTIArg = TC.getRTTIArg();
2683 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2684 D.Diag(diag::err_drv_argument_not_allowed_with)
2685 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2686 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2687 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2688 } else
2689 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2690
Anders Carlssone96ab552011-02-28 02:27:16 +00002691 CmdArgs.push_back("-fcxx-exceptions");
2692
David Majnemer8de68642014-12-05 08:11:58 +00002693 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002694 }
2695 }
2696
David Majnemer8de68642014-12-05 08:11:58 +00002697 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002698 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002699}
2700
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002701static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002702 bool Default = true;
2703 if (TC.getTriple().isOSDarwin()) {
2704 // The native darwin assembler doesn't support the linker_option directives,
2705 // so we disable them if we think the .s file will be passed to it.
2706 Default = TC.useIntegratedAs();
2707 }
2708 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2709 Default);
2710}
2711
Ted Kremenek62093662013-03-12 17:02:12 +00002712static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2713 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002714 bool UseDwarfDirectory =
2715 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2716 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002717 return !UseDwarfDirectory;
2718}
2719
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002720/// \brief Check whether the given input tree contains any compilation actions.
2721static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002722 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002723 return true;
2724
Nico Weber5a459f82016-02-23 19:30:43 +00002725 for (const auto &AI : A->inputs())
2726 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002727 return true;
2728
2729 return false;
2730}
2731
2732/// \brief Check if -relax-all should be passed to the internal assembler.
2733/// This is done by default when compiling non-assembler source with -O0.
2734static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2735 bool RelaxDefault = true;
2736
2737 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2738 RelaxDefault = A->getOption().matches(options::OPT_O0);
2739
2740 if (RelaxDefault) {
2741 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002742 for (const auto &Act : C.getActions()) {
2743 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002744 RelaxDefault = true;
2745 break;
2746 }
2747 }
2748 }
2749
2750 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002751 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002752}
2753
Paul Robinson0334a042015-12-19 19:41:48 +00002754// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2755// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002756static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002757 assert(A.getOption().matches(options::OPT_gN_Group) &&
2758 "Not a -g option that specifies a debug-info level");
2759 if (A.getOption().matches(options::OPT_g0) ||
2760 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002761 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002762 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2763 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002764 return codegenoptions::DebugLineTablesOnly;
2765 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002766}
2767
Douglas Katzman3459ce22015-10-08 04:24:12 +00002768// Extract the integer N from a string spelled "-dwarf-N", returning 0
2769// on mismatch. The StringRef input (rather than an Arg) allows
2770// for use by the "-Xassembler" option parser.
2771static unsigned DwarfVersionNum(StringRef ArgValue) {
2772 return llvm::StringSwitch<unsigned>(ArgValue)
2773 .Case("-gdwarf-2", 2)
2774 .Case("-gdwarf-3", 3)
2775 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002776 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002777 .Default(0);
2778}
2779
2780static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002781 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002782 unsigned DwarfVersion,
2783 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002784 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002785 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002786 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2787 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002788 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002789 CmdArgs.push_back("-debug-info-kind=limited");
2790 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002791 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002792 CmdArgs.push_back("-debug-info-kind=standalone");
2793 break;
2794 default:
2795 break;
2796 }
2797 if (DwarfVersion > 0)
2798 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002799 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002800 switch (DebuggerTuning) {
2801 case llvm::DebuggerKind::GDB:
2802 CmdArgs.push_back("-debugger-tuning=gdb");
2803 break;
2804 case llvm::DebuggerKind::LLDB:
2805 CmdArgs.push_back("-debugger-tuning=lldb");
2806 break;
2807 case llvm::DebuggerKind::SCE:
2808 CmdArgs.push_back("-debugger-tuning=sce");
2809 break;
2810 default:
2811 break;
2812 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002813}
2814
David Blaikie9260ed62013-07-25 21:19:01 +00002815static void CollectArgsForIntegratedAssembler(Compilation &C,
2816 const ArgList &Args,
2817 ArgStringList &CmdArgs,
2818 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 if (UseRelaxAll(C, Args))
2820 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002821
David Majnemer2b9349d2015-12-21 22:09:34 +00002822 // Only default to -mincremental-linker-compatible if we think we are
2823 // targeting the MSVC linker.
2824 bool DefaultIncrementalLinkerCompatible =
2825 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2826 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2827 options::OPT_mno_incremental_linker_compatible,
2828 DefaultIncrementalLinkerCompatible))
2829 CmdArgs.push_back("-mincremental-linker-compatible");
2830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002831 // When passing -I arguments to the assembler we sometimes need to
2832 // unconditionally take the next argument. For example, when parsing
2833 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2834 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2835 // arg after parsing the '-I' arg.
2836 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002837
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002838 // When using an integrated assembler, translate -Wa, and -Xassembler
2839 // options.
2840 bool CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002841
Rafael Espindola557679f2016-06-20 23:54:44 +00002842 bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS;
Scott Egertonb67d4692016-01-14 13:01:48 +00002843 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844 for (const Arg *A :
2845 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2846 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002847
Benjamin Kramer72e64312015-09-24 14:48:49 +00002848 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002849 if (TakeNextArg) {
2850 CmdArgs.push_back(Value.data());
2851 TakeNextArg = false;
2852 continue;
2853 }
David Blaikie9260ed62013-07-25 21:19:01 +00002854
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002855 switch (C.getDefaultToolChain().getArch()) {
2856 default:
2857 break;
2858 case llvm::Triple::mips:
2859 case llvm::Triple::mipsel:
2860 case llvm::Triple::mips64:
2861 case llvm::Triple::mips64el:
2862 if (Value == "--trap") {
2863 CmdArgs.push_back("-target-feature");
2864 CmdArgs.push_back("+use-tcc-in-div");
2865 continue;
2866 }
2867 if (Value == "--break") {
2868 CmdArgs.push_back("-target-feature");
2869 CmdArgs.push_back("-use-tcc-in-div");
2870 continue;
2871 }
2872 if (Value.startswith("-msoft-float")) {
2873 CmdArgs.push_back("-target-feature");
2874 CmdArgs.push_back("+soft-float");
2875 continue;
2876 }
2877 if (Value.startswith("-mhard-float")) {
2878 CmdArgs.push_back("-target-feature");
2879 CmdArgs.push_back("-soft-float");
2880 continue;
2881 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002882
2883 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2884 .Case("-mips1", "+mips1")
2885 .Case("-mips2", "+mips2")
2886 .Case("-mips3", "+mips3")
2887 .Case("-mips4", "+mips4")
2888 .Case("-mips5", "+mips5")
2889 .Case("-mips32", "+mips32")
2890 .Case("-mips32r2", "+mips32r2")
2891 .Case("-mips32r3", "+mips32r3")
2892 .Case("-mips32r5", "+mips32r5")
2893 .Case("-mips32r6", "+mips32r6")
2894 .Case("-mips64", "+mips64")
2895 .Case("-mips64r2", "+mips64r2")
2896 .Case("-mips64r3", "+mips64r3")
2897 .Case("-mips64r5", "+mips64r5")
2898 .Case("-mips64r6", "+mips64r6")
2899 .Default(nullptr);
2900 if (MipsTargetFeature)
2901 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002902 }
2903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002904 if (Value == "-force_cpusubtype_ALL") {
2905 // Do nothing, this is the default and we don't support anything else.
2906 } else if (Value == "-L") {
2907 CmdArgs.push_back("-msave-temp-labels");
2908 } else if (Value == "--fatal-warnings") {
2909 CmdArgs.push_back("-massembler-fatal-warnings");
2910 } else if (Value == "--noexecstack") {
2911 CmdArgs.push_back("-mnoexecstack");
2912 } else if (Value == "-compress-debug-sections" ||
2913 Value == "--compress-debug-sections") {
2914 CompressDebugSections = true;
2915 } else if (Value == "-nocompress-debug-sections" ||
2916 Value == "--nocompress-debug-sections") {
2917 CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002918 } else if (Value == "-mrelax-relocations=yes" ||
2919 Value == "--mrelax-relocations=yes") {
2920 UseRelaxRelocations = true;
2921 } else if (Value == "-mrelax-relocations=no" ||
2922 Value == "--mrelax-relocations=no") {
2923 UseRelaxRelocations = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002924 } else if (Value.startswith("-I")) {
2925 CmdArgs.push_back(Value.data());
2926 // We need to consume the next argument if the current arg is a plain
2927 // -I. The next arg will be the include directory.
2928 if (Value == "-I")
2929 TakeNextArg = true;
2930 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002931 // "-gdwarf-N" options are not cc1as options.
2932 unsigned DwarfVersion = DwarfVersionNum(Value);
2933 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2934 CmdArgs.push_back(Value.data());
2935 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002936 RenderDebugEnablingArgs(Args, CmdArgs,
2937 codegenoptions::LimitedDebugInfo,
2938 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002939 }
Renato Golin7c542b42015-07-27 23:44:45 +00002940 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2941 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2942 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002943 } else {
2944 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002945 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002946 }
2947 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002948 }
2949 if (CompressDebugSections) {
2950 if (llvm::zlib::isAvailable())
2951 CmdArgs.push_back("-compress-debug-sections");
2952 else
2953 D.Diag(diag::warn_debug_compression_unavailable);
2954 }
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002955 if (UseRelaxRelocations)
2956 CmdArgs.push_back("--mrelax-relocations");
Scott Egertonb67d4692016-01-14 13:01:48 +00002957 if (MipsTargetFeature != nullptr) {
2958 CmdArgs.push_back("-target-feature");
2959 CmdArgs.push_back(MipsTargetFeature);
2960 }
David Blaikie9260ed62013-07-25 21:19:01 +00002961}
2962
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002963// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002964// FIXME: Make sure we can also emit shared objects if they're requested
2965// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002966static void addClangRT(const ToolChain &TC, const ArgList &Args,
2967 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002968 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002969}
2970
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002971namespace {
2972enum OpenMPRuntimeKind {
2973 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2974 /// without knowing what runtime to target.
2975 OMPRT_Unknown,
2976
2977 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2978 /// the default for Clang.
2979 OMPRT_OMP,
2980
2981 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2982 /// this runtime but can swallow the pragmas, and find and link against the
2983 /// runtime library itself.
2984 OMPRT_GOMP,
2985
Chandler Carruthc6625c62015-05-28 21:10:31 +00002986 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002987 /// OpenMP runtime. We support this mode for users with existing dependencies
2988 /// on this runtime library name.
2989 OMPRT_IOMP5
2990};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002991}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002992
2993/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002994static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2995 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002996 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2997
2998 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2999 if (A)
3000 RuntimeName = A->getValue();
3001
3002 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003003 .Case("libomp", OMPRT_OMP)
3004 .Case("libgomp", OMPRT_GOMP)
3005 .Case("libiomp5", OMPRT_IOMP5)
3006 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003007
3008 if (RT == OMPRT_Unknown) {
3009 if (A)
3010 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003011 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003012 else
3013 // FIXME: We could use a nicer diagnostic here.
3014 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
3015 }
3016
3017 return RT;
3018}
3019
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00003020static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
3021 const ArgList &Args) {
3022 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3023 options::OPT_fno_openmp, false))
3024 return;
3025
3026 switch (getOpenMPRuntime(TC, Args)) {
3027 case OMPRT_OMP:
3028 CmdArgs.push_back("-lomp");
3029 break;
3030 case OMPRT_GOMP:
3031 CmdArgs.push_back("-lgomp");
3032 break;
3033 case OMPRT_IOMP5:
3034 CmdArgs.push_back("-liomp5");
3035 break;
3036 case OMPRT_Unknown:
3037 // Already diagnosed.
3038 break;
3039 }
3040}
3041
Alexey Samsonov52550342014-09-15 19:58:40 +00003042static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
3043 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00003044 bool IsShared, bool IsWhole) {
3045 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00003046 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00003047 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00003048 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00003049 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00003050}
3051
Alexey Samsonov52550342014-09-15 19:58:40 +00003052// Tries to use a file with the list of dynamic symbols that need to be exported
3053// from the runtime library. Returns true if the file was found.
3054static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
3055 ArgStringList &CmdArgs,
3056 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00003057 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00003058 if (llvm::sys::fs::exists(SanRT + ".syms")) {
3059 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00003060 return true;
3061 }
3062 return false;
3063}
3064
3065static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3066 ArgStringList &CmdArgs) {
3067 // Force linking against the system libraries sanitizers depends on
3068 // (see PR15823 why this is necessary).
3069 CmdArgs.push_back("--no-as-needed");
3070 CmdArgs.push_back("-lpthread");
3071 CmdArgs.push_back("-lrt");
3072 CmdArgs.push_back("-lm");
3073 // There's no libdl on FreeBSD.
3074 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3075 CmdArgs.push_back("-ldl");
3076}
3077
3078static void
3079collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3080 SmallVectorImpl<StringRef> &SharedRuntimes,
3081 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003082 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3083 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3084 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003085 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3086 // Collect shared runtimes.
3087 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3088 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00003089 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003090 // The stats_client library is also statically linked into DSOs.
3091 if (SanArgs.needsStatsRt())
3092 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003093
Alexey Samsonov52550342014-09-15 19:58:40 +00003094 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003095 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003096 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003097 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00003098 }
3099 if (SanArgs.needsAsanRt()) {
3100 if (SanArgs.needsSharedAsanRt()) {
3101 HelperStaticRuntimes.push_back("asan-preinit");
3102 } else {
3103 StaticRuntimes.push_back("asan");
3104 if (SanArgs.linkCXXRuntimes())
3105 StaticRuntimes.push_back("asan_cxx");
3106 }
3107 }
3108 if (SanArgs.needsDfsanRt())
3109 StaticRuntimes.push_back("dfsan");
3110 if (SanArgs.needsLsanRt())
3111 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003112 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003113 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003114 if (SanArgs.linkCXXRuntimes())
3115 StaticRuntimes.push_back("msan_cxx");
3116 }
3117 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003118 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003119 if (SanArgs.linkCXXRuntimes())
3120 StaticRuntimes.push_back("tsan_cxx");
3121 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003122 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003123 StaticRuntimes.push_back("ubsan_standalone");
3124 if (SanArgs.linkCXXRuntimes())
3125 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003126 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003127 if (SanArgs.needsSafeStackRt())
3128 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003129 if (SanArgs.needsCfiRt())
3130 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003131 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003132 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003133 if (SanArgs.linkCXXRuntimes())
3134 StaticRuntimes.push_back("ubsan_standalone_cxx");
3135 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003136 if (SanArgs.needsStatsRt()) {
3137 NonWholeStaticRuntimes.push_back("stats");
3138 RequiredSymbols.push_back("__sanitizer_stats_register");
3139 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003140 if (SanArgs.needsEsanRt())
3141 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003142}
3143
Alexey Samsonov52550342014-09-15 19:58:40 +00003144// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3145// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3146static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003147 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003148 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003149 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003150 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003151 NonWholeStaticRuntimes, HelperStaticRuntimes,
3152 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003153 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003154 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003155 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003156 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003157 bool AddExportDynamic = false;
3158 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003159 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003160 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3161 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003162 for (auto RT : NonWholeStaticRuntimes) {
3163 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3164 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3165 }
3166 for (auto S : RequiredSymbols) {
3167 CmdArgs.push_back("-u");
3168 CmdArgs.push_back(Args.MakeArgString(S));
3169 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003170 // If there is a static runtime with no dynamic list, force all the symbols
3171 // to be dynamic to be sure we export sanitizer interface functions.
3172 if (AddExportDynamic)
3173 CmdArgs.push_back("-export-dynamic");
3174 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003175}
3176
Reid Kleckner86ea7702015-02-04 23:45:07 +00003177static bool areOptimizationsEnabled(const ArgList &Args) {
3178 // Find the last -O arg and see if it is non-zero.
3179 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3180 return !A->getOption().matches(options::OPT_O0);
3181 // Defaults to -O0.
3182 return false;
3183}
3184
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003185static bool shouldUseFramePointerForTarget(const ArgList &Args,
3186 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003187 switch (Triple.getArch()) {
3188 case llvm::Triple::xcore:
3189 case llvm::Triple::wasm32:
3190 case llvm::Triple::wasm64:
3191 // XCore never wants frame pointers, regardless of OS.
3192 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003193 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003194 default:
3195 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003196 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003197
3198 if (Triple.isOSLinux()) {
3199 switch (Triple.getArch()) {
3200 // Don't use a frame pointer on linux if optimizing for certain targets.
3201 case llvm::Triple::mips64:
3202 case llvm::Triple::mips64el:
3203 case llvm::Triple::mips:
3204 case llvm::Triple::mipsel:
3205 case llvm::Triple::systemz:
3206 case llvm::Triple::x86:
3207 case llvm::Triple::x86_64:
3208 return !areOptimizationsEnabled(Args);
3209 default:
3210 return true;
3211 }
3212 }
3213
3214 if (Triple.isOSWindows()) {
3215 switch (Triple.getArch()) {
3216 case llvm::Triple::x86:
3217 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003218 case llvm::Triple::x86_64:
3219 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003220 case llvm::Triple::arm:
3221 case llvm::Triple::thumb:
3222 // Windows on ARM builds with FPO disabled to aid fast stack walking
3223 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003224 default:
3225 // All other supported Windows ISAs use xdata unwind information, so frame
3226 // pointers are not generally useful.
3227 return false;
3228 }
3229 }
3230
3231 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003232}
3233
Rafael Espindola224dd632011-12-14 21:02:23 +00003234static bool shouldUseFramePointer(const ArgList &Args,
3235 const llvm::Triple &Triple) {
3236 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3237 options::OPT_fomit_frame_pointer))
3238 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003239 if (Args.hasArg(options::OPT_pg))
3240 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003241
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003242 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003243}
3244
Eric Christopherb7d97e92013-04-03 01:58:53 +00003245static bool shouldUseLeafFramePointer(const ArgList &Args,
3246 const llvm::Triple &Triple) {
3247 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3248 options::OPT_momit_leaf_frame_pointer))
3249 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003250 if (Args.hasArg(options::OPT_pg))
3251 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003252
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003253 if (Triple.isPS4CPU())
3254 return false;
3255
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003256 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003257}
3258
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003259/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003260static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003261 SmallString<128> cwd;
3262 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003263 CmdArgs.push_back("-fdebug-compilation-dir");
3264 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003265 }
3266}
3267
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003268static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003269 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3270 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3271 SmallString<128> T(FinalOutput->getValue());
3272 llvm::sys::path::replace_extension(T, "dwo");
3273 return Args.MakeArgString(T);
3274 } else {
3275 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003276 SmallString<128> T(
3277 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003278 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003279 llvm::sys::path::replace_extension(F, "dwo");
3280 T += F;
3281 return Args.MakeArgString(F);
3282 }
3283}
3284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003285static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3286 const JobAction &JA, const ArgList &Args,
3287 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003288 ArgStringList ExtractArgs;
3289 ExtractArgs.push_back("--extract-dwo");
3290
3291 ArgStringList StripArgs;
3292 StripArgs.push_back("--strip-dwo");
3293
3294 // Grabbing the output of the earlier compile step.
3295 StripArgs.push_back(Output.getFilename());
3296 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003297 ExtractArgs.push_back(OutFile);
3298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003299 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003300 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003301
3302 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003303 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003304
3305 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003306 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003307}
3308
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003309/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003310/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3311static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003312 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003313 if (A->getOption().matches(options::OPT_O4) ||
3314 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003315 return true;
3316
3317 if (A->getOption().matches(options::OPT_O0))
3318 return false;
3319
3320 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3321
Rafael Espindola91780de2013-08-26 14:05:41 +00003322 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003323 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003324 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003325 return true;
3326
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003327 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003328 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003329 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003330
3331 unsigned OptLevel = 0;
3332 if (S.getAsInteger(10, OptLevel))
3333 return false;
3334
3335 return OptLevel > 1;
3336 }
3337
3338 return false;
3339}
3340
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003341/// Add -x lang to \p CmdArgs for \p Input.
3342static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3343 ArgStringList &CmdArgs) {
3344 // When using -verify-pch, we don't want to provide the type
3345 // 'precompiled-header' if it was inferred from the file extension
3346 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3347 return;
3348
3349 CmdArgs.push_back("-x");
3350 if (Args.hasArg(options::OPT_rewrite_objc))
3351 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3352 else
3353 CmdArgs.push_back(types::getTypeName(Input.getType()));
3354}
3355
David Majnemerc371ff02015-03-22 08:39:22 +00003356static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003357 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003358 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003359
3360 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003361 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003362
3363 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003364 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003365 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003366 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003367}
3368
Rafael Espindola577637a2015-01-03 00:06:04 +00003369// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003370// options that build systems might add but are unused when assembling or only
3371// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003372static void claimNoWarnArgs(const ArgList &Args) {
3373 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003374 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003375 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003376 Args.ClaimAllArgs(options::OPT_flto);
3377 Args.ClaimAllArgs(options::OPT_fno_lto);
3378}
3379
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003380static void appendUserToPath(SmallVectorImpl<char> &Result) {
3381#ifdef LLVM_ON_UNIX
3382 const char *Username = getenv("LOGNAME");
3383#else
3384 const char *Username = getenv("USERNAME");
3385#endif
3386 if (Username) {
3387 // Validate that LoginName can be used in a path, and get its length.
3388 size_t Len = 0;
3389 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003390 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003391 Username = nullptr;
3392 break;
3393 }
3394 }
3395
3396 if (Username && Len > 0) {
3397 Result.append(Username, Username + Len);
3398 return;
3399 }
3400 }
3401
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003402// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003403#ifdef LLVM_ON_UNIX
3404 std::string UID = llvm::utostr(getuid());
3405#else
3406 // FIXME: Windows seems to have an 'SID' that might work.
3407 std::string UID = "9999";
3408#endif
3409 Result.append(UID.begin(), UID.end());
3410}
3411
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003412VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
David Majnemere11d3732015-06-08 00:22:46 +00003413 const llvm::Triple &Triple,
3414 const llvm::opt::ArgList &Args,
3415 bool IsWindowsMSVC) {
3416 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3417 IsWindowsMSVC) ||
3418 Args.hasArg(options::OPT_fmsc_version) ||
3419 Args.hasArg(options::OPT_fms_compatibility_version)) {
3420 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3421 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003422 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003423
3424 if (MSCVersion && MSCompatibilityVersion) {
3425 if (D)
3426 D->Diag(diag::err_drv_argument_not_allowed_with)
3427 << MSCVersion->getAsString(Args)
3428 << MSCompatibilityVersion->getAsString(Args);
3429 return VersionTuple();
3430 }
3431
3432 if (MSCompatibilityVersion) {
3433 VersionTuple MSVT;
3434 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3435 D->Diag(diag::err_drv_invalid_value)
3436 << MSCompatibilityVersion->getAsString(Args)
3437 << MSCompatibilityVersion->getValue();
3438 return MSVT;
3439 }
3440
3441 if (MSCVersion) {
3442 unsigned Version = 0;
3443 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3444 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3445 << MSCVersion->getValue();
3446 return getMSCompatibilityVersion(Version);
3447 }
3448
3449 unsigned Major, Minor, Micro;
3450 Triple.getEnvironmentVersion(Major, Minor, Micro);
3451 if (Major || Minor || Micro)
3452 return VersionTuple(Major, Minor, Micro);
3453
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003454 if (IsWindowsMSVC) {
3455 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3456 if (!MSVT.empty())
3457 return MSVT;
3458
3459 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3460 return VersionTuple(18);
3461 }
David Majnemere11d3732015-06-08 00:22:46 +00003462 }
3463 return VersionTuple();
3464}
3465
Diego Novilloa0545962015-07-10 18:00:07 +00003466static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3467 const InputInfo &Output, const ArgList &Args,
3468 ArgStringList &CmdArgs) {
3469 auto *ProfileGenerateArg = Args.getLastArg(
3470 options::OPT_fprofile_instr_generate,
3471 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003472 options::OPT_fprofile_generate_EQ,
3473 options::OPT_fno_profile_instr_generate);
3474 if (ProfileGenerateArg &&
3475 ProfileGenerateArg->getOption().matches(
3476 options::OPT_fno_profile_instr_generate))
3477 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003478
3479 auto *ProfileUseArg = Args.getLastArg(
3480 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003481 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3482 options::OPT_fno_profile_instr_use);
3483 if (ProfileUseArg &&
3484 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3485 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003486
3487 if (ProfileGenerateArg && ProfileUseArg)
3488 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003489 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003490
Diego Novillo758f3f52015-08-05 21:49:51 +00003491 if (ProfileGenerateArg) {
3492 if (ProfileGenerateArg->getOption().matches(
3493 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003494 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3495 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003496 else if (ProfileGenerateArg->getOption().matches(
3497 options::OPT_fprofile_generate_EQ)) {
3498 SmallString<128> Path(ProfileGenerateArg->getValue());
3499 llvm::sys::path::append(Path, "default.profraw");
3500 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003501 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3502 }
3503 // The default is to use Clang Instrumentation.
3504 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003505 }
Diego Novilloa0545962015-07-10 18:00:07 +00003506
Diego Novillo758f3f52015-08-05 21:49:51 +00003507 if (ProfileUseArg) {
3508 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003509 CmdArgs.push_back(Args.MakeArgString(
3510 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003511 else if ((ProfileUseArg->getOption().matches(
3512 options::OPT_fprofile_use_EQ) ||
3513 ProfileUseArg->getOption().matches(
3514 options::OPT_fprofile_instr_use))) {
3515 SmallString<128> Path(
3516 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3517 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3518 llvm::sys::path::append(Path, "default.profdata");
3519 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003520 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003521 }
Diego Novilloa0545962015-07-10 18:00:07 +00003522 }
3523
3524 if (Args.hasArg(options::OPT_ftest_coverage) ||
3525 Args.hasArg(options::OPT_coverage))
3526 CmdArgs.push_back("-femit-coverage-notes");
3527 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3528 false) ||
3529 Args.hasArg(options::OPT_coverage))
3530 CmdArgs.push_back("-femit-coverage-data");
3531
Diego Novilloc4b94da2015-08-05 23:27:40 +00003532 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3533 options::OPT_fno_coverage_mapping, false) &&
3534 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003535 D.Diag(diag::err_drv_argument_only_allowed_with)
3536 << "-fcoverage-mapping"
3537 << "-fprofile-instr-generate";
3538
Diego Novilloc4b94da2015-08-05 23:27:40 +00003539 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3540 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003541 CmdArgs.push_back("-fcoverage-mapping");
3542
3543 if (C.getArgs().hasArg(options::OPT_c) ||
3544 C.getArgs().hasArg(options::OPT_S)) {
3545 if (Output.isFilename()) {
3546 CmdArgs.push_back("-coverage-file");
3547 SmallString<128> CoverageFilename;
3548 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3549 CoverageFilename = FinalOutput->getValue();
3550 } else {
3551 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3552 }
3553 if (llvm::sys::path::is_relative(CoverageFilename)) {
3554 SmallString<128> Pwd;
3555 if (!llvm::sys::fs::current_path(Pwd)) {
3556 llvm::sys::path::append(Pwd, CoverageFilename);
3557 CoverageFilename.swap(Pwd);
3558 }
3559 }
3560 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3561 }
3562 }
3563}
3564
Paul Robinsond083b9a2015-12-16 17:25:27 +00003565static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3566 ArgStringList &CmdArgs) {
3567 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3568 false) ||
3569 Args.hasFlag(options::OPT_fprofile_generate,
3570 options::OPT_fno_profile_instr_generate, false) ||
3571 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3572 options::OPT_fno_profile_instr_generate, false) ||
3573 Args.hasFlag(options::OPT_fprofile_instr_generate,
3574 options::OPT_fno_profile_instr_generate, false) ||
3575 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3576 options::OPT_fno_profile_instr_generate, false) ||
3577 Args.hasArg(options::OPT_fcreate_profile) ||
3578 Args.hasArg(options::OPT_coverage)))
3579 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3580}
3581
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003582/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3583/// smooshes them together with platform defaults, to decide whether
3584/// this compile should be using PIC mode or not. Returns a tuple of
3585/// (RelocationModel, PICLevel, IsPIE).
3586static std::tuple<llvm::Reloc::Model, unsigned, bool>
3587ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3588 const ArgList &Args) {
3589 // FIXME: why does this code...and so much everywhere else, use both
3590 // ToolChain.getTriple() and Triple?
3591 bool PIE = ToolChain.isPIEDefault();
3592 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003593 // The Darwin/MachO default to use PIC does not apply when using -static.
3594 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3595 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003596 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003597 bool IsPICLevelTwo = PIC;
3598
3599 bool KernelOrKext =
3600 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3601
3602 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003603 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003604 switch (ToolChain.getArch()) {
3605 case llvm::Triple::arm:
3606 case llvm::Triple::armeb:
3607 case llvm::Triple::thumb:
3608 case llvm::Triple::thumbeb:
3609 case llvm::Triple::aarch64:
3610 case llvm::Triple::mips:
3611 case llvm::Triple::mipsel:
3612 case llvm::Triple::mips64:
3613 case llvm::Triple::mips64el:
3614 PIC = true; // "-fpic"
3615 break;
3616
3617 case llvm::Triple::x86:
3618 case llvm::Triple::x86_64:
3619 PIC = true; // "-fPIC"
3620 IsPICLevelTwo = true;
3621 break;
3622
3623 default:
3624 break;
3625 }
3626 }
3627
3628 // OpenBSD-specific defaults for PIE
3629 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3630 switch (ToolChain.getArch()) {
3631 case llvm::Triple::mips64:
3632 case llvm::Triple::mips64el:
3633 case llvm::Triple::sparcel:
3634 case llvm::Triple::x86:
3635 case llvm::Triple::x86_64:
3636 IsPICLevelTwo = false; // "-fpie"
3637 break;
3638
3639 case llvm::Triple::ppc:
3640 case llvm::Triple::sparc:
3641 case llvm::Triple::sparcv9:
3642 IsPICLevelTwo = true; // "-fPIE"
3643 break;
3644
3645 default:
3646 break;
3647 }
3648 }
3649
3650 // The last argument relating to either PIC or PIE wins, and no
3651 // other argument is used. If the last argument is any flavor of the
3652 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3653 // option implicitly enables PIC at the same level.
3654 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3655 options::OPT_fpic, options::OPT_fno_pic,
3656 options::OPT_fPIE, options::OPT_fno_PIE,
3657 options::OPT_fpie, options::OPT_fno_pie);
3658 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3659 // is forced, then neither PIC nor PIE flags will have no effect.
3660 if (!ToolChain.isPICDefaultForced()) {
3661 if (LastPICArg) {
3662 Option O = LastPICArg->getOption();
3663 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3664 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3665 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3666 PIC =
3667 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3668 IsPICLevelTwo =
3669 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3670 } else {
3671 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003672 if (Triple.isPS4CPU()) {
3673 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3674 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3675 if (Model != "kernel") {
3676 PIC = true;
3677 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3678 << LastPICArg->getSpelling();
3679 }
3680 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003681 }
3682 }
3683 }
3684
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003685 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3686 // PIC level would've been set to level 1, force it back to level 2 PIC
3687 // instead.
3688 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003689 IsPICLevelTwo |= ToolChain.isPICDefault();
3690
James Y Knightc4015d32015-08-21 04:14:55 +00003691 // This kernel flags are a trump-card: they will disable PIC/PIE
3692 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003693 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3694 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003695 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003696
3697 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3698 // This is a very special mode. It trumps the other modes, almost no one
3699 // uses it, and it isn't even valid on any OS but Darwin.
3700 if (!ToolChain.getTriple().isOSDarwin())
3701 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3702 << A->getSpelling() << ToolChain.getTriple().str();
3703
3704 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3705
3706 // Only a forced PIC mode can cause the actual compile to have PIC defines
3707 // etc., no flags are sufficient. This behavior was selected to closely
3708 // match that of llvm-gcc and Apple GCC before that.
3709 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3710
3711 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3712 }
3713
3714 if (PIC)
3715 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3716
3717 return std::make_tuple(llvm::Reloc::Static, 0, false);
3718}
3719
3720static const char *RelocationModelName(llvm::Reloc::Model Model) {
3721 switch (Model) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003722 case llvm::Reloc::Static:
3723 return "static";
3724 case llvm::Reloc::PIC_:
3725 return "pic";
3726 case llvm::Reloc::DynamicNoPIC:
3727 return "dynamic-no-pic";
3728 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003729 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003730}
3731
3732static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3733 ArgStringList &CmdArgs) {
3734 llvm::Reloc::Model RelocationModel;
3735 unsigned PICLevel;
3736 bool IsPIE;
3737 std::tie(RelocationModel, PICLevel, IsPIE) =
3738 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3739
3740 if (RelocationModel != llvm::Reloc::Static)
3741 CmdArgs.push_back("-KPIC");
3742}
3743
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003744void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003745 const InputInfo &Output, const InputInfoList &Inputs,
3746 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003747 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3748 const llvm::Triple Triple(TripleStr);
3749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 bool KernelOrKext =
3751 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003752 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003753 ArgStringList CmdArgs;
3754
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003755 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003756 bool IsWindowsCygnus =
3757 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003758 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003759 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00003760 bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003761
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003762 // Check number of inputs for sanity. We need at least one input.
3763 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003764 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003765 // CUDA compilation may have multiple inputs (source file + results of
3766 // device-side compilations). All other jobs are expected to have exactly one
3767 // input.
3768 bool IsCuda = types::isCuda(Input.getType());
3769 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003770
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00003771 // C++ is not supported for IAMCU.
3772 if (IsIAMCU && types::isCXX(Input.getType()))
3773 D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU";
3774
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003775 // Invoke ourselves in -cc1 mode.
3776 //
3777 // FIXME: Implement custom jobs for internal actions.
3778 CmdArgs.push_back("-cc1");
3779
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003780 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003781 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003782 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003783
Artem Belevichfa11ab52015-11-17 22:28:46 +00003784 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003785 if (IsCuda) {
3786 // FIXME: We need a (better) way to pass information about
3787 // particular compilation pass we're constructing here. For now we
3788 // can check which toolchain we're using and pick the other one to
3789 // extract the triple.
Samuel Antaoc1ffba52016-06-13 18:10:57 +00003790 if (&getToolChain() == C.getSingleOffloadToolChain<Action::OFK_Cuda>())
3791 AuxToolChain = C.getOffloadingHostToolChain();
3792 else if (&getToolChain() == C.getOffloadingHostToolChain())
3793 AuxToolChain = C.getSingleOffloadToolChain<Action::OFK_Cuda>();
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003794 else
3795 llvm_unreachable("Can't figure out CUDA compilation mode.");
3796 assert(AuxToolChain != nullptr && "No aux toolchain.");
3797 CmdArgs.push_back("-aux-triple");
3798 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3799 }
3800
James Y Knight2db38f32015-08-15 03:45:25 +00003801 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3802 Triple.getArch() == llvm::Triple::thumb)) {
3803 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003804 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003805 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003806 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003807 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003808 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003809 }
3810
Tim Northover336f1892014-03-29 13:16:12 +00003811 // Push all default warning arguments that are specific to
3812 // the given target. These come before user provided warning options
3813 // are provided.
3814 getToolChain().addClangWarningOptions(CmdArgs);
3815
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003816 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003817 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003818
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003819 if (isa<AnalyzeJobAction>(JA)) {
3820 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3821 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003822 } else if (isa<MigrateJobAction>(JA)) {
3823 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003824 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003825 if (Output.getType() == types::TY_Dependencies)
3826 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003827 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003828 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003829 if (Args.hasArg(options::OPT_rewrite_objc) &&
3830 !Args.hasArg(options::OPT_g_Group))
3831 CmdArgs.push_back("-P");
3832 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003833 } else if (isa<AssembleJobAction>(JA)) {
3834 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003835
David Blaikie9260ed62013-07-25 21:19:01 +00003836 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003837
3838 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003840 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003841 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003842 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003843
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003844 if (JA.getType() == types::TY_Nothing)
3845 CmdArgs.push_back("-fsyntax-only");
3846 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003847 CmdArgs.push_back("-emit-pch");
3848 else
3849 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003850 } else if (isa<VerifyPCHJobAction>(JA)) {
3851 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003852 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003853 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3854 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003855 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003856 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003857 } else if (JA.getType() == types::TY_LLVM_IR ||
3858 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003859 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003860 } else if (JA.getType() == types::TY_LLVM_BC ||
3861 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003862 CmdArgs.push_back("-emit-llvm-bc");
3863 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003864 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003865 } else if (JA.getType() == types::TY_AST) {
3866 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003867 } else if (JA.getType() == types::TY_ModuleFile) {
3868 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003869 } else if (JA.getType() == types::TY_RewrittenObjC) {
3870 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003871 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003872 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3873 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003874 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003875 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003876 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003877 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003878
3879 // Preserve use-list order by default when emitting bitcode, so that
3880 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3881 // same result as running passes here. For LTO, we don't need to preserve
3882 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003883 if (JA.getType() == types::TY_LLVM_BC)
3884 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003885
3886 if (D.isUsingLTO())
3887 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003888 }
3889
Teresa Johnsonaff22322015-12-07 19:21:34 +00003890 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3891 if (!types::isLLVMIR(Input.getType()))
3892 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3893 << "-x ir";
3894 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3895 }
3896
Steven Wu574b0f22016-03-01 01:07:58 +00003897 // Embed-bitcode option.
3898 if (C.getDriver().embedBitcodeEnabled() &&
3899 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3900 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00003901 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00003902 // Disable all llvm IR level optimizations.
3903 CmdArgs.push_back("-disable-llvm-optzns");
3904 }
3905 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00003906 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00003907
Justin Bognera88f0122014-06-20 22:59:50 +00003908 // We normally speed up the clang process a bit by skipping destructors at
3909 // exit, but when we're generating diagnostics we can rely on some of the
3910 // cleanup.
3911 if (!C.isForDiagnostics())
3912 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003915#ifdef NDEBUG
3916 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003917 // Discard LLVM value names in -asserts builds.
3918 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003919#endif
3920
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003921 // Set the main file name, so that debug info works even with
3922 // -save-temps.
3923 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003924 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003925
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003926 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003927 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003928 if (Args.hasArg(options::OPT_static))
3929 CmdArgs.push_back("-static-define");
3930
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003931 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003932 // Enable region store model by default.
3933 CmdArgs.push_back("-analyzer-store=region");
3934
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003935 // Treat blocks as analysis entry points.
3936 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3937
Ted Kremenek49c79792011-03-24 00:28:47 +00003938 CmdArgs.push_back("-analyzer-eagerly-assume");
3939
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003940 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003941 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003942 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003943
Devin Coughlin65c77082016-01-21 20:09:49 +00003944 if (!IsWindowsMSVC) {
3945 CmdArgs.push_back("-analyzer-checker=unix");
3946 } else {
3947 // Enable "unix" checkers that also work on Windows.
3948 CmdArgs.push_back("-analyzer-checker=unix.API");
3949 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3950 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3951 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3952 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3953 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3954 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003955
Sean Evesonb38c32b2016-01-06 10:03:58 +00003956 // Disable some unix checkers for PS4.
3957 if (IsPS4CPU) {
3958 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3959 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3960 }
3961
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003962 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003963 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003964
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003965 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966
Artem Belevichba558952015-05-06 18:20:23 +00003967 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003968 CmdArgs.push_back("-analyzer-checker=cplusplus");
3969
Sean Evesonb38c32b2016-01-06 10:03:58 +00003970 if (!IsPS4CPU) {
3971 CmdArgs.push_back(
3972 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3973 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3974 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3975 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3976 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3977 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3978 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003979
3980 // Default nullability checks.
3981 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3982 CmdArgs.push_back(
3983 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003984 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003985
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003986 // Set the output format. The default is plist, for (lame) historical
3987 // reasons.
3988 CmdArgs.push_back("-analyzer-output");
3989 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003990 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003991 else
3992 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003993
Ted Kremenekfe449a22010-03-22 22:32:05 +00003994 // Disable the presentation of standard compiler warnings when
3995 // using --analyze. We only want to show static analyzer diagnostics
3996 // or frontend errors.
3997 CmdArgs.push_back("-w");
3998
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003999 // Add -Xanalyzer arguments when running as analyzer.
4000 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00004001 }
4002
Daniel Dunbar4eadb602009-09-10 01:21:12 +00004003 CheckCodeGenerationOptions(D, Args);
4004
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004005 llvm::Reloc::Model RelocationModel;
4006 unsigned PICLevel;
4007 bool IsPIE;
4008 std::tie(RelocationModel, PICLevel, IsPIE) =
4009 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004010
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004011 const char *RMName = RelocationModelName(RelocationModel);
4012 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004013 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004014 CmdArgs.push_back(RMName);
4015 }
4016 if (PICLevel > 0) {
4017 CmdArgs.push_back("-pic-level");
4018 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
4019 if (IsPIE) {
4020 CmdArgs.push_back("-pie-level");
4021 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00004022 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004023 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00004024
Renato Golin4854d802015-11-09 12:40:41 +00004025 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
4026 CmdArgs.push_back("-meabi");
4027 CmdArgs.push_back(A->getValue());
4028 }
4029
Jonathan Roelofsb140a102014-10-03 21:57:44 +00004030 CmdArgs.push_back("-mthread-model");
4031 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
4032 CmdArgs.push_back(A->getValue());
4033 else
4034 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
4035
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00004036 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
4037
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00004038 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
4039 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00004040 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00004041
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004042 // LLVM Code Generator Options.
4043
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004044 if (Args.hasArg(options::OPT_frewrite_map_file) ||
4045 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00004046 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
4047 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004048 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00004049 CmdArgs.push_back(A->getValue());
4050 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004051 }
4052 }
4053
Alp Tokerfb8d02b2014-06-05 22:10:59 +00004054 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
4055 StringRef v = A->getValue();
4056 CmdArgs.push_back("-mllvm");
4057 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
4058 A->claim();
4059 }
4060
Nirav Daved2f44d82016-04-05 17:50:43 +00004061 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
4062 true))
4063 CmdArgs.push_back("-fno-jump-tables");
4064
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004065 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
4066 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00004067 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004068 }
4069
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004070 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4071 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004072 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00004073 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004074 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00004075 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4076 CmdArgs.push_back("-fpcc-struct-return");
4077 } else {
4078 assert(A->getOption().matches(options::OPT_freg_struct_return));
4079 CmdArgs.push_back("-freg-struct-return");
4080 }
4081 }
4082
Roman Divacky65b88cd2011-03-01 17:40:53 +00004083 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Alexey Bataeva7547182016-05-18 09:06:38 +00004084 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divacky65b88cd2011-03-01 17:40:53 +00004085
Rafael Espindola224dd632011-12-14 21:02:23 +00004086 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004087 CmdArgs.push_back("-mdisable-fp-elim");
4088 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4089 options::OPT_fno_zero_initialized_in_bss))
4090 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004091
4092 bool OFastEnabled = isOptimizationLevelFast(Args);
4093 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4094 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004095 OptSpecifier StrictAliasingAliasOption =
4096 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004097 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4098 // doesn't do any TBAA.
4099 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004100 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004101 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00004102 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00004103 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4104 options::OPT_fno_struct_path_tbaa))
4105 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00004106 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4107 false))
4108 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004109 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
4110 options::OPT_fno_strict_vtable_pointers,
4111 false))
4112 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00004113 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4114 options::OPT_fno_optimize_sibling_calls))
4115 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004116
Eric Christopher006208c2013-04-04 06:29:47 +00004117 // Handle segmented stacks.
4118 if (Args.hasArg(options::OPT_fsplit_stack))
4119 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004120
4121 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4122 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004123 OptSpecifier FastMathAliasOption =
4124 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4125
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004126 // Handle various floating point optimization flags, mapping them to the
4127 // appropriate LLVM code generation flags. The pattern for all of these is to
4128 // default off the codegen optimizations, and if any flag enables them and no
4129 // flag disables them after the flag enabling them, enable the codegen
4130 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004131 if (Arg *A = Args.getLastArg(
4132 options::OPT_ffast_math, FastMathAliasOption,
4133 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4134 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4135 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004136 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4137 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004138 A->getOption().getID() != options::OPT_fhonor_infinities)
4139 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004140 if (Arg *A = Args.getLastArg(
4141 options::OPT_ffast_math, FastMathAliasOption,
4142 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4143 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4144 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004145 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4146 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004147 A->getOption().getID() != options::OPT_fhonor_nans)
4148 CmdArgs.push_back("-menable-no-nans");
4149
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004150 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4151 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004152 if (Arg *A =
4153 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4154 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4155 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004156 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4157 // However, turning *off* -ffast_math merely restores the toolchain default
4158 // (which may be false).
4159 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4160 A->getOption().getID() == options::OPT_ffast_math ||
4161 A->getOption().getID() == options::OPT_Ofast)
4162 MathErrno = false;
4163 else if (A->getOption().getID() == options::OPT_fmath_errno)
4164 MathErrno = true;
4165 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004166 if (MathErrno)
4167 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004168
4169 // There are several flags which require disabling very specific
4170 // optimizations. Any of these being disabled forces us to turn off the
4171 // entire set of LLVM optimizations, so collect them through all the flag
4172 // madness.
4173 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004174 if (Arg *A = Args.getLastArg(
4175 options::OPT_ffast_math, FastMathAliasOption,
4176 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4177 options::OPT_fno_unsafe_math_optimizations,
4178 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004179 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4180 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004181 A->getOption().getID() != options::OPT_fno_associative_math)
4182 AssociativeMath = true;
4183 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004184 if (Arg *A = Args.getLastArg(
4185 options::OPT_ffast_math, FastMathAliasOption,
4186 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4187 options::OPT_fno_unsafe_math_optimizations,
4188 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004189 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4190 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004191 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4192 ReciprocalMath = true;
4193 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004194 if (Arg *A = Args.getLastArg(
4195 options::OPT_ffast_math, FastMathAliasOption,
4196 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4197 options::OPT_fno_unsafe_math_optimizations,
4198 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004199 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4200 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004201 A->getOption().getID() != options::OPT_fsigned_zeros)
4202 SignedZeros = false;
4203 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004204 if (Arg *A = Args.getLastArg(
4205 options::OPT_ffast_math, FastMathAliasOption,
4206 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4207 options::OPT_fno_unsafe_math_optimizations,
4208 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004209 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4210 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004211 A->getOption().getID() != options::OPT_ftrapping_math)
4212 TrappingMath = false;
4213 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4214 !TrappingMath)
4215 CmdArgs.push_back("-menable-unsafe-fp-math");
4216
Sanjay Patel76c9e092015-01-23 16:40:50 +00004217 if (!SignedZeros)
4218 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004219
Sanjay Patel359b1052015-04-09 15:03:23 +00004220 if (ReciprocalMath)
4221 CmdArgs.push_back("-freciprocal-math");
4222
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004223 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004224 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004225 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004226 options::OPT_ffp_contract)) {
4227 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004228 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004229 if (Val == "fast" || Val == "on" || Val == "off") {
4230 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4231 } else {
4232 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004233 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004234 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004235 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4236 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004237 // If fast-math is set then set the fp-contract mode to fast.
4238 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4239 }
4240 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004241
Sanjay Patel2987c292015-06-11 14:53:41 +00004242 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004243
Bob Wilson6a039162012-07-19 03:52:53 +00004244 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4245 // and if we find them, tell the frontend to provide the appropriate
4246 // preprocessor macros. This is distinct from enabling any optimizations as
4247 // these options induce language changes which must survive serialization
4248 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004249 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4250 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004251 if (!A->getOption().matches(options::OPT_fno_fast_math))
4252 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004253 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4254 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004255 if (A->getOption().matches(options::OPT_ffinite_math_only))
4256 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004257
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004258 // Decide whether to use verbose asm. Verbose assembly is the default on
4259 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004260 bool IsIntegratedAssemblerDefault =
4261 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004262 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004263 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004264 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004265 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004266
Rafael Espindolab8a12932015-05-22 20:44:03 +00004267 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4268 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004269 CmdArgs.push_back("-no-integrated-as");
4270
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004271 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4272 CmdArgs.push_back("-mdebug-pass");
4273 CmdArgs.push_back("Structure");
4274 }
4275 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4276 CmdArgs.push_back("-mdebug-pass");
4277 CmdArgs.push_back("Arguments");
4278 }
4279
Justin Lebar710a35f2016-01-25 22:36:35 +00004280 // Enable -mconstructor-aliases except on darwin, where we have to work around
4281 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4282 // aliases aren't supported.
4283 if (!getToolChain().getTriple().isOSDarwin() &&
4284 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004285 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004286
John McCall7ef5cb32011-03-18 02:56:14 +00004287 // Darwin's kernel doesn't support guard variables; just die if we
4288 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004289 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004290 CmdArgs.push_back("-fforbid-guard-variables");
4291
Akira Hatanaka02028482015-11-12 17:21:22 +00004292 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4293 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004294 CmdArgs.push_back("-mms-bitfields");
4295 }
John McCall8517abc2010-02-19 02:45:38 +00004296
Daniel Dunbar306945d2009-09-16 06:17:29 +00004297 // This is a coarse approximation of what llvm-gcc actually does, both
4298 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4299 // complicated ways.
4300 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004301 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4302 options::OPT_fno_asynchronous_unwind_tables,
4303 (getToolChain().IsUnwindTablesDefault() ||
4304 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4305 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004306 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4307 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004308 CmdArgs.push_back("-munwind-tables");
4309
Chandler Carruth05fb5852012-11-21 23:40:23 +00004310 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004311
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004312 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4313 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004314 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004315 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004316
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004317 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004318 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004319
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004320 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004321 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004322 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004323 }
4324
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004325 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004326 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004327 if (!CPU.empty()) {
4328 CmdArgs.push_back("-target-cpu");
4329 CmdArgs.push_back(Args.MakeArgString(CPU));
4330 }
4331
Rafael Espindolaeb265472013-08-21 21:59:03 +00004332 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4333 CmdArgs.push_back("-mfpmath");
4334 CmdArgs.push_back(A->getValue());
4335 }
4336
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004337 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004338 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004339
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004340 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004341 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004342 default:
4343 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004344
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004345 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004346 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004347 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004348 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004349 // Use the effective triple, which takes into account the deployment target.
4350 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004351 break;
4352
Tim Northover573cbee2014-05-24 12:52:07 +00004353 case llvm::Triple::aarch64:
4354 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004355 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004356 break;
4357
Eric Christopher0b26a612010-03-02 02:41:08 +00004358 case llvm::Triple::mips:
4359 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004360 case llvm::Triple::mips64:
4361 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004362 AddMIPSTargetArgs(Args, CmdArgs);
4363 break;
4364
Ulrich Weigand8afad612014-07-28 13:17:52 +00004365 case llvm::Triple::ppc:
4366 case llvm::Triple::ppc64:
4367 case llvm::Triple::ppc64le:
4368 AddPPCTargetArgs(Args, CmdArgs);
4369 break;
4370
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004371 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004372 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004373 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004374 AddSparcTargetArgs(Args, CmdArgs);
4375 break;
4376
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004377 case llvm::Triple::systemz:
4378 AddSystemZTargetArgs(Args, CmdArgs);
4379 break;
4380
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004381 case llvm::Triple::x86:
4382 case llvm::Triple::x86_64:
4383 AddX86TargetArgs(Args, CmdArgs);
4384 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004385
Jacques Pienaard964cc22016-03-28 21:02:54 +00004386 case llvm::Triple::lanai:
4387 AddLanaiTargetArgs(Args, CmdArgs);
4388 break;
4389
Tony Linthicum76329bf2011-12-12 21:14:55 +00004390 case llvm::Triple::hexagon:
4391 AddHexagonTargetArgs(Args, CmdArgs);
4392 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004393
4394 case llvm::Triple::wasm32:
4395 case llvm::Triple::wasm64:
4396 AddWebAssemblyTargetArgs(Args, CmdArgs);
4397 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004398 }
4399
Douglas Katzman3459ce22015-10-08 04:24:12 +00004400 // The 'g' groups options involve a somewhat intricate sequence of decisions
4401 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004402 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004403 // * what level of debug info to generate
4404 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004405 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004406 // This avoids having to monkey around further in cc1 other than to disable
4407 // codeview if not running in a Windows environment. Perhaps even that
4408 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004409 unsigned DwarfVersion = 0;
4410 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4411 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004412 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004413 bool EmitCodeView = false;
4414
Hans Wennborg75958c42013-08-08 00:17:41 +00004415 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004416 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004417 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004418 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004419
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004420 // Pass the linker version in use.
4421 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4422 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004423 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004424 }
4425
Eric Christopherb7d97e92013-04-03 01:58:53 +00004426 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004427 CmdArgs.push_back("-momit-leaf-frame-pointer");
4428
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004429 // Explicitly error on some things we know we don't support and can't just
4430 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004431 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4432 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004433 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004434 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004435 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4436 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004437 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004438 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004439 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004440 }
4441
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004442 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004443 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004444 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004445 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004446 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4447 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004448 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004449 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004450 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004451
Chad Rosierbe10f982011-08-02 17:58:04 +00004452 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004453 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004454 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4455 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004456 }
4457
Rafael Espindola08a692a2010-03-07 04:46:18 +00004458 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004459 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004460 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004461 // If the last option explicitly specified a debug-info level, use it.
4462 if (A->getOption().matches(options::OPT_gN_Group)) {
4463 DebugInfoKind = DebugLevelToInfoKind(*A);
4464 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4465 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4466 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004467 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004468 A->getIndex() > SplitDwarfArg->getIndex())
4469 SplitDwarfArg = nullptr;
4470 } else
4471 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004472 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004473 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004474
Paul Robinson0334a042015-12-19 19:41:48 +00004475 // If a debugger tuning argument appeared, remember it.
4476 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4477 options::OPT_ggdbN_Group)) {
4478 if (A->getOption().matches(options::OPT_glldb))
4479 DebuggerTuning = llvm::DebuggerKind::LLDB;
4480 else if (A->getOption().matches(options::OPT_gsce))
4481 DebuggerTuning = llvm::DebuggerKind::SCE;
4482 else
4483 DebuggerTuning = llvm::DebuggerKind::GDB;
4484 }
4485
4486 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004487 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004488 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004489 DwarfVersion = DwarfVersionNum(A->getSpelling());
4490
Reid Kleckner124955a2015-08-05 18:51:13 +00004491 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004492 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4493 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4494 // DwarfVersion remains at 0 if no explicit choice was made.
4495 CmdArgs.push_back("-gcodeview");
4496 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004497 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004498 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4499 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004500
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004501 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4502 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004503
4504 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004505 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004506 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004507 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004508
Eric Christopher138c32b2013-09-13 22:37:55 +00004509 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004510 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004511 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004512 CmdArgs.push_back("-dwarf-ext-refs");
4513 CmdArgs.push_back("-fmodule-format=obj");
4514 }
4515
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004516 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4517 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004518 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004519 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004520 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004521 CmdArgs.push_back("-backend-option");
4522 CmdArgs.push_back("-split-dwarf=Enable");
4523 }
4524
Douglas Katzman3459ce22015-10-08 04:24:12 +00004525 // After we've dealt with all combinations of things that could
4526 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4527 // figure out if we need to "upgrade" it to standalone debug info.
4528 // We parse these two '-f' options whether or not they will be used,
4529 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4530 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4531 options::OPT_fno_standalone_debug,
4532 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004533 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4534 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004535 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4536 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004537
Eric Christopher138c32b2013-09-13 22:37:55 +00004538 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4539 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4540 CmdArgs.push_back("-backend-option");
4541 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4542 }
Eric Christophereec89c22013-06-18 00:03:50 +00004543
Eric Christopher0d403d22014-02-14 01:27:03 +00004544 // -gdwarf-aranges turns on the emission of the aranges section in the
4545 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004546 // Always enabled on the PS4.
4547 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004548 CmdArgs.push_back("-backend-option");
4549 CmdArgs.push_back("-generate-arange-section");
4550 }
4551
David Blaikief36d9ba2014-01-27 18:52:43 +00004552 if (Args.hasFlag(options::OPT_fdebug_types_section,
4553 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004554 CmdArgs.push_back("-backend-option");
4555 CmdArgs.push_back("-generate-type-units");
4556 }
Eric Christophereec89c22013-06-18 00:03:50 +00004557
Dan Gohmana5b804b2016-01-07 00:50:27 +00004558 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4559 // default.
4560 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4561 Triple.getArch() == llvm::Triple::wasm32 ||
4562 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004563
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004564 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004565 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004566 CmdArgs.push_back("-ffunction-sections");
4567 }
4568
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004569 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4570 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004571 CmdArgs.push_back("-fdata-sections");
4572 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004573
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004574 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004575 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004576 CmdArgs.push_back("-fno-unique-section-names");
4577
Chris Lattner3c77a352010-06-22 00:03:40 +00004578 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4579
Diego Novilloa0545962015-07-10 18:00:07 +00004580 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004581
Paul Robinsond083b9a2015-12-16 17:25:27 +00004582 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4583 if (getToolChain().getTriple().isPS4CPU())
4584 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4585
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004586 // Pass options for controlling the default header search paths.
4587 if (Args.hasArg(options::OPT_nostdinc)) {
4588 CmdArgs.push_back("-nostdsysteminc");
4589 CmdArgs.push_back("-nobuiltininc");
4590 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004591 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004592 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004593 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4594 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4595 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004596
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004597 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004598 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004599 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004600
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004601 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4602
Ted Kremenekf7639e12012-03-06 20:06:33 +00004603 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004604 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004605 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004606 options::OPT_ccc_arcmt_modify,
4607 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004608 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004609 switch (A->getOption().getID()) {
4610 default:
4611 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004612 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004613 CmdArgs.push_back("-arcmt-check");
4614 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004615 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004616 CmdArgs.push_back("-arcmt-modify");
4617 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004618 case options::OPT_ccc_arcmt_migrate:
4619 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004620 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004621 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004622
4623 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4624 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004625 break;
John McCalld70fb982011-06-15 23:25:17 +00004626 }
4627 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004628 } else {
4629 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4630 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4631 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004632 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004633
Ted Kremenekf7639e12012-03-06 20:06:33 +00004634 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4635 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004636 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4637 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004638 }
4639 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004640 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004641
4642 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004643 options::OPT_objcmt_migrate_subscripting,
4644 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004645 // None specified, means enable them all.
4646 CmdArgs.push_back("-objcmt-migrate-literals");
4647 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004648 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004649 } else {
4650 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4651 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004652 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004653 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004654 } else {
4655 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4656 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4657 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4658 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4659 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4660 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004661 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004662 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4663 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4664 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4665 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4666 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4667 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4668 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004669 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004670 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004671 }
4672
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004673 // Add preprocessing options like -I, -D, etc. if we are using the
4674 // preprocessor.
4675 //
4676 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004677 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004678 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4679 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004680
Rafael Espindolaa7431922011-07-21 23:40:37 +00004681 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4682 // that "The compiler can only warn and ignore the option if not recognized".
4683 // When building with ccache, it will pass -D options to clang even on
4684 // preprocessed inputs and configure concludes that -fPIC is not supported.
4685 Args.ClaimAllArgs(options::OPT_D);
4686
Alp Toker7874bdc2013-11-15 20:40:58 +00004687 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004688 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4689 if (A->getOption().matches(options::OPT_O4)) {
4690 CmdArgs.push_back("-O3");
4691 D.Diag(diag::warn_O4_is_O3);
4692 } else {
4693 A->render(Args, CmdArgs);
4694 }
4695 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004696
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004697 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004698 for (const Arg *A :
4699 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4700 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004701 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004702 }
4703
Rafael Espindola577637a2015-01-03 00:06:04 +00004704 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004705
Richard Smith3be1cb22014-08-07 00:24:21 +00004706 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004707 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004708 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4709 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004710 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004711 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004712
4713 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004714 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004715 //
4716 // If a std is supplied, only add -trigraphs if it follows the
4717 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004718 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004719 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4720 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004721 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004722 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004723 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004724 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004725 else
4726 Std->render(Args, CmdArgs);
4727
Nico Weber00721502014-12-23 22:32:37 +00004728 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004729 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004730 options::OPT_ftrigraphs,
4731 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004732 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004733 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004734 } else {
4735 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004736 //
4737 // FIXME: Clang doesn't correctly handle -std= when the input language
4738 // doesn't match. For the time being just ignore this for C++ inputs;
4739 // eventually we want to do all the standard defaulting here instead of
4740 // splitting it between the driver and clang -cc1.
4741 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4743 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004744 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004745 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004746
Nico Weber00721502014-12-23 22:32:37 +00004747 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4748 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004749 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004750
Richard Smith282b4492013-09-04 22:50:31 +00004751 // GCC's behavior for -Wwrite-strings is a bit strange:
4752 // * In C, this "warning flag" changes the types of string literals from
4753 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4754 // for the discarded qualifier.
4755 // * In C++, this is just a normal warning flag.
4756 //
4757 // Implementing this warning correctly in C is hard, so we follow GCC's
4758 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4759 // a non-const char* in C, rather than using this crude hack.
4760 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004761 // FIXME: This should behave just like a warning flag, and thus should also
4762 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4763 Arg *WriteStrings =
4764 Args.getLastArg(options::OPT_Wwrite_strings,
4765 options::OPT_Wno_write_strings, options::OPT_w);
4766 if (WriteStrings &&
4767 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004768 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004769 }
4770
Chandler Carruth61fbf622011-04-23 09:27:53 +00004771 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004772 // during C++ compilation, which it is by default. GCC keeps this define even
4773 // in the presence of '-w', match this behavior bug-for-bug.
4774 if (types::isCXX(InputType) &&
4775 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4776 true)) {
4777 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004778 }
4779
Chandler Carruthe0391482010-05-22 02:21:53 +00004780 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4781 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4782 if (Asm->getOption().matches(options::OPT_fasm))
4783 CmdArgs.push_back("-fgnu-keywords");
4784 else
4785 CmdArgs.push_back("-fno-gnu-keywords");
4786 }
4787
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004788 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4789 CmdArgs.push_back("-fno-dwarf-directory-asm");
4790
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004791 if (ShouldDisableAutolink(Args, getToolChain()))
4792 CmdArgs.push_back("-fno-autolink");
4793
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004794 // Add in -fdebug-compilation-dir if necessary.
4795 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004796
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004797 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4798 StringRef Map = A->getValue();
4799 if (Map.find('=') == StringRef::npos)
4800 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4801 else
4802 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4803 A->claim();
4804 }
4805
Richard Smith9a568822011-11-21 19:36:32 +00004806 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4807 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004808 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004809 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004810 }
4811
Richard Smith79c927b2013-11-06 19:31:51 +00004812 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4813 CmdArgs.push_back("-foperator-arrow-depth");
4814 CmdArgs.push_back(A->getValue());
4815 }
4816
Richard Smith9a568822011-11-21 19:36:32 +00004817 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4818 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004819 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004820 }
4821
Richard Smitha3d3bd22013-05-08 02:12:03 +00004822 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4823 CmdArgs.push_back("-fconstexpr-steps");
4824 CmdArgs.push_back(A->getValue());
4825 }
4826
Richard Smithb3a14522013-02-22 01:59:51 +00004827 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4828 CmdArgs.push_back("-fbracket-depth");
4829 CmdArgs.push_back(A->getValue());
4830 }
4831
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004832 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4833 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004834 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004835 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004836 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4837 } else
4838 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004839 }
4840
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004841 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004842 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004843
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004844 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4845 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004846 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004847 }
David Chisnall5778fce2009-08-31 16:41:57 +00004848
Chris Lattnere23003d2010-01-09 21:54:33 +00004849 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4850 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004851 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004852 }
4853
Chris Lattnerb35583d2010-04-07 20:49:23 +00004854 CmdArgs.push_back("-ferror-limit");
4855 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004856 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004857 else
4858 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004859
Chandler Carrutha77a7272010-05-06 04:55:18 +00004860 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4861 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004862 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004863 }
4864
4865 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4866 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004867 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004868 }
4869
Richard Smithf6f003a2011-12-16 19:06:07 +00004870 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4871 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004872 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004873 }
4874
Nick Lewycky24653262014-12-16 21:39:02 +00004875 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4876 CmdArgs.push_back("-fspell-checking-limit");
4877 CmdArgs.push_back(A->getValue());
4878 }
4879
Daniel Dunbar2c978472009-11-04 06:24:47 +00004880 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004881 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004882 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004883 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004884 } else {
4885 // If -fmessage-length=N was not specified, determine whether this is a
4886 // terminal and, if so, implicitly define -fmessage-length appropriately.
4887 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004888 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004889 }
4890
John McCallb4a99d32013-02-19 01:57:35 +00004891 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4892 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4893 options::OPT_fvisibility_ms_compat)) {
4894 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4895 CmdArgs.push_back("-fvisibility");
4896 CmdArgs.push_back(A->getValue());
4897 } else {
4898 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4899 CmdArgs.push_back("-fvisibility");
4900 CmdArgs.push_back("hidden");
4901 CmdArgs.push_back("-ftype-visibility");
4902 CmdArgs.push_back("default");
4903 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004904 }
4905
Douglas Gregor08329632010-06-15 17:05:35 +00004906 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004907
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004908 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4909
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004910 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004911 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4912 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004913 CmdArgs.push_back("-ffreestanding");
4914
Daniel Dunbare357d562009-12-03 18:42:11 +00004915 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004916 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004917 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004918 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004919 // Emulated TLS is enabled by default on Android, and can be enabled manually
4920 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004921 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004922 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4923 EmulatedTLSDefault))
4924 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004925 // AltiVec-like language extensions aren't relevant for assembling.
4926 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004927 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004928 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4929 }
Richard Trieu91844232012-06-26 18:18:47 +00004930 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4931 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004932
Alexey Bataevdb390212015-05-20 04:24:19 +00004933 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004934 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004935 options::OPT_fno_openmp, false)) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004936 switch (getOpenMPRuntime(getToolChain(), Args)) {
4937 case OMPRT_OMP:
4938 case OMPRT_IOMP5:
4939 // Clang can generate useful OpenMP code for these two runtime libraries.
4940 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004941
4942 // If no option regarding the use of TLS in OpenMP codegeneration is
4943 // given, decide a default based on the target. Otherwise rely on the
4944 // options and pass the right information to the frontend.
4945 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004946 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004947 CmdArgs.push_back("-fnoopenmp-use-tls");
Alexey Bataev18c48522016-05-27 04:13:39 +00004948 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004949 break;
4950 default:
4951 // By default, if Clang doesn't know how to generate useful OpenMP code
4952 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4953 // down to the actual compilation.
4954 // FIXME: It would be better to have a mode which *only* omits IR
4955 // generation based on the OpenMP support so that we get consistent
4956 // semantic analysis, etc.
4957 break;
4958 }
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004959 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004960
Peter Collingbourne32701642013-11-01 18:16:25 +00004961 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004962 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004963
Eric Christopher459d2712013-02-19 06:16:53 +00004964 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004965 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4966 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4967 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4968 Arch == llvm::Triple::ppc64le))
4969 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4970 << "ppc/ppc64/ppc64le";
4971 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004972
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004973 // -fzvector is incompatible with -faltivec.
4974 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4975 if (Args.hasArg(options::OPT_faltivec))
4976 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4977 << "-faltivec";
4978
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004979 if (getToolChain().SupportsProfiling())
4980 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004981
4982 // -flax-vector-conversions is default.
4983 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4984 options::OPT_fno_lax_vector_conversions))
4985 CmdArgs.push_back("-fno-lax-vector-conversions");
4986
John Brawna7b4ec02015-08-10 11:11:28 +00004987 if (Args.getLastArg(options::OPT_fapple_kext) ||
4988 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004989 CmdArgs.push_back("-fapple-kext");
4990
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004991 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004992 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004993 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004994 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4995 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004996
4997 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4998 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004999 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00005000 }
5001
Bob Wilson14adb362012-02-03 06:27:22 +00005002 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00005003
Chandler Carruth6e501032011-03-27 00:04:55 +00005004 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
5005 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005006 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00005007 if (A->getOption().matches(options::OPT_fwrapv))
5008 CmdArgs.push_back("-fwrapv");
5009 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
5010 options::OPT_fno_strict_overflow)) {
5011 if (A->getOption().matches(options::OPT_fno_strict_overflow))
5012 CmdArgs.push_back("-fwrapv");
5013 }
Hal Finkelce0697f2013-11-17 16:03:29 +00005014
5015 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
5016 options::OPT_fno_reroll_loops))
5017 if (A->getOption().matches(options::OPT_freroll_loops))
5018 CmdArgs.push_back("-freroll-loops");
5019
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005020 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00005021 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
5022 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005023
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00005024 Args.AddLastArg(CmdArgs, options::OPT_pthread);
5025
Daniel Dunbar4930e332009-11-17 08:07:36 +00005026 // -stack-protector=0 is default.
5027 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00005028 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
5029 options::OPT_fstack_protector_all,
5030 options::OPT_fstack_protector_strong,
5031 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00005032 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 StackProtectorLevel = std::max<unsigned>(
5034 LangOptions::SSPOn,
5035 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00005036 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005037 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00005038 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005039 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00005040 } else {
5041 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005042 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00005043 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00005044 if (StackProtectorLevel) {
5045 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005046 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005047 }
Chad Rosierdb3da832012-08-21 16:16:06 +00005048
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005049 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00005050 for (const Arg *A : Args.filtered(options::OPT__param)) {
5051 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005052 if (Str.startswith("ssp-buffer-size=")) {
5053 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00005054 CmdArgs.push_back("-stack-protector-buffer-size");
5055 // FIXME: Verify the argument is a valid integer.
5056 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00005057 }
Sean Silva14facf32015-06-09 01:57:17 +00005058 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00005059 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00005060 }
5061
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005062 // Translate -mstackrealign
5063 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00005064 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005065 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005066
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00005067 if (Args.hasArg(options::OPT_mstack_alignment)) {
5068 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5069 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00005070 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00005071
Hans Wennborg77dc2362015-01-20 19:45:50 +00005072 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5073 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5074
5075 if (!Size.empty())
5076 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5077 else
5078 CmdArgs.push_back("-mstack-probe-size=0");
5079 }
5080
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005081 switch (getToolChain().getArch()) {
5082 case llvm::Triple::aarch64:
5083 case llvm::Triple::aarch64_be:
5084 case llvm::Triple::arm:
5085 case llvm::Triple::armeb:
5086 case llvm::Triple::thumb:
5087 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005088 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005089 break;
5090
5091 default:
5092 break;
5093 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005094
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005095 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5096 options::OPT_mno_restrict_it)) {
5097 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5098 CmdArgs.push_back("-backend-option");
5099 CmdArgs.push_back("-arm-restrict-it");
5100 } else {
5101 CmdArgs.push_back("-backend-option");
5102 CmdArgs.push_back("-arm-no-restrict-it");
5103 }
James Y Knight2db38f32015-08-15 03:45:25 +00005104 } else if (Triple.isOSWindows() &&
5105 (Triple.getArch() == llvm::Triple::arm ||
5106 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00005107 // Windows on ARM expects restricted IT blocks
5108 CmdArgs.push_back("-backend-option");
5109 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005110 }
5111
Daniel Dunbard18049a2009-04-07 21:16:11 +00005112 // Forward -f options with positive and negative forms; we translate
5113 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005114 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5115 StringRef fname = A->getValue();
5116 if (!llvm::sys::fs::exists(fname))
5117 D.Diag(diag::err_drv_no_such_file) << fname;
5118 else
5119 A->render(Args, CmdArgs);
5120 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005121
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005122 // -fbuiltin is default unless -mkernel is used.
5123 bool UseBuiltins =
5124 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5125 !Args.hasArg(options::OPT_mkernel));
5126 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005127 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005128
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005129 // -ffreestanding implies -fno-builtin.
5130 if (Args.hasArg(options::OPT_ffreestanding))
5131 UseBuiltins = false;
5132
5133 // Process the -fno-builtin-* options.
5134 for (const auto &Arg : Args) {
5135 const Option &O = Arg->getOption();
5136 if (!O.matches(options::OPT_fno_builtin_))
5137 continue;
5138
5139 Arg->claim();
5140 // If -fno-builtin is specified, then there's no need to pass the option to
5141 // the frontend.
5142 if (!UseBuiltins)
5143 continue;
5144
5145 StringRef FuncName = Arg->getValue();
5146 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5147 }
5148
Nuno Lopes13c88c72009-12-16 16:59:22 +00005149 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5150 options::OPT_fno_assume_sane_operator_new))
5151 CmdArgs.push_back("-fno-assume-sane-operator-new");
5152
Daniel Dunbar4930e332009-11-17 08:07:36 +00005153 // -fblocks=0 is default.
5154 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005155 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005156 (Args.hasArg(options::OPT_fgnu_runtime) &&
5157 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5158 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005159 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005161 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005162 !getToolChain().hasBlocksRuntime())
5163 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005164 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005165
Richard Smith47972af2015-06-16 00:08:24 +00005166 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005167 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005168 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005169 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005170 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5172 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005173 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005174 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005175 HaveModules = true;
5176 }
5177 }
5178
Richard Smith47972af2015-06-16 00:08:24 +00005179 // -fmodule-maps enables implicit reading of module map files. By default,
5180 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005181 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5182 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005183 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005184 }
5185
Daniel Jasperac42b752013-10-21 06:34:34 +00005186 // -fmodules-decluse checks that modules used are declared so (off by
5187 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005188 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005189 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005190 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005191 }
5192
Daniel Jasper962b38e2014-04-11 11:47:45 +00005193 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5194 // all #included headers are part of modules.
5195 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005196 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005197 CmdArgs.push_back("-fmodules-strict-decluse");
5198 }
5199
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005200 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5201 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5202 options::OPT_fno_implicit_modules)) {
5203 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005204 } else if (HaveModules) {
5205 // -fmodule-cache-path specifies where our implicitly-built module files
5206 // should be written.
5207 SmallString<128> Path;
5208 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5209 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005210 if (C.isForDiagnostics()) {
5211 // When generating crash reports, we want to emit the modules along with
5212 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005213 Path = Output.getFilename();
5214 llvm::sys::path::replace_extension(Path, ".cache");
5215 llvm::sys::path::append(Path, "modules");
5216 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005217 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005218 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005219 llvm::sys::path::append(Path, "org.llvm.clang.");
5220 appendUserToPath(Path);
5221 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005222 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005223 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005224 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5225 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005226 }
5227
Richard Smith8d83d6d2016-03-21 19:06:06 +00005228 // -fmodule-name specifies the module that is currently being built (or
5229 // used for header checking by -fmodule-maps).
5230 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5231
5232 // -fmodule-map-file can be used to specify files containing module
5233 // definitions.
5234 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5235
5236 // -fmodule-file can be used to specify files containing precompiled modules.
5237 if (HaveModules)
5238 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5239 else
5240 Args.ClaimAllArgs(options::OPT_fmodule_file);
5241
Justin Bognera88f0122014-06-20 22:59:50 +00005242 // When building modules and generating crashdumps, we need to dump a module
5243 // dependency VFS alongside the output.
5244 if (HaveModules && C.isForDiagnostics()) {
5245 SmallString<128> VFSDir(Output.getFilename());
5246 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005247 // Add the cache directory as a temp so the crash diagnostics pick it up.
5248 C.addTempFile(Args.MakeArgString(VFSDir));
5249
Justin Bognera88f0122014-06-20 22:59:50 +00005250 llvm::sys::path::append(VFSDir, "vfs");
5251 CmdArgs.push_back("-module-dependency-dir");
5252 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005253 }
5254
Richard Smith9887d792014-10-17 01:42:53 +00005255 if (HaveModules)
5256 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005257
Douglas Gregor35b04d62013-02-07 19:01:24 +00005258 // Pass through all -fmodules-ignore-macro arguments.
5259 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005260 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5261 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005262
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005263 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5264
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005265 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5266 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5267 D.Diag(diag::err_drv_argument_not_allowed_with)
5268 << A->getAsString(Args) << "-fbuild-session-timestamp";
5269
5270 llvm::sys::fs::file_status Status;
5271 if (llvm::sys::fs::status(A->getValue(), Status))
5272 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005273 CmdArgs.push_back(Args.MakeArgString(
5274 "-fbuild-session-timestamp=" +
5275 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005276 }
5277
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005278 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005279 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5280 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005281 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5282
5283 Args.AddLastArg(CmdArgs,
5284 options::OPT_fmodules_validate_once_per_build_session);
5285 }
5286
Ben Langmuirdcf73862014-03-12 00:06:17 +00005287 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5288
John McCalldfea9982010-04-09 19:12:06 +00005289 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005290 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005291 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005292 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005293
Anders Carlssond470fef2010-11-21 00:09:52 +00005294 // -felide-constructors is the default.
5295 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005296 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005297 CmdArgs.push_back("-fno-elide-constructors");
5298
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005299 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005300
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005301 if (KernelOrKext || (types::isCXX(InputType) &&
5302 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5303 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005304 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005305
Tony Linthicum76329bf2011-12-12 21:14:55 +00005306 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005307 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5308 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005309 CmdArgs.push_back("-fshort-enums");
5310
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005311 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005312 if (Arg *A = Args.getLastArg(
5313 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5314 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5315 if (A->getOption().matches(options::OPT_funsigned_char) ||
5316 A->getOption().matches(options::OPT_fno_signed_char)) {
5317 CmdArgs.push_back("-fno-signed-char");
5318 }
5319 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005320 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005321 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005322
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005323 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005324 if (!Args.hasFlag(
5325 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5326 !IsWindowsCygnus && !IsWindowsGNU &&
5327 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5328 getToolChain().getArch() != llvm::Triple::hexagon &&
5329 getToolChain().getArch() != llvm::Triple::xcore &&
5330 ((getToolChain().getTriple().getVendor() !=
5331 llvm::Triple::MipsTechnologies) ||
5332 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005333 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005334 CmdArgs.push_back("-fno-use-cxa-atexit");
5335
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005336 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005337 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005338 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005339 CmdArgs.push_back("-fms-extensions");
5340
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005341 // -fno-use-line-directives is default.
5342 if (Args.hasFlag(options::OPT_fuse_line_directives,
5343 options::OPT_fno_use_line_directives, false))
5344 CmdArgs.push_back("-fuse-line-directives");
5345
Francois Pichet1b4f1632011-09-17 04:32:15 +00005346 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005348 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005349 (IsWindowsMSVC &&
5350 Args.hasFlag(options::OPT_fms_extensions,
5351 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005352 CmdArgs.push_back("-fms-compatibility");
5353
David Majnemerc371ff02015-03-22 08:39:22 +00005354 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005355 VersionTuple MSVT = visualstudio::getMSVCVersion(
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00005356 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +00005357 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005358 CmdArgs.push_back(
5359 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005360
David Majnemer8db91762015-05-18 04:49:30 +00005361 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5362 if (ImplyVCPPCXXVer) {
5363 if (IsMSVC2015Compatible)
5364 CmdArgs.push_back("-std=c++14");
5365 else
5366 CmdArgs.push_back("-std=c++11");
5367 }
5368
Eric Christopher5ecce122013-02-18 00:38:31 +00005369 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005370 if (Args.hasFlag(options::OPT_fborland_extensions,
5371 options::OPT_fno_borland_extensions, false))
5372 CmdArgs.push_back("-fborland-extensions");
5373
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005374 // -fno-declspec is default, except for PS4.
5375 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5376 getToolChain().getTriple().isPS4()))
5377 CmdArgs.push_back("-fdeclspec");
5378 else if (Args.hasArg(options::OPT_fno_declspec))
5379 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5380
David Majnemerc371ff02015-03-22 08:39:22 +00005381 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5382 // than 19.
5383 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5384 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005385 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005386 CmdArgs.push_back("-fno-threadsafe-statics");
5387
Francois Pichet02744872011-09-01 16:38:08 +00005388 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5389 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005390 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005391 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005392 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005393
Chandler Carruthe03aa552010-04-17 20:17:31 +00005394 // -fgnu-keywords default varies depending on language; only pass if
5395 // specified.
5396 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005397 options::OPT_fno_gnu_keywords))
5398 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005400 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005401 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005402 CmdArgs.push_back("-fgnu89-inline");
5403
Chad Rosier9c76d242012-03-15 22:31:42 +00005404 if (Args.hasArg(options::OPT_fno_inline))
5405 CmdArgs.push_back("-fno-inline");
5406
Hans Wennborg7a008882016-05-24 20:40:51 +00005407 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
5408 options::OPT_fno_inline_functions))
5409 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005410
John McCall5fb5df92012-06-20 06:18:46 +00005411 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005412
John McCall5fb5df92012-06-20 06:18:46 +00005413 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005414 // legacy is the default. Except for deployment taget of 10.5,
5415 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5416 // gets ignored silently.
5417 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005418 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5419 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005420 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005421 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005422 if (getToolChain().UseObjCMixedDispatch())
5423 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5424 else
5425 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5426 }
5427 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005428
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005429 // When ObjectiveC legacy runtime is in effect on MacOSX,
5430 // turn on the option to do Array/Dictionary subscripting
5431 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005432 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005433 getToolChain().getTriple().isMacOSX() &&
5434 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5435 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005436 objcRuntime.isNeXTFamily())
5437 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005438
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005439 // -fencode-extended-block-signature=1 is default.
5440 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5441 CmdArgs.push_back("-fencode-extended-block-signature");
5442 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443
John McCall24fc0de2011-07-06 00:26:06 +00005444 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5445 // NOTE: This logic is duplicated in ToolChains.cpp.
5446 bool ARC = isObjCAutoRefCount(Args);
5447 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005448 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005449
John McCall24fc0de2011-07-06 00:26:06 +00005450 CmdArgs.push_back("-fobjc-arc");
5451
Chandler Carruth491db322011-11-04 07:34:47 +00005452 // FIXME: It seems like this entire block, and several around it should be
5453 // wrapped in isObjC, but for now we just use it here as this is where it
5454 // was being used previously.
5455 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5456 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5457 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5458 else
5459 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5460 }
5461
John McCall24fc0de2011-07-06 00:26:06 +00005462 // Allow the user to enable full exceptions code emission.
5463 // We define off for Objective-CC, on for Objective-C++.
5464 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5465 options::OPT_fno_objc_arc_exceptions,
5466 /*default*/ types::isCXX(InputType)))
5467 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005468
John McCall24fc0de2011-07-06 00:26:06 +00005469 }
5470
5471 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5472 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005473 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005474 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005475
John McCall24fc0de2011-07-06 00:26:06 +00005476 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5477 // takes precedence.
5478 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5479 if (!GCArg)
5480 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5481 if (GCArg) {
5482 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005483 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005484 } else if (getToolChain().SupportsObjCGC()) {
5485 GCArg->render(Args, CmdArgs);
5486 } else {
5487 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005488 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005489 }
5490 }
5491
John McCallfbe5ed72015-11-05 19:19:56 +00005492 // Pass down -fobjc-weak or -fno-objc-weak if present.
5493 if (types::isObjC(InputType)) {
5494 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5495 options::OPT_fno_objc_weak);
5496 if (!WeakArg) {
5497 // nothing to do
5498 } else if (GCArg) {
5499 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5500 D.Diag(diag::err_objc_weak_with_gc);
5501 } else if (!objcRuntime.allowsWeak()) {
5502 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5503 D.Diag(diag::err_objc_weak_unsupported);
5504 } else {
5505 WeakArg->render(Args, CmdArgs);
5506 }
5507 }
5508
Bob Wilsonb111ec92015-03-02 19:01:14 +00005509 if (Args.hasFlag(options::OPT_fapplication_extension,
5510 options::OPT_fno_application_extension, false))
5511 CmdArgs.push_back("-fapplication-extension");
5512
Reid Klecknerc542d372014-06-27 17:02:02 +00005513 // Handle GCC-style exception args.
5514 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005515 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5516 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005517
Saleem Abdulrasool094f17b2016-06-10 20:12:00 +00005518 if (Args.hasArg(options::OPT_fsjlj_exceptions) ||
5519 getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005520 CmdArgs.push_back("-fsjlj-exceptions");
5521
5522 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005523 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5524 options::OPT_fno_assume_sane_operator_new))
5525 CmdArgs.push_back("-fno-assume-sane-operator-new");
5526
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005527 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5528 // most platforms.
5529 if (Args.hasFlag(options::OPT_fsized_deallocation,
5530 options::OPT_fno_sized_deallocation, false))
5531 CmdArgs.push_back("-fsized-deallocation");
5532
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005533 // -fconstant-cfstrings is default, and may be subject to argument translation
5534 // on Darwin.
5535 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5536 options::OPT_fno_constant_cfstrings) ||
5537 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5538 options::OPT_mno_constant_cfstrings))
5539 CmdArgs.push_back("-fno-constant-cfstrings");
5540
John Thompsoned4e2952009-11-05 20:14:16 +00005541 // -fshort-wchar default varies depending on platform; only
5542 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005543 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5544 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005545 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005546
Hans Wennborg28c96312013-07-31 23:39:13 +00005547 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005548 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005549 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005550 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005551
Daniel Dunbar096ed292011-10-05 21:04:55 +00005552 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5553 // -fno-pack-struct doesn't apply to -fpack-struct=.
5554 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005555 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005556 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005557 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005558 } else if (Args.hasFlag(options::OPT_fpack_struct,
5559 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005560 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005561 }
5562
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005563 // Handle -fmax-type-align=N and -fno-type-align
5564 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5565 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5566 if (!SkipMaxTypeAlign) {
5567 std::string MaxTypeAlignStr = "-fmax-type-align=";
5568 MaxTypeAlignStr += A->getValue();
5569 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5570 }
5571 } else if (getToolChain().getTriple().isOSDarwin()) {
5572 if (!SkipMaxTypeAlign) {
5573 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5574 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5575 }
5576 }
5577
John Brawna7b4ec02015-08-10 11:11:28 +00005578 // -fcommon is the default unless compiling kernel code or the target says so
5579 bool NoCommonDefault =
5580 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5581 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5582 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005583 CmdArgs.push_back("-fno-common");
5584
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005585 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005586 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005587 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005588 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005589 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005591
Daniel Dunbar6358d682010-10-15 22:30:42 +00005592 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005594 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005595 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005596
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005597 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005598 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5599 StringRef value = inputCharset->getValue();
5600 if (value != "UTF-8")
5601 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5602 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005603 }
5604
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005605 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005606 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5607 StringRef value = execCharset->getValue();
5608 if (value != "UTF-8")
5609 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5610 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005611 }
5612
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005613 // -fcaret-diagnostics is default.
5614 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5615 options::OPT_fno_caret_diagnostics, true))
5616 CmdArgs.push_back("-fno-caret-diagnostics");
5617
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005618 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005619 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005620 options::OPT_fno_diagnostics_fixit_info))
5621 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005622
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005623 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005624 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005625 options::OPT_fno_diagnostics_show_option))
5626 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005627
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005628 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005629 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005630 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005631 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005632 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005633
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005634 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005635 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005636 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005637 }
5638
Chandler Carruthb6766f02011-03-27 01:50:55 +00005639 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005640 options::OPT_fdiagnostics_show_note_include_stack,
5641 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005642 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005643 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005644 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5645 else
5646 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5647 }
5648
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005649 // Color diagnostics are parsed by the driver directly from argv
5650 // and later re-parsed to construct this job; claim any possible
5651 // color diagnostic here to avoid warn_drv_unused_argument and
5652 // diagnose bad OPT_fdiagnostics_color_EQ values.
5653 for (Arg *A : Args) {
5654 const Option &O = A->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005655 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5656 !O.matches(options::OPT_fdiagnostics_color) &&
5657 !O.matches(options::OPT_fno_color_diagnostics) &&
5658 !O.matches(options::OPT_fno_diagnostics_color) &&
5659 !O.matches(options::OPT_fdiagnostics_color_EQ))
5660 continue;
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005661 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5662 StringRef Value(A->getValue());
5663 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber7e2da792013-04-17 21:52:44 +00005664 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005665 << ("-fdiagnostics-color=" + Value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005666 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005667 A->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005668 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005669 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005670 CmdArgs.push_back("-fcolor-diagnostics");
5671
Nico Rieck7857d462013-09-11 00:38:02 +00005672 if (Args.hasArg(options::OPT_fansi_escape_codes))
5673 CmdArgs.push_back("-fansi-escape-codes");
5674
Daniel Dunbardb097022009-06-08 21:13:54 +00005675 if (!Args.hasFlag(options::OPT_fshow_source_location,
5676 options::OPT_fno_show_source_location))
5677 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005678
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005679 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005680 true))
5681 CmdArgs.push_back("-fno-show-column");
5682
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005683 if (!Args.hasFlag(options::OPT_fspell_checking,
5684 options::OPT_fno_spell_checking))
5685 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005686
Chad Rosierc8e56e82012-12-05 21:08:21 +00005687 // -fno-asm-blocks is default.
5688 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5689 false))
5690 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005691
Steven Wucb0d13f2015-01-16 23:05:28 +00005692 // -fgnu-inline-asm is default.
5693 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5694 options::OPT_fno_gnu_inline_asm, true))
5695 CmdArgs.push_back("-fno-gnu-inline-asm");
5696
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005697 // Enable vectorization per default according to the optimization level
5698 // selected. For optimization levels that want vectorization we use the alias
5699 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005700 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701 OptSpecifier VectorizeAliasOption =
5702 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005703 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005704 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005705 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005706
Chad Rosier136d67d2014-04-28 19:30:57 +00005707 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005708 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005709 OptSpecifier SLPVectAliasOption =
5710 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005711 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005712 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005713 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005714
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005715 // -fno-slp-vectorize-aggressive is default.
5716 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005717 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005718 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005719
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005720 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5721 A->render(Args, CmdArgs);
5722
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005723 if (Arg *A = Args.getLastArg(
5724 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5725 A->render(Args, CmdArgs);
5726
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005727 // -fdollars-in-identifiers default varies depending on platform and
5728 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005729 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005730 options::OPT_fno_dollars_in_identifiers)) {
5731 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005732 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005733 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005734 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005735 }
5736
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005737 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5738 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005739 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005740 options::OPT_fno_unit_at_a_time)) {
5741 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005742 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005743 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005744
Eli Friedman055c9702011-11-02 01:53:16 +00005745 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5746 options::OPT_fno_apple_pragma_pack, false))
5747 CmdArgs.push_back("-fapple-pragma-pack");
5748
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005749 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005750 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5751 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005752 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005753 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005754 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005755
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005756// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5757//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005758// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005759#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005760 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005761 (getToolChain().getArch() == llvm::Triple::arm ||
5762 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005763 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5764 CmdArgs.push_back("-fno-builtin-strcat");
5765 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5766 CmdArgs.push_back("-fno-builtin-strcpy");
5767 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005768#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005769
Justin Bognera88f0122014-06-20 22:59:50 +00005770 // Enable rewrite includes if the user's asked for it or if we're generating
5771 // diagnostics.
5772 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5773 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005774 if (Args.hasFlag(options::OPT_frewrite_includes,
5775 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005776 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005777 CmdArgs.push_back("-frewrite-includes");
5778
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005779 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005780 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005781 options::OPT_traditional_cpp)) {
5782 if (isa<PreprocessJobAction>(JA))
5783 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005784 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005785 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005786 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005787
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005788 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005789 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005790
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005791 // Handle serialized diagnostics.
5792 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5793 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005794 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005795 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005796
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005797 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5798 CmdArgs.push_back("-fretain-comments-from-system-headers");
5799
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005800 // Forward -fcomment-block-commands to -cc1.
5801 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005802 // Forward -fparse-all-comments to -cc1.
5803 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005804
John Brawnad31ace2015-09-23 13:55:40 +00005805 // Turn -fplugin=name.so into -load name.so
5806 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5807 CmdArgs.push_back("-load");
5808 CmdArgs.push_back(A->getValue());
5809 A->claim();
5810 }
5811
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005812 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5813 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005814 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005815 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5816 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005817
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005818 // We translate this by hand to the -cc1 argument, since nightly test uses
5819 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005820 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005821 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005822 } else
Sean Silva14facf32015-06-09 01:57:17 +00005823 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005824 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005825
Bob Wilson23a55f12014-12-21 07:00:00 +00005826 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005827 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5828 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005829 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5830 // has slightly different breakdown between stages.
5831 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5832 // pristine IR generated by the frontend. Ideally, a new compile action should
5833 // be added so both IR can be captured.
5834 if (C.getDriver().isSaveTempsEnabled() &&
5835 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005836 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005837
Daniel Dunbard67a3222009-03-30 06:36:42 +00005838 if (Output.getType() == types::TY_Dependencies) {
5839 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005840 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005841 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005842 CmdArgs.push_back(Output.getFilename());
5843 } else {
5844 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005845 }
5846
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005847 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005848
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005849 if (Input.isFilename())
5850 CmdArgs.push_back(Input.getFilename());
5851 else
5852 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005853
Chris Lattnere9d7d782009-11-03 19:50:27 +00005854 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5855
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005856 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005857
5858 // Optionally embed the -cc1 level arguments into the debug info, for build
5859 // analysis.
5860 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005861 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005862 for (const auto &Arg : Args)
5863 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005864
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005865 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005866 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005867 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005868 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005869 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005870 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005871 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005872 }
5873 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005874 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005875 }
5876
Eric Christopherd3804002013-02-22 20:12:52 +00005877 // Add the split debug info name to the command lines here so we
5878 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005879 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005880 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5881 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005882 const char *SplitDwarfOut;
5883 if (SplitDwarf) {
5884 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005885 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005886 CmdArgs.push_back(SplitDwarfOut);
5887 }
5888
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005889 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5890 // Include them with -fcuda-include-gpubinary.
5891 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005892 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005893 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005894 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005895 }
5896
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005897 bool WholeProgramVTables =
5898 Args.hasFlag(options::OPT_fwhole_program_vtables,
5899 options::OPT_fno_whole_program_vtables, false);
5900 if (WholeProgramVTables) {
5901 if (!D.isUsingLTO())
5902 D.Diag(diag::err_drv_argument_only_allowed_with)
5903 << "-fwhole-program-vtables"
5904 << "-flto";
5905 CmdArgs.push_back("-fwhole-program-vtables");
5906 }
5907
Eric Christopherd3804002013-02-22 20:12:52 +00005908 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005909 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005910 Output.getType() == types::TY_Object &&
5911 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005912 auto CLCommand =
5913 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005914 C.addCommand(llvm::make_unique<FallbackCommand>(
5915 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005916 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5917 isa<PrecompileJobAction>(JA)) {
5918 // In /fallback builds, run the main compilation even if the pch generation
5919 // fails, so that the main compilation's fallback to cl.exe runs.
5920 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5921 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005922 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005923 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005924 }
5925
Eric Christopherf1545832013-02-22 23:50:16 +00005926 // Handle the debug info splitting at object creation time if we're
5927 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005928 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005929 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005930 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005931
Roman Divacky178e01602011-02-10 16:52:03 +00005932 if (Arg *A = Args.getLastArg(options::OPT_pg))
5933 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005934 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5935 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005936
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005937 // Claim some arguments which clang supports automatically.
5938
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005939 // -fpch-preprocess is used with gcc to add a special marker in the output to
5940 // include the PCH file. Clang's PTH solution is completely transparent, so we
5941 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005942 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005943
Daniel Dunbar17731772009-03-23 19:03:36 +00005944 // Claim some arguments which clang doesn't support, but we don't
5945 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005946 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5947 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005948
Rafael Espindolab0092d72013-09-04 19:37:35 +00005949 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005950 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005951}
5952
John McCall5fb5df92012-06-20 06:18:46 +00005953/// Add options related to the Objective-C runtime/ABI.
5954///
5955/// Returns true if the runtime is non-fragile.
5956ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5957 ArgStringList &cmdArgs,
5958 RewriteKind rewriteKind) const {
5959 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005960 Arg *runtimeArg =
5961 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5962 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005963
5964 // Just forward -fobjc-runtime= to the frontend. This supercedes
5965 // options about fragility.
5966 if (runtimeArg &&
5967 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5968 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005969 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005970 if (runtime.tryParse(value)) {
5971 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005972 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005973 }
5974
5975 runtimeArg->render(args, cmdArgs);
5976 return runtime;
5977 }
5978
5979 // Otherwise, we'll need the ABI "version". Version numbers are
5980 // slightly confusing for historical reasons:
5981 // 1 - Traditional "fragile" ABI
5982 // 2 - Non-fragile ABI, version 1
5983 // 3 - Non-fragile ABI, version 2
5984 unsigned objcABIVersion = 1;
5985 // If -fobjc-abi-version= is present, use that to set the version.
5986 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005987 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005988 if (value == "1")
5989 objcABIVersion = 1;
5990 else if (value == "2")
5991 objcABIVersion = 2;
5992 else if (value == "3")
5993 objcABIVersion = 3;
5994 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005995 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005996 } else {
5997 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005998 bool nonFragileABIIsDefault =
5999 (rewriteKind == RK_NonFragile ||
6000 (rewriteKind == RK_None &&
6001 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00006002 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
6003 options::OPT_fno_objc_nonfragile_abi,
6004 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006005// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00006006#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
6007 unsigned nonFragileABIVersion = 1;
6008#else
6009 unsigned nonFragileABIVersion = 2;
6010#endif
6011
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006012 if (Arg *abiArg =
6013 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006014 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00006015 if (value == "1")
6016 nonFragileABIVersion = 1;
6017 else if (value == "2")
6018 nonFragileABIVersion = 2;
6019 else
6020 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006021 << value;
John McCall5fb5df92012-06-20 06:18:46 +00006022 }
6023
6024 objcABIVersion = 1 + nonFragileABIVersion;
6025 } else {
6026 objcABIVersion = 1;
6027 }
6028 }
6029
6030 // We don't actually care about the ABI version other than whether
6031 // it's non-fragile.
6032 bool isNonFragile = objcABIVersion != 1;
6033
6034 // If we have no runtime argument, ask the toolchain for its default runtime.
6035 // However, the rewriter only really supports the Mac runtime, so assume that.
6036 ObjCRuntime runtime;
6037 if (!runtimeArg) {
6038 switch (rewriteKind) {
6039 case RK_None:
6040 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6041 break;
6042 case RK_Fragile:
6043 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
6044 break;
6045 case RK_NonFragile:
6046 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6047 break;
6048 }
6049
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006050 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006051 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6052 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006053 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006054 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006056 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006057 } else {
6058 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6059 }
6060
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006061 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006062 } else {
6063 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006064 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006065 // non-fragile mode or the GCC runtime in fragile mode.
6066 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006067 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006068 else
6069 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006070 }
6071
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006072 cmdArgs.push_back(
6073 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006074 return runtime;
6075}
6076
Reid Klecknerc542d372014-06-27 17:02:02 +00006077static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6078 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6079 I += HaveDash;
6080 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006081}
Reid Klecknerc542d372014-06-27 17:02:02 +00006082
Benjamin Kramere003ca22015-10-28 13:54:16 +00006083namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006084struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006085 bool Synch = false;
6086 bool Asynch = false;
6087 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006088};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006089} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006090
6091/// /EH controls whether to run destructor cleanups when exceptions are
6092/// thrown. There are three modifiers:
6093/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6094/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6095/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006096/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006097/// The default is /EHs-c-, meaning cleanups are disabled.
6098static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6099 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006100
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006101 std::vector<std::string> EHArgs =
6102 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006103 for (auto EHVal : EHArgs) {
6104 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6105 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 case 'a':
6107 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006108 if (EH.Asynch)
6109 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006110 continue;
6111 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006112 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006113 continue;
6114 case 's':
6115 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006116 if (EH.Synch)
6117 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006118 continue;
6119 default:
6120 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006121 }
6122 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6123 break;
6124 }
6125 }
David Majnemerb8809092016-02-20 09:23:44 +00006126 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006127 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006128 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006129 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6130 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006131 EH.Synch = true;
6132 EH.NoUnwindC = true;
6133 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006134
Reid Klecknerc542d372014-06-27 17:02:02 +00006135 return EH;
6136}
6137
David Majnemercd5855e2016-02-29 01:40:36 +00006138void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6139 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006140 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006141 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006142 unsigned RTOptionID = options::OPT__SLASH_MT;
6143
Hans Wennborgf1a74252013-09-10 20:18:04 +00006144 if (Args.hasArg(options::OPT__SLASH_LDd))
6145 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6146 // but defining _DEBUG is sticky.
6147 RTOptionID = options::OPT__SLASH_MTd;
6148
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006149 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006150 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006151
David Majnemere2afb472015-07-24 06:49:13 +00006152 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006153 switch (RTOptionID) {
6154 case options::OPT__SLASH_MD:
6155 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006156 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006157 CmdArgs.push_back("-D_MT");
6158 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006159 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006160 break;
6161 case options::OPT__SLASH_MDd:
6162 CmdArgs.push_back("-D_DEBUG");
6163 CmdArgs.push_back("-D_MT");
6164 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006165 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006166 break;
6167 case options::OPT__SLASH_MT:
6168 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006169 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006170 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006171 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006172 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006173 break;
6174 case options::OPT__SLASH_MTd:
6175 CmdArgs.push_back("-D_DEBUG");
6176 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006177 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006178 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006179 break;
6180 default:
6181 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006182 }
6183
David Majnemere2afb472015-07-24 06:49:13 +00006184 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6185 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6186 } else {
6187 CmdArgs.push_back(FlagForCRT.data());
6188
6189 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6190 // users want. The /Za flag to cl.exe turns this off, but it's not
6191 // implemented in clang.
6192 CmdArgs.push_back("--dependent-lib=oldnames");
6193 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006194
Hans Wennborg8858a032014-07-21 23:42:07 +00006195 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6196 // would produce interleaved output, so ignore /showIncludes in such cases.
6197 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6198 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6199 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006200
David Majnemerf6072342014-07-01 22:24:56 +00006201 // This controls whether or not we emit RTTI data for polymorphic types.
6202 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6203 /*default=*/false))
6204 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006205
Etienne Bergerone28e7f22016-06-15 20:34:33 +00006206 // This controls whether or not we emit stack-protector instrumentation.
6207 // In MSVC, Buffer Security Check (/GS) is on by default.
6208 if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_,
6209 /*default=*/true)) {
6210 CmdArgs.push_back("-stack-protector");
6211 CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong)));
6212 }
6213
Reid Kleckner124955a2015-08-05 18:51:13 +00006214 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006215 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006216 if (*EmitCodeView)
6217 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006218 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006219 CmdArgs.push_back("-gcodeview");
6220
Reid Klecknerc542d372014-06-27 17:02:02 +00006221 const Driver &D = getToolChain().getDriver();
6222 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006223 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006224 if (types::isCXX(InputType))
6225 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006226 CmdArgs.push_back("-fexceptions");
6227 }
David Majnemercd5855e2016-02-29 01:40:36 +00006228 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6229 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006230
Hans Wennborge50cec32014-06-13 20:59:54 +00006231 // /EP should expand to -E -P.
6232 if (Args.hasArg(options::OPT__SLASH_EP)) {
6233 CmdArgs.push_back("-E");
6234 CmdArgs.push_back("-P");
6235 }
6236
David Majnemera5b195a2015-02-14 01:35:12 +00006237 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006238 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6239 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006240 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6241 else
6242 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6243
6244 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6245 VolatileOptionID = A->getOption().getID();
6246
6247 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6248 CmdArgs.push_back("-fms-volatile");
6249
David Majnemer86c318f2014-02-11 21:05:00 +00006250 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6251 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6252 if (MostGeneralArg && BestCaseArg)
6253 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6254 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6255
6256 if (MostGeneralArg) {
6257 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6258 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6259 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6260
6261 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6262 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6263 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6264 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6265 << FirstConflict->getAsString(Args)
6266 << SecondConflict->getAsString(Args);
6267
6268 if (SingleArg)
6269 CmdArgs.push_back("-fms-memptr-rep=single");
6270 else if (MultipleArg)
6271 CmdArgs.push_back("-fms-memptr-rep=multiple");
6272 else
6273 CmdArgs.push_back("-fms-memptr-rep=virtual");
6274 }
6275
Alexey Bataeva7547182016-05-18 09:06:38 +00006276 if (Args.getLastArg(options::OPT__SLASH_Gd))
6277 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6278 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6279 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6280 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6281 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6282 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6283 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6284
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006285 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6286 A->render(Args, CmdArgs);
6287
Hans Wennborg81f74482013-09-10 01:07:07 +00006288 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6289 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006290 if (Args.hasArg(options::OPT__SLASH_fallback))
6291 CmdArgs.push_back("msvc-fallback");
6292 else
6293 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006294 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006295}
6296
Douglas Katzman95354292015-06-23 20:42:09 +00006297visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006298 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006299 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006300 return CLFallback.get();
6301}
6302
Daniel Sanders7f933f42015-01-30 17:35:23 +00006303void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6304 ArgStringList &CmdArgs) const {
6305 StringRef CPUName;
6306 StringRef ABIName;
6307 const llvm::Triple &Triple = getToolChain().getTriple();
6308 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6309
6310 CmdArgs.push_back("-target-abi");
6311 CmdArgs.push_back(ABIName.data());
6312}
6313
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006314void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006315 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006316 const ArgList &Args,
6317 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006318 ArgStringList CmdArgs;
6319
6320 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6321 const InputInfo &Input = Inputs[0];
6322
James Y Knight2db38f32015-08-15 03:45:25 +00006323 std::string TripleStr =
6324 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6325 const llvm::Triple Triple(TripleStr);
6326
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006327 // Don't warn about "clang -w -c foo.s"
6328 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006329 // and "clang -emit-llvm -c foo.s"
6330 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006331
Rafael Espindola577637a2015-01-03 00:06:04 +00006332 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006333
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006334 // Invoke ourselves in -cc1as mode.
6335 //
6336 // FIXME: Implement custom jobs for internal actions.
6337 CmdArgs.push_back("-cc1as");
6338
6339 // Add the "effective" target triple.
6340 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006341 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6342
6343 // Set the output mode, we currently only expect to be used as a real
6344 // assembler.
6345 CmdArgs.push_back("-filetype");
6346 CmdArgs.push_back("obj");
6347
Eric Christopher45f2e712012-12-18 00:31:10 +00006348 // Set the main file name, so that debug info works even with
6349 // -save-temps or preprocessed assembly.
6350 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006351 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006352
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006353 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006354 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006355 if (!CPU.empty()) {
6356 CmdArgs.push_back("-target-cpu");
6357 CmdArgs.push_back(Args.MakeArgString(CPU));
6358 }
6359
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006360 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006361 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006362
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006363 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006364 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006365
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006366 // Pass along any -I options so we get proper .include search paths.
6367 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6368
Eric Christopherfc3ee562012-01-10 00:38:01 +00006369 // Determine the original source input.
6370 const Action *SourceAction = &JA;
6371 while (SourceAction->getKind() != Action::InputClass) {
6372 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6373 SourceAction = SourceAction->getInputs()[0];
6374 }
6375
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006376 // Forward -g and handle debug info related flags, assuming we are dealing
6377 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006378 bool WantDebug = false;
6379 unsigned DwarfVersion = 0;
6380 Args.ClaimAllArgs(options::OPT_g_Group);
6381 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6382 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6383 !A->getOption().matches(options::OPT_ggdb0);
6384 if (WantDebug)
6385 DwarfVersion = DwarfVersionNum(A->getSpelling());
6386 }
6387 if (DwarfVersion == 0)
6388 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6389
6390 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6391
Eric Christopherfc3ee562012-01-10 00:38:01 +00006392 if (SourceAction->getType() == types::TY_Asm ||
6393 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006394 // You might think that it would be ok to set DebugInfoKind outside of
6395 // the guard for source type, however there is a test which asserts
6396 // that some assembler invocation receives no -debug-info-kind,
6397 // and it's not clear whether that test is just overly restrictive.
6398 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6399 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006400 // Add the -fdebug-compilation-dir flag if needed.
6401 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006402
6403 // Set the AT_producer to the clang version when using the integrated
6404 // assembler on assembly source files.
6405 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006406 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006407
6408 // And pass along -I options
6409 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006410 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006411 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6412 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006413
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006414 // Handle -fPIC et al -- the relocation-model affects the assembler
6415 // for some targets.
6416 llvm::Reloc::Model RelocationModel;
6417 unsigned PICLevel;
6418 bool IsPIE;
6419 std::tie(RelocationModel, PICLevel, IsPIE) =
6420 ParsePICArgs(getToolChain(), Triple, Args);
6421
6422 const char *RMName = RelocationModelName(RelocationModel);
6423 if (RMName) {
6424 CmdArgs.push_back("-mrelocation-model");
6425 CmdArgs.push_back(RMName);
6426 }
6427
Kevin Enderby292dc082011-12-22 19:31:58 +00006428 // Optionally embed the -cc1as level arguments into the debug info, for build
6429 // analysis.
6430 if (getToolChain().UseDwarfDebugFlags()) {
6431 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006432 for (const auto &Arg : Args)
6433 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006434
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006435 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006436 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6437 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006438 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006439 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006440 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006441 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006442 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006443 }
6444 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006445 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006446 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006447
6448 // FIXME: Add -static support, once we have it.
6449
Daniel Sanders7f933f42015-01-30 17:35:23 +00006450 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006451 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006452 default:
6453 break;
6454
6455 case llvm::Triple::mips:
6456 case llvm::Triple::mipsel:
6457 case llvm::Triple::mips64:
6458 case llvm::Triple::mips64el:
6459 AddMIPSTargetArgs(Args, CmdArgs);
6460 break;
6461 }
6462
David Blaikie372d9502014-01-17 03:17:40 +00006463 // Consume all the warning flags. Usually this would be handled more
6464 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6465 // doesn't handle that so rather than warning about unused flags that are
6466 // actually used, we'll lie by omission instead.
6467 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006468 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006469
David Blaikie9260ed62013-07-25 21:19:01 +00006470 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6471 getToolChain().getDriver());
6472
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006473 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006474
6475 assert(Output.isFilename() && "Unexpected lipo output.");
6476 CmdArgs.push_back("-o");
6477 CmdArgs.push_back(Output.getFilename());
6478
Daniel Dunbarb440f562010-08-02 02:38:21 +00006479 assert(Input.isFilename() && "Invalid input.");
6480 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006481
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006482 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006483 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006484
6485 // Handle the debug info splitting at object creation time if we're
6486 // creating an object.
6487 // TODO: Currently only works on linux with newer objcopy.
6488 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006489 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006490 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006491 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006492}
6493
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006494void GnuTool::anchor() {}
6495
Daniel Dunbara3246a02009-03-18 08:07:30 +00006496void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006497 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006498 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006499 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006500 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006501 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006503 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006504 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006505 // It is unfortunate that we have to claim here, as this means
6506 // we will basically never report anything interesting for
6507 // platforms using a generic gcc, even if we are just using gcc
6508 // to get to the assembler.
6509 A->claim();
6510
Daniel Dunbar939c1212010-08-03 16:14:14 +00006511 // Don't forward any -g arguments to assembly steps.
6512 if (isa<AssembleJobAction>(JA) &&
6513 A->getOption().matches(options::OPT_g_Group))
6514 continue;
6515
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006516 // Don't forward any -W arguments to assembly and link steps.
6517 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6518 A->getOption().matches(options::OPT_W_Group))
6519 continue;
6520
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006521 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006522 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006523 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006524
Daniel Dunbar4e295052010-01-25 22:35:08 +00006525 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006526
6527 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006528 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006529 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006530 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006531 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006532 }
6533
Daniel Dunbar5716d872009-05-02 21:41:52 +00006534 // Try to force gcc to match the tool chain we want, if we recognize
6535 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006536 //
6537 // FIXME: The triple class should directly provide the information we want
6538 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006539 switch (getToolChain().getArch()) {
6540 default:
6541 break;
6542 case llvm::Triple::x86:
6543 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006544 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006545 break;
6546 case llvm::Triple::x86_64:
6547 case llvm::Triple::ppc64:
6548 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006549 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006550 break;
6551 case llvm::Triple::sparcel:
6552 CmdArgs.push_back("-EL");
6553 break;
6554 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006555
Daniel Dunbarb440f562010-08-02 02:38:21 +00006556 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006557 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006558 CmdArgs.push_back(Output.getFilename());
6559 } else {
6560 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006561 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006562 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006564 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006565
6566 // Only pass -x if gcc will understand it; otherwise hope gcc
6567 // understands the suffix correctly. The main use case this would go
6568 // wrong in is for linker inputs if they happened to have an odd
6569 // suffix; really the only way to get this to happen is a command
6570 // like '-x foobar a.c' which will treat a.c like a linker input.
6571 //
6572 // FIXME: For the linker case specifically, can we safely convert
6573 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006574 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006575 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006576 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006577 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006578 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006579 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006580 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006581 else if (II.getType() == types::TY_ModuleFile)
6582 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006583 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006584
Daniel Dunbara3246a02009-03-18 08:07:30 +00006585 if (types::canTypeBeUserSpecified(II.getType())) {
6586 CmdArgs.push_back("-x");
6587 CmdArgs.push_back(types::getTypeName(II.getType()));
6588 }
6589
Daniel Dunbarb440f562010-08-02 02:38:21 +00006590 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006591 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006592 else {
6593 const Arg &A = II.getInputArg();
6594
6595 // Reverse translate some rewritten options.
6596 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6597 CmdArgs.push_back("-lstdc++");
6598 continue;
6599 }
6600
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006601 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006602 A.render(Args, CmdArgs);
6603 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006604 }
6605
Benjamin Kramer2e018ef2016-05-27 13:36:58 +00006606 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006607 const char *GCCName;
6608 if (!customGCCName.empty())
6609 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006610 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006611 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006612 } else
6613 GCCName = "gcc";
6614
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006615 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006617}
6618
Douglas Katzman95354292015-06-23 20:42:09 +00006619void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6620 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006621 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006622}
6623
Douglas Katzman95354292015-06-23 20:42:09 +00006624void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6625 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006626 const Driver &D = getToolChain().getDriver();
6627
Eric Christophercc7ff502015-01-29 00:56:17 +00006628 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006629 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006630 case types::TY_LLVM_IR:
6631 case types::TY_LTO_IR:
6632 case types::TY_LLVM_BC:
6633 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006634 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006635 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006636 // We assume we've got an "integrated" assembler in that gcc will produce an
6637 // object file itself.
6638 case types::TY_Object:
6639 CmdArgs.push_back("-c");
6640 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006641 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006642 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006643 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006644 case types::TY_Nothing:
6645 CmdArgs.push_back("-fsyntax-only");
6646 break;
6647 default:
6648 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006649 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006650}
6651
Douglas Katzman95354292015-06-23 20:42:09 +00006652void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6653 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006654 // The types are (hopefully) good enough.
6655}
6656
Tony Linthicum76329bf2011-12-12 21:14:55 +00006657// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006658void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006659 ArgStringList &CmdArgs) const {
6660}
6661
Douglas Katzman95354292015-06-23 20:42:09 +00006662void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6663 const InputInfo &Output,
6664 const InputInfoList &Inputs,
6665 const ArgList &Args,
6666 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006667 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006668
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006669 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6670 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006671 ArgStringList CmdArgs;
6672
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006673 std::string MArchString = "-march=hexagon";
6674 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006675
6676 RenderExtraToolArgs(JA, CmdArgs);
6677
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006678 std::string AsName = "hexagon-llvm-mc";
6679 std::string MCpuString = "-mcpu=hexagon" +
6680 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6681 CmdArgs.push_back("-filetype=obj");
6682 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6683
Tony Linthicum76329bf2011-12-12 21:14:55 +00006684 if (Output.isFilename()) {
6685 CmdArgs.push_back("-o");
6686 CmdArgs.push_back(Output.getFilename());
6687 } else {
6688 assert(Output.isNothing() && "Unexpected output");
6689 CmdArgs.push_back("-fsyntax-only");
6690 }
6691
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006692 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6693 std::string N = llvm::utostr(G.getValue());
6694 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6695 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006696
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006697 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006698
Tony Linthicum76329bf2011-12-12 21:14:55 +00006699 // Only pass -x if gcc will understand it; otherwise hope gcc
6700 // understands the suffix correctly. The main use case this would go
6701 // wrong in is for linker inputs if they happened to have an odd
6702 // suffix; really the only way to get this to happen is a command
6703 // like '-x foobar a.c' which will treat a.c like a linker input.
6704 //
6705 // FIXME: For the linker case specifically, can we safely convert
6706 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006707 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006708 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006709 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006710 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006711 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006712 else if (II.getType() == types::TY_AST)
6713 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006714 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006715 else if (II.getType() == types::TY_ModuleFile)
6716 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006717 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006718
6719 if (II.isFilename())
6720 CmdArgs.push_back(II.getFilename());
6721 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006722 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006723 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006724 II.getInputArg().render(Args, CmdArgs);
6725 }
6726
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006727 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006729}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006730
Douglas Katzman95354292015-06-23 20:42:09 +00006731void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6732 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006733}
6734
Douglas Katzman54366072015-07-27 16:53:08 +00006735static void
6736constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006737 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006738 const InputInfo &Output, const InputInfoList &Inputs,
6739 const ArgList &Args, ArgStringList &CmdArgs,
6740 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006741
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006742 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006743
Matthew Curtise689b052012-12-06 15:46:07 +00006744 //----------------------------------------------------------------------------
6745 //
6746 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006747 bool IsStatic = Args.hasArg(options::OPT_static);
6748 bool IsShared = Args.hasArg(options::OPT_shared);
6749 bool IsPIE = Args.hasArg(options::OPT_pie);
6750 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6751 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6752 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6753 bool UseG0 = false;
6754 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006755
Matthew Curtise689b052012-12-06 15:46:07 +00006756 //----------------------------------------------------------------------------
6757 // Silence warnings for various options
6758 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006759 Args.ClaimAllArgs(options::OPT_g_Group);
6760 Args.ClaimAllArgs(options::OPT_emit_llvm);
6761 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6762 // handled somewhere else.
6763 Args.ClaimAllArgs(options::OPT_static_libgcc);
6764
6765 //----------------------------------------------------------------------------
6766 //
6767 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006768 if (Args.hasArg(options::OPT_s))
6769 CmdArgs.push_back("-s");
6770
6771 if (Args.hasArg(options::OPT_r))
6772 CmdArgs.push_back("-r");
6773
6774 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006775 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006776
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006777 CmdArgs.push_back("-march=hexagon");
6778 std::string CpuVer =
6779 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6780 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6781 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006782
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006783 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006784 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006785 // The following should be the default, but doing as hexagon-gcc does.
6786 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006787 }
6788
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006789 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006790 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006791
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006792 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006793 CmdArgs.push_back("-pie");
6794
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006795 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6796 std::string N = llvm::utostr(G.getValue());
6797 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6798 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006799 }
6800
Matthew Curtise689b052012-12-06 15:46:07 +00006801 //----------------------------------------------------------------------------
6802 //
6803 //----------------------------------------------------------------------------
6804 CmdArgs.push_back("-o");
6805 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006806
Matthew Curtise689b052012-12-06 15:46:07 +00006807 //----------------------------------------------------------------------------
6808 // moslib
6809 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006810 std::vector<std::string> OsLibs;
6811 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006812
Sean Silva14facf32015-06-09 01:57:17 +00006813 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6814 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006815 OsLibs.emplace_back(A->getValue());
6816 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006817 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006818 if (OsLibs.empty()) {
6819 OsLibs.push_back("standalone");
6820 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006821 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006822
Matthew Curtise689b052012-12-06 15:46:07 +00006823 //----------------------------------------------------------------------------
6824 // Start Files
6825 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006826 const std::string MCpuSuffix = "/" + CpuVer;
6827 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6828 const std::string RootDir =
6829 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6830 const std::string StartSubDir =
6831 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006832
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006833 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6834 const char *Name) -> std::string {
6835 std::string RelName = SubDir + Name;
6836 std::string P = HTC.GetFilePath(RelName.c_str());
6837 if (llvm::sys::fs::exists(P))
6838 return P;
6839 return RootDir + RelName;
6840 };
6841
6842 if (IncStdLib && IncStartFiles) {
6843 if (!IsShared) {
6844 if (HasStandalone) {
6845 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6846 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006847 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006848 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6849 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006850 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006851 std::string Init = UseShared
6852 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6853 : Find(RootDir, StartSubDir, "/init.o");
6854 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006855 }
6856
6857 //----------------------------------------------------------------------------
6858 // Library Search Paths
6859 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006860 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6861 for (const auto &LibPath : LibPaths)
6862 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006863
6864 //----------------------------------------------------------------------------
6865 //
6866 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006867 Args.AddAllArgs(CmdArgs,
6868 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6869 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006870
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006871 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006872
6873 //----------------------------------------------------------------------------
6874 // Libraries
6875 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006876 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006877 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006878 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006879 CmdArgs.push_back("-lm");
6880 }
6881
6882 CmdArgs.push_back("--start-group");
6883
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006884 if (!IsShared) {
6885 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006886 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006887 CmdArgs.push_back("-lc");
6888 }
6889 CmdArgs.push_back("-lgcc");
6890
6891 CmdArgs.push_back("--end-group");
6892 }
6893
6894 //----------------------------------------------------------------------------
6895 // End files
6896 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006897 if (IncStdLib && IncStartFiles) {
6898 std::string Fini = UseShared
6899 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6900 : Find(RootDir, StartSubDir, "/fini.o");
6901 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006902 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006903}
6904
Douglas Katzman95354292015-06-23 20:42:09 +00006905void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6906 const InputInfo &Output,
6907 const InputInfoList &Inputs,
6908 const ArgList &Args,
6909 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006910 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006911
6912 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006913 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006914 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006915
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006916 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006917 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006918 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006919}
6920// Hexagon tools end.
6921
Tom Stellard8fa33092015-07-18 01:49:05 +00006922void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6923 const InputInfo &Output,
6924 const InputInfoList &Inputs,
6925 const ArgList &Args,
6926 const char *LinkingOutput) const {
6927
6928 std::string Linker = getToolChain().GetProgramPath(getShortName());
6929 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006930 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006931 CmdArgs.push_back("-shared");
6932 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006933 CmdArgs.push_back(Output.getFilename());
6934 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6935 CmdArgs, Inputs));
6936}
6937// AMDGPU tools end.
6938
Dan Gohman52816862015-12-16 23:30:41 +00006939wasm::Linker::Linker(const ToolChain &TC)
6940 : GnuTool("wasm::Linker", "lld", TC) {}
6941
6942bool wasm::Linker::isLinkJob() const {
6943 return true;
6944}
6945
6946bool wasm::Linker::hasIntegratedCPP() const {
6947 return false;
6948}
6949
6950void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6951 const InputInfo &Output,
6952 const InputInfoList &Inputs,
6953 const ArgList &Args,
6954 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006955
6956 const ToolChain &ToolChain = getToolChain();
6957 const Driver &D = ToolChain.getDriver();
6958 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006959 ArgStringList CmdArgs;
6960 CmdArgs.push_back("-flavor");
6961 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006962
6963 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006964 // size is of particular importance. This is significantly facilitated by
6965 // the enabling of -ffunction-sections and -fdata-sections in
6966 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006967 if (areOptimizationsEnabled(Args))
6968 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006969
Dan Gohman57b62c52016-02-22 19:26:15 +00006970 if (Args.hasArg(options::OPT_rdynamic))
6971 CmdArgs.push_back("-export-dynamic");
6972 if (Args.hasArg(options::OPT_s))
6973 CmdArgs.push_back("--strip-all");
6974 if (Args.hasArg(options::OPT_shared))
6975 CmdArgs.push_back("-shared");
6976 if (Args.hasArg(options::OPT_static))
6977 CmdArgs.push_back("-Bstatic");
6978
6979 Args.AddAllArgs(CmdArgs, options::OPT_L);
6980 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6981
6982 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6983 if (Args.hasArg(options::OPT_shared))
6984 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6985 else if (Args.hasArg(options::OPT_pie))
6986 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6987 else
6988 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6989
6990 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6991 }
6992
6993 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6994
6995 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6996 if (D.CCCIsCXX())
6997 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6998
6999 if (Args.hasArg(options::OPT_pthread))
7000 CmdArgs.push_back("-lpthread");
7001
7002 CmdArgs.push_back("-lc");
7003 CmdArgs.push_back("-lcompiler_rt");
7004 }
7005
7006 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
7007 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7008
Dan Gohman52816862015-12-16 23:30:41 +00007009 CmdArgs.push_back("-o");
7010 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00007011
Dan Gohman52816862015-12-16 23:30:41 +00007012 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
7013}
7014
Renato Golin7c542b42015-07-27 23:44:45 +00007015const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00007016 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00007017 if (!Arch.empty())
7018 MArch = Arch;
7019 else
Bernard Ogden31561762013-12-12 13:27:11 +00007020 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00007021 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00007022
7023 // Handle -march=native.
7024 if (MArch == "native") {
7025 std::string CPU = llvm::sys::getHostCPUName();
7026 if (CPU != "generic") {
7027 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007028 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007029 // If there is no valid architecture suffix for this CPU we don't know how
7030 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007031 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00007032 MArch = "";
7033 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007034 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00007035 }
7036 }
7037
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007038 return MArch;
7039}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007040
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007041/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007042StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00007043 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007044 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
7045 // here means an -march=native that we can't handle, so instead return no CPU.
7046 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007047 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00007048
John Brawna95c1a82015-05-08 12:52:18 +00007049 // We need to return an empty string here on invalid MArch values as the
7050 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007051 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00007052}
7053
7054/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00007055std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007056 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00007057 // FIXME: Warn on inconsistent use of -mcpu and -march.
7058 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00007059 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00007060 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00007061 // Handle -mcpu=native.
7062 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007063 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007064 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007065 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007066 }
7067
Renato Goline17c5802015-07-27 23:44:42 +00007068 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007069}
7070
7071/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007072/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007073// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007074StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7075 const llvm::Triple &Triple) {
7076 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007077 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007078 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007079 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007080 if (ArchKind == llvm::ARM::AK_INVALID)
7081 // In case of generic Arch, i.e. "arm",
7082 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007083 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007084 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007085 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7086 // armv7k triple if it's actually been specified via "-arch armv7k".
7087 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007088 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007089 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007090 }
Renato Golin3c007252015-05-28 15:05:53 +00007091 if (ArchKind == llvm::ARM::AK_INVALID)
7092 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007093 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007094}
7095
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007097 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007098 if (Args.hasArg(options::OPT_r))
7099 return;
7100
John Brawn94fd9632015-05-21 12:19:49 +00007101 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7102 // to generate BE-8 executables.
7103 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7104 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007105}
7106
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007107mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007108 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7109 // was first introduced in Release 3. However, other compilers have
7110 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007111 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7112 .Case("mips1", NanLegacy)
7113 .Case("mips2", NanLegacy)
7114 .Case("mips3", NanLegacy)
7115 .Case("mips4", NanLegacy)
7116 .Case("mips5", NanLegacy)
7117 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007118 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007119 .Case("mips32r3", NanLegacy | Nan2008)
7120 .Case("mips32r5", NanLegacy | Nan2008)
7121 .Case("mips32r6", Nan2008)
7122 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007123 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007124 .Case("mips64r3", NanLegacy | Nan2008)
7125 .Case("mips64r5", NanLegacy | Nan2008)
7126 .Case("mips64r6", Nan2008)
7127 .Default(NanLegacy);
7128}
7129
Simon Dardisd0e83ba2016-05-27 15:13:31 +00007130bool mips::hasCompactBranches(StringRef &CPU) {
7131 // mips32r6 and mips64r6 have compact branches.
7132 return llvm::StringSwitch<bool>(CPU)
7133 .Case("mips32r6", true)
7134 .Case("mips64r6", true)
7135 .Default(false);
7136}
7137
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007138bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7139 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7140 return A && (A->getValue() == StringRef(Value));
7141}
7142
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007143bool mips::isUCLibc(const ArgList &Args) {
7144 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007145 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007146}
7147
Daniel Sanders2bf13662014-07-10 14:40:57 +00007148bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007149 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7150 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007151 .Case("2008", true)
7152 .Case("legacy", false)
7153 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007154
7155 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007156 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007157 .Cases("mips32r6", "mips64r6", true)
7158 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007159
7160 return false;
7161}
7162
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007163bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7164 if (!Triple.isAndroid())
7165 return false;
7166
7167 // Android MIPS32R6 defaults to FP64A.
7168 return llvm::StringSwitch<bool>(CPUName)
7169 .Case("mips32r6", true)
7170 .Default(false);
7171}
7172
Daniel Sanders379d44b2014-07-16 11:52:23 +00007173bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007174 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007175 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007176 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7177 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007178 return false;
7179
7180 if (ABIName != "32")
7181 return false;
7182
Toma Tabacu94ea6862015-06-16 13:54:13 +00007183 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7184 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007185 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007186 return false;
7187
Daniel Sanders379d44b2014-07-16 11:52:23 +00007188 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007189 .Cases("mips2", "mips3", "mips4", "mips5", true)
7190 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7191 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7192 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007193}
7194
Toma Tabacu94ea6862015-06-16 13:54:13 +00007195bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7196 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007197 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007198 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7199
7200 // FPXX shouldn't be used if -msingle-float is present.
7201 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7202 options::OPT_mdouble_float))
7203 if (A->getOption().matches(options::OPT_msingle_float))
7204 UseFPXX = false;
7205
7206 return UseFPXX;
7207}
7208
Tim Northover157d9112014-01-16 08:48:16 +00007209llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007210 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7211 // archs which Darwin doesn't use.
7212
7213 // The matching this routine does is fairly pointless, since it is neither the
7214 // complete architecture list, nor a reasonable subset. The problem is that
7215 // historically the driver driver accepts this and also ties its -march=
7216 // handling to the architecture name, so we need to be careful before removing
7217 // support for it.
7218
7219 // This code must be kept in sync with Clang's Darwin specific argument
7220 // translation.
7221
7222 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007223 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7224 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7225 .Case("ppc64", llvm::Triple::ppc64)
7226 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7227 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7228 llvm::Triple::x86)
7229 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7230 // This is derived from the driver driver.
7231 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7232 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7233 .Cases("armv7s", "xscale", llvm::Triple::arm)
7234 .Case("arm64", llvm::Triple::aarch64)
7235 .Case("r600", llvm::Triple::r600)
7236 .Case("amdgcn", llvm::Triple::amdgcn)
7237 .Case("nvptx", llvm::Triple::nvptx)
7238 .Case("nvptx64", llvm::Triple::nvptx64)
7239 .Case("amdil", llvm::Triple::amdil)
7240 .Case("spir", llvm::Triple::spir)
7241 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007242}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007243
Tim Northover157d9112014-01-16 08:48:16 +00007244void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007245 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007246 T.setArch(Arch);
7247
7248 if (Str == "x86_64h")
7249 T.setArchName(Str);
7250 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7251 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007252 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007253 }
7254}
7255
Bob Wilsondecc03e2012-11-23 06:14:39 +00007256const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007257 const InputInfo &Input) {
7258 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007259}
7260
Bob Wilsondecc03e2012-11-23 06:14:39 +00007261const char *Clang::getBaseInputStem(const ArgList &Args,
7262 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007263 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007264
Chris Lattner906bb902011-01-16 08:14:11 +00007265 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007266 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007267
7268 return Str;
7269}
7270
Bob Wilsondecc03e2012-11-23 06:14:39 +00007271const char *Clang::getDependencyFileName(const ArgList &Args,
7272 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007273 // FIXME: Think about this more.
7274 std::string Res;
7275
7276 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007277 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007278 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007279 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007280 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007281 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007282 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007283}
7284
Douglas Katzman95354292015-06-23 20:42:09 +00007285void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7286 const InputInfo &Output,
7287 const InputInfoList &Inputs,
7288 const ArgList &Args,
7289 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007290 const ToolChain &ToolChain = getToolChain();
7291 const Driver &D = ToolChain.getDriver();
7292 ArgStringList CmdArgs;
7293
7294 // Silence warning for "clang -g foo.o -o foo"
7295 Args.ClaimAllArgs(options::OPT_g_Group);
7296 // and "clang -emit-llvm foo.o -o foo"
7297 Args.ClaimAllArgs(options::OPT_emit_llvm);
7298 // and for "clang -w foo.o -o foo". Other warning options are already
7299 // handled somewhere else.
7300 Args.ClaimAllArgs(options::OPT_w);
7301
7302 if (!D.SysRoot.empty())
7303 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7304
7305 // CloudABI only supports static linkage.
7306 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007307
7308 // CloudABI uses Position Independent Executables exclusively.
7309 CmdArgs.push_back("-pie");
7310 CmdArgs.push_back("--no-dynamic-linker");
7311 CmdArgs.push_back("-zrelro");
7312
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007313 CmdArgs.push_back("--eh-frame-hdr");
7314 CmdArgs.push_back("--gc-sections");
7315
7316 if (Output.isFilename()) {
7317 CmdArgs.push_back("-o");
7318 CmdArgs.push_back(Output.getFilename());
7319 } else {
7320 assert(Output.isNothing() && "Invalid output.");
7321 }
7322
Douglas Katzman78b37b02015-11-17 20:28:07 +00007323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007324 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7326 }
7327
7328 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007329 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007330 Args.AddAllArgs(CmdArgs,
7331 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7332 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007333
Teresa Johnson945bc502015-10-15 20:35:53 +00007334 if (D.isUsingLTO())
7335 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007336
7337 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7338
Douglas Katzman78b37b02015-11-17 20:28:07 +00007339 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007340 if (D.CCCIsCXX())
7341 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7342 CmdArgs.push_back("-lc");
7343 CmdArgs.push_back("-lcompiler_rt");
7344 }
7345
Douglas Katzman78b37b02015-11-17 20:28:07 +00007346 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7348
7349 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007350 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007351}
7352
Douglas Katzman95354292015-06-23 20:42:09 +00007353void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7354 const InputInfo &Output,
7355 const InputInfoList &Inputs,
7356 const ArgList &Args,
7357 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007358 ArgStringList CmdArgs;
7359
7360 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7361 const InputInfo &Input = Inputs[0];
7362
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007363 // Determine the original source input.
7364 const Action *SourceAction = &JA;
7365 while (SourceAction->getKind() != Action::InputClass) {
7366 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7367 SourceAction = SourceAction->getInputs()[0];
7368 }
7369
Eric Christopherf5a8f492015-12-08 00:10:10 +00007370 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007371 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007372 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7373 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007374 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007375 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007376 const llvm::Triple &T(getToolChain().getTriple());
7377 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007378 CmdArgs.push_back("-Q");
7379 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007380
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007381 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007382 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007383 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007384 if (Args.hasArg(options::OPT_gstabs))
7385 CmdArgs.push_back("--gstabs");
7386 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007387 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007388 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007389
Daniel Dunbarbe220842009-03-20 16:06:39 +00007390 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007391 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007392
Daniel Dunbar6d484762010-07-22 01:47:22 +00007393 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007394 if (getToolChain().getArch() == llvm::Triple::x86 ||
7395 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007396 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7397 CmdArgs.push_back("-force_cpusubtype_ALL");
7398
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007399 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007400 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007401 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007402 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007403 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007404 CmdArgs.push_back("-static");
7405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007406 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007407
7408 assert(Output.isFilename() && "Unexpected lipo output.");
7409 CmdArgs.push_back("-o");
7410 CmdArgs.push_back(Output.getFilename());
7411
Daniel Dunbarb440f562010-08-02 02:38:21 +00007412 assert(Input.isFilename() && "Invalid input.");
7413 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007414
7415 // asm_final spec is empty.
7416
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007417 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007418 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007419}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007420
Tim Northover157d9112014-01-16 08:48:16 +00007421void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007422
Tim Northover157d9112014-01-16 08:48:16 +00007423void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7424 ArgStringList &CmdArgs) const {
7425 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007426
Daniel Dunbarc1964212009-03-26 16:23:12 +00007427 // Derived from darwin_arch spec.
7428 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007429 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007430
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007431 // FIXME: Is this needed anymore?
7432 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007433 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007434}
7435
Douglas Katzman95354292015-06-23 20:42:09 +00007436bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007437 // We only need to generate a temp path for LTO if we aren't compiling object
7438 // files. When compiling source files, we run 'dsymutil' after linking. We
7439 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007440 for (const auto &Input : Inputs)
7441 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007442 return true;
7443
7444 return false;
7445}
7446
Douglas Katzman95354292015-06-23 20:42:09 +00007447void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7448 ArgStringList &CmdArgs,
7449 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007450 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007451 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007452
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007453 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007454 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007455 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007456 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007457 }
7458
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007459 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007460 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007461 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7462 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007463
Bob Wilson3d27dad2013-08-02 22:25:34 +00007464 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7465 CmdArgs.push_back("-export_dynamic");
7466
Bob Wilsonb111ec92015-03-02 19:01:14 +00007467 // If we are using App Extension restrictions, pass a flag to the linker
7468 // telling it that the compiled code has been audited.
7469 if (Args.hasFlag(options::OPT_fapplication_extension,
7470 options::OPT_fno_application_extension, false))
7471 CmdArgs.push_back("-application_extension");
7472
Teresa Johnson945bc502015-10-15 20:35:53 +00007473 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007474 // If we are using LTO, then automatically create a temporary file path for
7475 // the linker to use, so that it's lifetime will extend past a possible
7476 // dsymutil step.
7477 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7478 const char *TmpPath = C.getArgs().MakeArgString(
7479 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7480 C.addTempFile(TmpPath);
7481 CmdArgs.push_back("-object_path_lto");
7482 CmdArgs.push_back(TmpPath);
7483 }
7484
7485 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7486 // it in clang installed libraries. If not found, the option is not used
7487 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7488 if (Version[0] >= 133) {
7489 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7490 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7491 SmallString<128> LibLTOPath(P);
7492 llvm::sys::path::append(LibLTOPath, "lib");
7493 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7494 if (llvm::sys::fs::exists(LibLTOPath)) {
7495 CmdArgs.push_back("-lto_library");
7496 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7497 } else {
7498 D.Diag(diag::warn_drv_lto_libpath);
7499 }
7500 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007501 }
7502
Daniel Dunbarc1964212009-03-26 16:23:12 +00007503 // Derived from the "link" spec.
7504 Args.AddAllArgs(CmdArgs, options::OPT_static);
7505 if (!Args.hasArg(options::OPT_static))
7506 CmdArgs.push_back("-dynamic");
7507 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7508 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7509 // here. How do we wish to handle such things?
7510 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007511
Daniel Dunbarc1964212009-03-26 16:23:12 +00007512 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007513 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007514 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007515 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007516
7517 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7518 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7519 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7520
7521 Arg *A;
7522 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7523 (A = Args.getLastArg(options::OPT_current__version)) ||
7524 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007525 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7526 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527
7528 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7529 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7530 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7531 } else {
7532 CmdArgs.push_back("-dylib");
7533
7534 Arg *A;
7535 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7536 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7537 (A = Args.getLastArg(options::OPT_client__name)) ||
7538 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7539 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7540 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007541 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7542 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007543
Daniel Dunbarc1964212009-03-26 16:23:12 +00007544 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7545 "-dylib_compatibility_version");
7546 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7547 "-dylib_current_version");
7548
Tim Northover157d9112014-01-16 08:48:16 +00007549 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007550
7551 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7552 "-dylib_install_name");
7553 }
7554
7555 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7556 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7557 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007558 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007559 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007560 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7561 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7562 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7563 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7564 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7565 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007566 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007567 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7568 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7569 Args.AddAllArgs(CmdArgs, options::OPT_init);
7570
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007571 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007572 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007573
Daniel Dunbarc1964212009-03-26 16:23:12 +00007574 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7575 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7576 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7577 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7578 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007580 if (const Arg *A =
7581 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7582 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007583 if (A->getOption().matches(options::OPT_fpie) ||
7584 A->getOption().matches(options::OPT_fPIE))
7585 CmdArgs.push_back("-pie");
7586 else
7587 CmdArgs.push_back("-no_pie");
7588 }
Steven Wu574b0f22016-03-01 01:07:58 +00007589 // for embed-bitcode, use -bitcode_bundle in linker command
7590 if (C.getDriver().embedBitcodeEnabled() ||
7591 C.getDriver().embedBitcodeMarkerOnly()) {
7592 // Check if the toolchain supports bitcode build flow.
7593 if (MachOTC.SupportsEmbeddedBitcode())
7594 CmdArgs.push_back("-bitcode_bundle");
7595 else
7596 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7597 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007598
7599 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7600 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7601 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7602 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7603 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7604 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7605 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7606 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7607 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7608 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7609 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7610 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7611 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7612 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7613 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7614 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007615
Daniel Dunbar84384642011-05-02 21:03:47 +00007616 // Give --sysroot= preference, over the Apple specific behavior to also use
7617 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007618 StringRef sysroot = C.getSysRoot();
7619 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007620 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007621 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007622 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7623 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007624 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007625 }
7626
Daniel Dunbarc1964212009-03-26 16:23:12 +00007627 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7628 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7629 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7630 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7631 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007632 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007633 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7634 Args.AddAllArgs(CmdArgs, options::OPT_y);
7635 Args.AddLastArg(CmdArgs, options::OPT_w);
7636 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7637 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7638 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7639 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7640 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7641 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7642 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7643 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7644 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7645 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7646 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7647 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7648}
7649
Douglas Katzman95354292015-06-23 20:42:09 +00007650void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7651 const InputInfo &Output,
7652 const InputInfoList &Inputs,
7653 const ArgList &Args,
7654 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007655 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007656
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007657 // If the number of arguments surpasses the system limits, we will encode the
7658 // input files in a separate file, shortening the command line. To this end,
7659 // build a list of input file names that can be passed via a file with the
7660 // -filelist linker option.
7661 llvm::opt::ArgStringList InputFileList;
7662
Daniel Dunbarc1964212009-03-26 16:23:12 +00007663 // The logic here is derived from gcc's behavior; most of which
7664 // comes from specs (starting with link_command). Consult gcc for
7665 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007666 ArgStringList CmdArgs;
7667
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007668 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7669 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7670 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007671 for (const auto &Arg : Args)
7672 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007673 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007674 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007675 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007676 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007677 return;
7678 }
7679
Daniel Dunbarc1964212009-03-26 16:23:12 +00007680 // I'm not sure why this particular decomposition exists in gcc, but
7681 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007682 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007683
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007684 // It seems that the 'e' option is completely ignored for dynamic executables
7685 // (the default), and with static executables, the last one wins, as expected.
7686 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7687 options::OPT_Z_Flag, options::OPT_u_Group,
7688 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007689
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007690 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7691 // members of static archive libraries which implement Objective-C classes or
7692 // categories.
7693 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7694 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007695
Daniel Dunbarc1964212009-03-26 16:23:12 +00007696 CmdArgs.push_back("-o");
7697 CmdArgs.push_back(Output.getFilename());
7698
Douglas Katzman78b37b02015-11-17 20:28:07 +00007699 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007700 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007701
Peter Collingbournec4122c12015-06-15 21:08:13 +00007702 // SafeStack requires its own runtime libraries
7703 // These libraries should be linked first, to make sure the
7704 // __safestack_init constructor executes before everything else
7705 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7706 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7707 "libclang_rt.safestack_osx.a",
7708 /*AlwaysLink=*/true);
7709 }
7710
Daniel Dunbarc1964212009-03-26 16:23:12 +00007711 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007712
Douglas Gregor9295df02012-05-15 21:00:27 +00007713 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007714 // Build the input file for -filelist (list of linker input files) in case we
7715 // need it later
7716 for (const auto &II : Inputs) {
7717 if (!II.isFilename()) {
7718 // This is a linker input argument.
7719 // We cannot mix input arguments and file names in a -filelist input, thus
7720 // we prematurely stop our list (remaining files shall be passed as
7721 // arguments).
7722 if (InputFileList.size() > 0)
7723 break;
7724
7725 continue;
7726 }
7727
7728 InputFileList.push_back(II.getFilename());
7729 }
7730
Douglas Katzman78b37b02015-11-17 20:28:07 +00007731 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007732 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7733
Douglas Katzman78b37b02015-11-17 20:28:07 +00007734 if (isObjCRuntimeLinked(Args) &&
7735 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007736 // We use arclite library for both ARC and subscripting support.
7737 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7738
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007739 CmdArgs.push_back("-framework");
7740 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007741 // Link libobj.
7742 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007743 }
John McCall31168b02011-06-15 23:02:42 +00007744
Daniel Dunbarc1964212009-03-26 16:23:12 +00007745 if (LinkingOutput) {
7746 CmdArgs.push_back("-arch_multiple");
7747 CmdArgs.push_back("-final_output");
7748 CmdArgs.push_back(LinkingOutput);
7749 }
7750
Daniel Dunbarc1964212009-03-26 16:23:12 +00007751 if (Args.hasArg(options::OPT_fnested_functions))
7752 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007753
Justin Bognerc7701242015-05-12 05:44:36 +00007754 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7755
Douglas Katzman78b37b02015-11-17 20:28:07 +00007756 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007757 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007758 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007759
Daniel Dunbarc1964212009-03-26 16:23:12 +00007760 // link_ssp spec is empty.
7761
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007762 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007763 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007764 }
7765
Douglas Katzman78b37b02015-11-17 20:28:07 +00007766 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007767 // endfile_spec is empty.
7768 }
7769
7770 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7771 Args.AddAllArgs(CmdArgs, options::OPT_F);
7772
Steven Wu3ffb61b2015-02-06 18:08:29 +00007773 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007774 for (const Arg *A : Args.filtered(options::OPT_iframework))
7775 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007776
Douglas Katzman78b37b02015-11-17 20:28:07 +00007777 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007778 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7779 if (A->getValue() == StringRef("Accelerate")) {
7780 CmdArgs.push_back("-framework");
7781 CmdArgs.push_back("Accelerate");
7782 }
7783 }
7784 }
7785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007786 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007787 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007788 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007789 Cmd->setInputFileList(std::move(InputFileList));
7790 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007791}
7792
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007793void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007794 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007795 const InputInfoList &Inputs,
7796 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007797 const char *LinkingOutput) const {
7798 ArgStringList CmdArgs;
7799
7800 CmdArgs.push_back("-create");
7801 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007802
7803 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007804 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007805
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007806 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007807 assert(II.isFilename() && "Unexpected lipo input.");
7808 CmdArgs.push_back(II.getFilename());
7809 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007810
7811 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007812 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007813}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007814
Daniel Dunbar88299622010-06-04 18:28:36 +00007815void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007816 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007817 const InputInfoList &Inputs,
7818 const ArgList &Args,
7819 const char *LinkingOutput) const {
7820 ArgStringList CmdArgs;
7821
Daniel Dunbareb86b042011-05-09 17:23:16 +00007822 CmdArgs.push_back("-o");
7823 CmdArgs.push_back(Output.getFilename());
7824
Daniel Dunbar88299622010-06-04 18:28:36 +00007825 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7826 const InputInfo &Input = Inputs[0];
7827 assert(Input.isFilename() && "Unexpected dsymutil input.");
7828 CmdArgs.push_back(Input.getFilename());
7829
Daniel Dunbar88299622010-06-04 18:28:36 +00007830 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007831 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007832 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007833}
7834
Eric Christopher551ef452011-08-23 17:56:55 +00007835void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007836 const InputInfo &Output,
7837 const InputInfoList &Inputs,
7838 const ArgList &Args,
7839 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007840 ArgStringList CmdArgs;
7841 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007842 CmdArgs.push_back("--debug-info");
7843 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007844 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007845
7846 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7847 const InputInfo &Input = Inputs[0];
7848 assert(Input.isFilename() && "Unexpected verify input");
7849
7850 // Grabbing the output of the earlier dsymutil run.
7851 CmdArgs.push_back(Input.getFilename());
7852
7853 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007855 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007856}
7857
Douglas Katzman95354292015-06-23 20:42:09 +00007858void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007859 const InputInfo &Output,
7860 const InputInfoList &Inputs,
7861 const ArgList &Args,
7862 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007863 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007864 ArgStringList CmdArgs;
7865
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007866 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007867
7868 CmdArgs.push_back("-o");
7869 CmdArgs.push_back(Output.getFilename());
7870
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007871 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007872 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007873
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007874 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007875 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007876}
7877
Douglas Katzman95354292015-06-23 20:42:09 +00007878void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7879 const InputInfo &Output,
7880 const InputInfoList &Inputs,
7881 const ArgList &Args,
7882 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007883 ArgStringList CmdArgs;
7884
David Chisnall272a0712012-02-29 15:06:12 +00007885 // Demangle C++ names in errors
7886 CmdArgs.push_back("-C");
7887
Douglas Katzman78b37b02015-11-17 20:28:07 +00007888 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007889 CmdArgs.push_back("-e");
7890 CmdArgs.push_back("_start");
7891 }
7892
7893 if (Args.hasArg(options::OPT_static)) {
7894 CmdArgs.push_back("-Bstatic");
7895 CmdArgs.push_back("-dn");
7896 } else {
7897 CmdArgs.push_back("-Bdynamic");
7898 if (Args.hasArg(options::OPT_shared)) {
7899 CmdArgs.push_back("-shared");
7900 } else {
7901 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007902 CmdArgs.push_back(
7903 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007904 }
7905 }
7906
7907 if (Output.isFilename()) {
7908 CmdArgs.push_back("-o");
7909 CmdArgs.push_back(Output.getFilename());
7910 } else {
7911 assert(Output.isNothing() && "Invalid output.");
7912 }
7913
Douglas Katzman78b37b02015-11-17 20:28:07 +00007914 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007915 if (!Args.hasArg(options::OPT_shared))
7916 CmdArgs.push_back(
7917 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7918
7919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7920 CmdArgs.push_back(
7921 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7922 CmdArgs.push_back(
7923 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007924 }
7925
Douglas Katzman6059ef92015-11-17 17:41:23 +00007926 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007927
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007928 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7929 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007930
7931 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7932
Douglas Katzman78b37b02015-11-17 20:28:07 +00007933 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007934 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007935 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007936 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007937 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007938 if (!Args.hasArg(options::OPT_shared)) {
7939 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007940 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007941 }
David Chisnallf571cde2012-02-15 13:39:01 +00007942 }
7943
Douglas Katzman78b37b02015-11-17 20:28:07 +00007944 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007945 CmdArgs.push_back(
7946 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007947 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007948 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007949
Xinliang David Li69306c02015-10-22 06:15:31 +00007950 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007951
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007952 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007953 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007954}
7955
Douglas Katzman95354292015-06-23 20:42:09 +00007956void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7957 const InputInfo &Output,
7958 const InputInfoList &Inputs,
7959 const ArgList &Args,
7960 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007961 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007962 ArgStringList CmdArgs;
7963
Rafael Espindolacc126272014-02-28 01:55:21 +00007964 switch (getToolChain().getArch()) {
7965 case llvm::Triple::x86:
7966 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7967 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007968 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007969 break;
7970
7971 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007972 CmdArgs.push_back("-mppc");
7973 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007974 break;
7975
7976 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007977 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007978 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007979 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7980 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7981 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007982 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007983 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007984
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007985 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007986 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007987 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7988 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7989 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007990 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007991 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007992
7993 case llvm::Triple::mips64:
7994 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007995 StringRef CPUName;
7996 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007997 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007998
7999 CmdArgs.push_back("-mabi");
8000 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8001
8002 if (getToolChain().getArch() == llvm::Triple::mips64)
8003 CmdArgs.push_back("-EB");
8004 else
8005 CmdArgs.push_back("-EL");
8006
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008007 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00008008 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008009 }
8010
Rafael Espindolacc126272014-02-28 01:55:21 +00008011 default:
8012 break;
8013 }
8014
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008015 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008016
8017 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008018 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008019
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008020 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008021 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008022
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008023 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008024 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008025}
8026
Douglas Katzman95354292015-06-23 20:42:09 +00008027void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8028 const InputInfo &Output,
8029 const InputInfoList &Inputs,
8030 const ArgList &Args,
8031 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008032 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008033 ArgStringList CmdArgs;
8034
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00008035 // Silence warning for "clang -g foo.o -o foo"
8036 Args.ClaimAllArgs(options::OPT_g_Group);
8037 // and "clang -emit-llvm foo.o -o foo"
8038 Args.ClaimAllArgs(options::OPT_emit_llvm);
8039 // and for "clang -w foo.o -o foo". Other warning options are already
8040 // handled somewhere else.
8041 Args.ClaimAllArgs(options::OPT_w);
8042
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008043 if (getToolChain().getArch() == llvm::Triple::mips64)
8044 CmdArgs.push_back("-EB");
8045 else if (getToolChain().getArch() == llvm::Triple::mips64el)
8046 CmdArgs.push_back("-EL");
8047
Douglas Katzman78b37b02015-11-17 20:28:07 +00008048 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008049 CmdArgs.push_back("-e");
8050 CmdArgs.push_back("__start");
8051 }
8052
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008053 if (Args.hasArg(options::OPT_static)) {
8054 CmdArgs.push_back("-Bstatic");
8055 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008056 if (Args.hasArg(options::OPT_rdynamic))
8057 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008058 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008059 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008060 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008061 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008062 } else {
8063 CmdArgs.push_back("-dynamic-linker");
8064 CmdArgs.push_back("/usr/libexec/ld.so");
8065 }
8066 }
8067
Rafael Espindola044f7832013-06-05 04:28:55 +00008068 if (Args.hasArg(options::OPT_nopie))
8069 CmdArgs.push_back("-nopie");
8070
Daniel Dunbarb440f562010-08-02 02:38:21 +00008071 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008072 CmdArgs.push_back("-o");
8073 CmdArgs.push_back(Output.getFilename());
8074 } else {
8075 assert(Output.isNothing() && "Invalid output.");
8076 }
8077
Douglas Katzman78b37b02015-11-17 20:28:07 +00008078 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008079 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008080 if (Args.hasArg(options::OPT_pg))
8081 CmdArgs.push_back(
8082 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008083 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008084 CmdArgs.push_back(
8085 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8086 CmdArgs.push_back(
8087 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008088 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008089 CmdArgs.push_back(
8090 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008091 }
8092 }
8093
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008094 std::string Triple = getToolChain().getTripleString();
8095 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008096 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008097 CmdArgs.push_back(
8098 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008099
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008100 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8101 options::OPT_e, options::OPT_s, options::OPT_t,
8102 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008103
Daniel Dunbar54423b22010-09-17 00:24:54 +00008104 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008105
Douglas Katzman78b37b02015-11-17 20:28:07 +00008106 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008107 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008108 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008109 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008110 CmdArgs.push_back("-lm_p");
8111 else
8112 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008113 }
8114
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008115 // FIXME: For some reason GCC passes -lgcc before adding
8116 // the default system libraries. Just mimic this for now.
8117 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008118
Eric Christopher17674ec2012-09-13 06:32:34 +00008119 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008120 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8121 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008122 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008123 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008124 }
8125
Chandler Carruth45661652011-12-17 22:32:42 +00008126 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008127 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008128 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008129 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008130 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008131 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008132
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008133 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008134 }
8135
Douglas Katzman78b37b02015-11-17 20:28:07 +00008136 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008137 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008138 CmdArgs.push_back(
8139 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008140 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008141 CmdArgs.push_back(
8142 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008143 }
8144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008145 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008147}
Ed Schoutene33194b2009-04-02 19:13:12 +00008148
Douglas Katzman95354292015-06-23 20:42:09 +00008149void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8150 const InputInfo &Output,
8151 const InputInfoList &Inputs,
8152 const ArgList &Args,
8153 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008154 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008155 ArgStringList CmdArgs;
8156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008157 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008158
8159 CmdArgs.push_back("-o");
8160 CmdArgs.push_back(Output.getFilename());
8161
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008162 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008163 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008164
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008165 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008166 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008167}
8168
Douglas Katzman95354292015-06-23 20:42:09 +00008169void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8170 const InputInfo &Output,
8171 const InputInfoList &Inputs,
8172 const ArgList &Args,
8173 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008174 const Driver &D = getToolChain().getDriver();
8175 ArgStringList CmdArgs;
8176
Douglas Katzman78b37b02015-11-17 20:28:07 +00008177 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008178 CmdArgs.push_back("-e");
8179 CmdArgs.push_back("__start");
8180 }
8181
8182 if (Args.hasArg(options::OPT_static)) {
8183 CmdArgs.push_back("-Bstatic");
8184 } else {
8185 if (Args.hasArg(options::OPT_rdynamic))
8186 CmdArgs.push_back("-export-dynamic");
8187 CmdArgs.push_back("--eh-frame-hdr");
8188 CmdArgs.push_back("-Bdynamic");
8189 if (Args.hasArg(options::OPT_shared)) {
8190 CmdArgs.push_back("-shared");
8191 } else {
8192 CmdArgs.push_back("-dynamic-linker");
8193 CmdArgs.push_back("/usr/libexec/ld.so");
8194 }
8195 }
8196
8197 if (Output.isFilename()) {
8198 CmdArgs.push_back("-o");
8199 CmdArgs.push_back(Output.getFilename());
8200 } else {
8201 assert(Output.isNothing() && "Invalid output.");
8202 }
8203
Douglas Katzman78b37b02015-11-17 20:28:07 +00008204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008205 if (!Args.hasArg(options::OPT_shared)) {
8206 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008207 CmdArgs.push_back(
8208 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008209 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008210 CmdArgs.push_back(
8211 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8212 CmdArgs.push_back(
8213 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008215 CmdArgs.push_back(
8216 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008217 }
8218 }
8219
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008220 Args.AddAllArgs(CmdArgs,
8221 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008222
8223 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8224
Douglas Katzman78b37b02015-11-17 20:28:07 +00008225 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008226 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008227 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8228 if (Args.hasArg(options::OPT_pg))
8229 CmdArgs.push_back("-lm_p");
8230 else
8231 CmdArgs.push_back("-lm");
8232 }
8233
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008234 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008235 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008236 CmdArgs.push_back("-lpthread_p");
8237 else
8238 CmdArgs.push_back("-lpthread");
8239 }
8240
Eli Friedman9fa28852012-08-08 23:57:20 +00008241 if (!Args.hasArg(options::OPT_shared)) {
8242 if (Args.hasArg(options::OPT_pg))
8243 CmdArgs.push_back("-lc_p");
8244 else
8245 CmdArgs.push_back("-lc");
8246 }
8247
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008248 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008249 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008250 case llvm::Triple::arm:
8251 MyArch = "arm";
8252 break;
8253 case llvm::Triple::x86:
8254 MyArch = "i386";
8255 break;
8256 case llvm::Triple::x86_64:
8257 MyArch = "amd64";
8258 break;
8259 default:
8260 llvm_unreachable("Unsupported architecture");
8261 }
8262 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008263 }
8264
Douglas Katzman78b37b02015-11-17 20:28:07 +00008265 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008266 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008267 CmdArgs.push_back(
8268 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008269 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008270 CmdArgs.push_back(
8271 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008272 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008274 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008275 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008276}
8277
Douglas Katzman95354292015-06-23 20:42:09 +00008278void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8279 const InputInfo &Output,
8280 const InputInfoList &Inputs,
8281 const ArgList &Args,
8282 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008283 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008284 ArgStringList CmdArgs;
8285
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008286 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8287 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008288 switch (getToolChain().getArch()) {
8289 default:
8290 break;
8291 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008292 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008293 break;
8294 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008295 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008296 break;
8297 case llvm::Triple::mips:
8298 case llvm::Triple::mipsel:
8299 case llvm::Triple::mips64:
8300 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008301 StringRef CPUName;
8302 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008303 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008304
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008305 CmdArgs.push_back("-march");
8306 CmdArgs.push_back(CPUName.data());
8307
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008308 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008309 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008310
8311 if (getToolChain().getArch() == llvm::Triple::mips ||
8312 getToolChain().getArch() == llvm::Triple::mips64)
8313 CmdArgs.push_back("-EB");
8314 else
8315 CmdArgs.push_back("-EL");
8316
Dimitry Andric46f338c2015-12-27 10:36:44 +00008317 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8318 StringRef v = A->getValue();
8319 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8320 A->claim();
8321 }
8322
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008323 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008324 break;
8325 }
8326 case llvm::Triple::arm:
8327 case llvm::Triple::armeb:
8328 case llvm::Triple::thumb:
8329 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008330 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008331
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008332 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008333 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008334 else
Renato Golinf4421f72014-02-19 10:44:07 +00008335 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008336
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008337 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008338 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008339 case llvm::Triple::GNUEABI:
8340 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008341 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008342 break;
8343
8344 default:
8345 CmdArgs.push_back("-matpcs");
8346 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008347 break;
8348 }
8349 case llvm::Triple::sparc:
8350 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008351 case llvm::Triple::sparcv9: {
8352 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8353 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008354 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008355 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008356 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008357 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008359 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008360
8361 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008362 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008363
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008364 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008365 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008366
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008367 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008368 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008369}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008370
Douglas Katzman95354292015-06-23 20:42:09 +00008371void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8372 const InputInfo &Output,
8373 const InputInfoList &Inputs,
8374 const ArgList &Args,
8375 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008376 const toolchains::FreeBSD &ToolChain =
8377 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008378 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008379 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008380 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008381 !Args.hasArg(options::OPT_shared) &&
8382 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008383 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008384
8385 // Silence warning for "clang -g foo.o -o foo"
8386 Args.ClaimAllArgs(options::OPT_g_Group);
8387 // and "clang -emit-llvm foo.o -o foo"
8388 Args.ClaimAllArgs(options::OPT_emit_llvm);
8389 // and for "clang -w foo.o -o foo". Other warning options are already
8390 // handled somewhere else.
8391 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008392
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008393 if (!D.SysRoot.empty())
8394 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8395
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008396 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008397 CmdArgs.push_back("-pie");
8398
Ed Maste1bc232d2016-04-12 21:11:46 +00008399 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008400 if (Args.hasArg(options::OPT_static)) {
8401 CmdArgs.push_back("-Bstatic");
8402 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008403 if (Args.hasArg(options::OPT_rdynamic))
8404 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008405 if (Args.hasArg(options::OPT_shared)) {
8406 CmdArgs.push_back("-Bshareable");
8407 } else {
8408 CmdArgs.push_back("-dynamic-linker");
8409 CmdArgs.push_back("/libexec/ld-elf.so.1");
8410 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008411 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008412 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8413 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8414 CmdArgs.push_back("--hash-style=both");
8415 }
8416 }
8417 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008418 }
8419
8420 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8421 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008422 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008423 CmdArgs.push_back("-m");
8424 CmdArgs.push_back("elf_i386_fbsd");
8425 }
8426
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008427 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008428 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008429 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008430 }
8431
Dimitry Andric904895f2015-12-27 06:47:09 +00008432 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8433 if (ToolChain.getArch() == llvm::Triple::mips ||
8434 ToolChain.getArch() == llvm::Triple::mipsel ||
8435 ToolChain.getArch() == llvm::Triple::mips64 ||
8436 ToolChain.getArch() == llvm::Triple::mips64el) {
8437 StringRef v = A->getValue();
8438 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8439 A->claim();
8440 }
8441 }
8442
Daniel Dunbarb440f562010-08-02 02:38:21 +00008443 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008444 CmdArgs.push_back("-o");
8445 CmdArgs.push_back(Output.getFilename());
8446 } else {
8447 assert(Output.isNothing() && "Invalid output.");
8448 }
8449
Douglas Katzman78b37b02015-11-17 20:28:07 +00008450 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008451 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008452 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008453 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008454 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008455 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008456 crt1 = "Scrt1.o";
8457 else
8458 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008459 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008460 if (crt1)
8461 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8462
8463 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8464
Craig Topper92fc2df2014-05-17 16:56:41 +00008465 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008466 if (Args.hasArg(options::OPT_static))
8467 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008468 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008469 crtbegin = "crtbeginS.o";
8470 else
8471 crtbegin = "crtbegin.o";
8472
8473 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008474 }
8475
8476 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008477 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008478 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8479 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008480 Args.AddAllArgs(CmdArgs, options::OPT_s);
8481 Args.AddAllArgs(CmdArgs, options::OPT_t);
8482 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8483 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008484
Teresa Johnson945bc502015-10-15 20:35:53 +00008485 if (D.isUsingLTO())
8486 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008487
Alexey Samsonov52550342014-09-15 19:58:40 +00008488 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008489 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008490
Douglas Katzman78b37b02015-11-17 20:28:07 +00008491 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008492 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008493 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008494 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008495 if (Args.hasArg(options::OPT_pg))
8496 CmdArgs.push_back("-lm_p");
8497 else
8498 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008499 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008500 if (NeedsSanitizerDeps)
8501 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008502 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8503 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008504 if (Args.hasArg(options::OPT_pg))
8505 CmdArgs.push_back("-lgcc_p");
8506 else
8507 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008508 if (Args.hasArg(options::OPT_static)) {
8509 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008510 } else if (Args.hasArg(options::OPT_pg)) {
8511 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008512 } else {
8513 CmdArgs.push_back("--as-needed");
8514 CmdArgs.push_back("-lgcc_s");
8515 CmdArgs.push_back("--no-as-needed");
8516 }
8517
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008518 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008519 if (Args.hasArg(options::OPT_pg))
8520 CmdArgs.push_back("-lpthread_p");
8521 else
8522 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008523 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008524
Roman Divacky66f22762011-02-10 16:59:40 +00008525 if (Args.hasArg(options::OPT_pg)) {
8526 if (Args.hasArg(options::OPT_shared))
8527 CmdArgs.push_back("-lc");
8528 else
8529 CmdArgs.push_back("-lc_p");
8530 CmdArgs.push_back("-lgcc_p");
8531 } else {
8532 CmdArgs.push_back("-lc");
8533 CmdArgs.push_back("-lgcc");
8534 }
8535
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008536 if (Args.hasArg(options::OPT_static)) {
8537 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008538 } else if (Args.hasArg(options::OPT_pg)) {
8539 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008540 } else {
8541 CmdArgs.push_back("--as-needed");
8542 CmdArgs.push_back("-lgcc_s");
8543 CmdArgs.push_back("--no-as-needed");
8544 }
8545 }
8546
Douglas Katzman78b37b02015-11-17 20:28:07 +00008547 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008548 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008549 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008550 else
8551 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008552 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008553 }
8554
Xinliang David Li69306c02015-10-22 06:15:31 +00008555 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008556
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008557 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008558 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008559}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008560
Douglas Katzman95354292015-06-23 20:42:09 +00008561void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008562 const InputInfo &Output,
8563 const InputInfoList &Inputs,
8564 const ArgList &Args,
8565 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008566 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008567 ArgStringList CmdArgs;
8568
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008569 // GNU as needs different flags for creating the correct output format
8570 // on architectures with different ABIs or optional feature sets.
8571 switch (getToolChain().getArch()) {
8572 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008573 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008574 break;
8575 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008576 case llvm::Triple::armeb:
8577 case llvm::Triple::thumb:
8578 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008579 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008580 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8581 std::string Arch =
8582 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008583 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008584 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008585 }
8586
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008587 case llvm::Triple::mips:
8588 case llvm::Triple::mipsel:
8589 case llvm::Triple::mips64:
8590 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008591 StringRef CPUName;
8592 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008593 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008594
8595 CmdArgs.push_back("-march");
8596 CmdArgs.push_back(CPUName.data());
8597
8598 CmdArgs.push_back("-mabi");
8599 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8600
8601 if (getToolChain().getArch() == llvm::Triple::mips ||
8602 getToolChain().getArch() == llvm::Triple::mips64)
8603 CmdArgs.push_back("-EB");
8604 else
8605 CmdArgs.push_back("-EL");
8606
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008607 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008608 break;
8609 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008610
8611 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008612 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008613 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008614 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8615 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008616 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008617 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008618 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008619
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008620 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008621 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008622 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8623 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008624 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008625 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008626 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008627
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008628 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008629 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008630 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008632 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008633
8634 CmdArgs.push_back("-o");
8635 CmdArgs.push_back(Output.getFilename());
8636
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008637 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008638 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008639
David Chisnallddbd68f2011-09-27 22:03:18 +00008640 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008641 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008642}
8643
Douglas Katzman95354292015-06-23 20:42:09 +00008644void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8645 const InputInfo &Output,
8646 const InputInfoList &Inputs,
8647 const ArgList &Args,
8648 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008649 const Driver &D = getToolChain().getDriver();
8650 ArgStringList CmdArgs;
8651
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008652 if (!D.SysRoot.empty())
8653 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8654
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008655 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008656 if (Args.hasArg(options::OPT_static)) {
8657 CmdArgs.push_back("-Bstatic");
8658 } else {
8659 if (Args.hasArg(options::OPT_rdynamic))
8660 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008661 if (Args.hasArg(options::OPT_shared)) {
8662 CmdArgs.push_back("-Bshareable");
8663 } else {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008664 Args.AddAllArgs(CmdArgs, options::OPT_pie);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008665 CmdArgs.push_back("-dynamic-linker");
8666 CmdArgs.push_back("/libexec/ld.elf_so");
8667 }
8668 }
8669
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008670 // Many NetBSD architectures support more than one ABI.
8671 // Determine the correct emulation for ld.
8672 switch (getToolChain().getArch()) {
8673 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008674 CmdArgs.push_back("-m");
8675 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008676 break;
8677 case llvm::Triple::arm:
8678 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008679 CmdArgs.push_back("-m");
8680 switch (getToolChain().getTriple().getEnvironment()) {
8681 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008682 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008683 CmdArgs.push_back("armelf_nbsd_eabi");
8684 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008685 case llvm::Triple::EABIHF:
8686 case llvm::Triple::GNUEABIHF:
8687 CmdArgs.push_back("armelf_nbsd_eabihf");
8688 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008689 default:
8690 CmdArgs.push_back("armelf_nbsd");
8691 break;
8692 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008693 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008694 case llvm::Triple::armeb:
8695 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008696 arm::appendEBLinkFlags(
8697 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008698 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008699 CmdArgs.push_back("-m");
8700 switch (getToolChain().getTriple().getEnvironment()) {
8701 case llvm::Triple::EABI:
8702 case llvm::Triple::GNUEABI:
8703 CmdArgs.push_back("armelfb_nbsd_eabi");
8704 break;
8705 case llvm::Triple::EABIHF:
8706 case llvm::Triple::GNUEABIHF:
8707 CmdArgs.push_back("armelfb_nbsd_eabihf");
8708 break;
8709 default:
8710 CmdArgs.push_back("armelfb_nbsd");
8711 break;
8712 }
8713 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008714 case llvm::Triple::mips64:
8715 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008716 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008717 CmdArgs.push_back("-m");
8718 if (getToolChain().getArch() == llvm::Triple::mips64)
8719 CmdArgs.push_back("elf32btsmip");
8720 else
8721 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008722 } else if (mips::hasMipsAbiArg(Args, "64")) {
8723 CmdArgs.push_back("-m");
8724 if (getToolChain().getArch() == llvm::Triple::mips64)
8725 CmdArgs.push_back("elf64btsmip");
8726 else
8727 CmdArgs.push_back("elf64ltsmip");
8728 }
8729 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008730 case llvm::Triple::ppc:
8731 CmdArgs.push_back("-m");
8732 CmdArgs.push_back("elf32ppc_nbsd");
8733 break;
8734
8735 case llvm::Triple::ppc64:
8736 case llvm::Triple::ppc64le:
8737 CmdArgs.push_back("-m");
8738 CmdArgs.push_back("elf64ppc");
8739 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008740
8741 case llvm::Triple::sparc:
8742 CmdArgs.push_back("-m");
8743 CmdArgs.push_back("elf32_sparc");
8744 break;
8745
8746 case llvm::Triple::sparcv9:
8747 CmdArgs.push_back("-m");
8748 CmdArgs.push_back("elf64_sparc");
8749 break;
8750
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008751 default:
8752 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008753 }
8754
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008755 if (Output.isFilename()) {
8756 CmdArgs.push_back("-o");
8757 CmdArgs.push_back(Output.getFilename());
8758 } else {
8759 assert(Output.isNothing() && "Invalid output.");
8760 }
8761
Douglas Katzman78b37b02015-11-17 20:28:07 +00008762 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008763 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008764 CmdArgs.push_back(
8765 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008766 }
8767 CmdArgs.push_back(
8768 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8769 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008770 CmdArgs.push_back(
8771 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008772 } else {
8773 CmdArgs.push_back(
8774 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008775 }
8776 }
8777
8778 Args.AddAllArgs(CmdArgs, options::OPT_L);
8779 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8780 Args.AddAllArgs(CmdArgs, options::OPT_e);
8781 Args.AddAllArgs(CmdArgs, options::OPT_s);
8782 Args.AddAllArgs(CmdArgs, options::OPT_t);
8783 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8784 Args.AddAllArgs(CmdArgs, options::OPT_r);
8785
8786 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8787
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008788 unsigned Major, Minor, Micro;
8789 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8790 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008791 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008792 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008793 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008794 case llvm::Triple::arm:
8795 case llvm::Triple::armeb:
8796 case llvm::Triple::thumb:
8797 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008798 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008799 case llvm::Triple::ppc64:
8800 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008801 case llvm::Triple::sparc:
8802 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008803 case llvm::Triple::x86:
8804 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008805 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008806 break;
8807 default:
8808 break;
8809 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008810 }
8811
Douglas Katzman78b37b02015-11-17 20:28:07 +00008812 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008813 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008814 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008815 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8816 CmdArgs.push_back("-lm");
8817 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008818 if (Args.hasArg(options::OPT_pthread))
8819 CmdArgs.push_back("-lpthread");
8820 CmdArgs.push_back("-lc");
8821
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008822 if (useLibgcc) {
8823 if (Args.hasArg(options::OPT_static)) {
8824 // libgcc_eh depends on libc, so resolve as much as possible,
8825 // pull in any new requirements from libc and then get the rest
8826 // of libgcc.
8827 CmdArgs.push_back("-lgcc_eh");
8828 CmdArgs.push_back("-lc");
8829 CmdArgs.push_back("-lgcc");
8830 } else {
8831 CmdArgs.push_back("-lgcc");
8832 CmdArgs.push_back("--as-needed");
8833 CmdArgs.push_back("-lgcc_s");
8834 CmdArgs.push_back("--no-as-needed");
8835 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008836 }
8837 }
8838
Douglas Katzman78b37b02015-11-17 20:28:07 +00008839 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008840 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008841 CmdArgs.push_back(
8842 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008843 else
8844 CmdArgs.push_back(
8845 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008846 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008847 }
8848
Xinliang David Li69306c02015-10-22 06:15:31 +00008849 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008850
Logan Chieneb9162f2014-06-26 14:23:45 +00008851 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008852 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008853}
8854
Douglas Katzman95354292015-06-23 20:42:09 +00008855void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8856 const InputInfo &Output,
8857 const InputInfoList &Inputs,
8858 const ArgList &Args,
8859 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008860 claimNoWarnArgs(Args);
8861
James Y Knight2db38f32015-08-15 03:45:25 +00008862 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8863 llvm::Triple Triple = llvm::Triple(TripleStr);
8864
Rafael Espindola92b00932010-08-10 00:25:48 +00008865 ArgStringList CmdArgs;
8866
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008867 llvm::Reloc::Model RelocationModel;
8868 unsigned PICLevel;
8869 bool IsPIE;
8870 std::tie(RelocationModel, PICLevel, IsPIE) =
8871 ParsePICArgs(getToolChain(), Triple, Args);
8872
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008873 switch (getToolChain().getArch()) {
8874 default:
8875 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008876 // Add --32/--64 to make sure we get the format we want.
8877 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008878 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008879 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008880 break;
8881 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008882 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8883 CmdArgs.push_back("--x32");
8884 else
8885 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008886 break;
8887 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008888 CmdArgs.push_back("-a32");
8889 CmdArgs.push_back("-mppc");
8890 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008891 break;
8892 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008893 CmdArgs.push_back("-a64");
8894 CmdArgs.push_back("-mppc64");
8895 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008896 break;
8897 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008898 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008899 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008900 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008901 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008902 break;
8903 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008904 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008905 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008906 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8907 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8908 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008909 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008910 }
8911 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008912 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008913 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8914 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8915 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008916 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008917 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008918 case llvm::Triple::arm:
8919 case llvm::Triple::armeb:
8920 case llvm::Triple::thumb:
8921 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008922 const llvm::Triple &Triple2 = getToolChain().getTriple();
8923 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008924 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008925 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008926 break;
8927 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008928 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008929 break;
8930 default:
8931 break;
8932 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008933
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008934 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008935 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8936 case arm::FloatABI::Soft:
8937 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8938 break;
8939 case arm::FloatABI::SoftFP:
8940 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8941 break;
8942 case arm::FloatABI::Hard:
8943 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8944 break;
8945 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008946
8947 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008948
8949 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008950 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008951 // march from being picked in the absence of a cpu flag.
8952 Arg *A;
8953 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008954 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008955 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008956 else
8957 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008958 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008959 break;
8960 }
8961 case llvm::Triple::mips:
8962 case llvm::Triple::mipsel:
8963 case llvm::Triple::mips64:
8964 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008965 StringRef CPUName;
8966 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008967 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008968 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008969
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008970 CmdArgs.push_back("-march");
8971 CmdArgs.push_back(CPUName.data());
8972
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008973 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008974 CmdArgs.push_back(ABIName.data());
8975
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008976 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8977 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008978 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008979 CmdArgs.push_back("-mno-shared");
8980
Daniel Sanders379d44b2014-07-16 11:52:23 +00008981 // LLVM doesn't support -mplt yet and acts as if it is always given.
8982 // However, -mplt has no effect with the N64 ABI.
8983 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008984
8985 if (getToolChain().getArch() == llvm::Triple::mips ||
8986 getToolChain().getArch() == llvm::Triple::mips64)
8987 CmdArgs.push_back("-EB");
8988 else
8989 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008990
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008991 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8992 if (StringRef(A->getValue()) == "2008")
8993 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8994 }
8995
Daniel Sanders379d44b2014-07-16 11:52:23 +00008996 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8997 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8998 options::OPT_mfp64)) {
8999 A->claim();
9000 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00009001 } else if (mips::shouldUseFPXX(
9002 Args, getToolChain().getTriple(), CPUName, ABIName,
9003 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00009004 CmdArgs.push_back("-mfpxx");
9005
9006 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
9007 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009008 if (Arg *A =
9009 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00009010 if (A->getOption().matches(options::OPT_mips16)) {
9011 A->claim();
9012 A->render(Args, CmdArgs);
9013 } else {
9014 A->claim();
9015 CmdArgs.push_back("-no-mips16");
9016 }
9017 }
9018
Simon Atanasyan036d16d2013-04-30 07:47:13 +00009019 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
9020 options::OPT_mno_micromips);
9021 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
9022 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
9023
Simon Atanasyanbd986632013-11-26 11:58:04 +00009024 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
9025 // Do not use AddLastArg because not all versions of MIPS assembler
9026 // support -mmsa / -mno-msa options.
9027 if (A->getOption().matches(options::OPT_mmsa))
9028 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
9029 }
9030
Daniel Sanders379d44b2014-07-16 11:52:23 +00009031 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
9032 options::OPT_msoft_float);
9033
Toma Tabacub36d6102015-06-11 12:13:18 +00009034 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
9035 options::OPT_msingle_float);
9036
Daniel Sanders379d44b2014-07-16 11:52:23 +00009037 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
9038 options::OPT_mno_odd_spreg);
9039
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009040 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009041 break;
9042 }
9043 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009044 // Always pass an -march option, since our default of z10 is later
9045 // than the GNU assembler's default.
9046 StringRef CPUName = getSystemZTargetCPU(Args);
9047 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009048 break;
9049 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009050 }
9051
Renato Golina74bbc72015-07-22 15:32:36 +00009052 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009053 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00009054
9055 CmdArgs.push_back("-o");
9056 CmdArgs.push_back(Output.getFilename());
9057
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009058 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00009059 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00009060
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009061 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009062 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00009063
9064 // Handle the debug info splitting at object creation time if we're
9065 // creating an object.
9066 // TODO: Currently only works on linux with newer objcopy.
9067 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00009068 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00009069 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00009070 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009071}
9072
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009073static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009074 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009075 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009076 bool isCygMing = Triple.isOSCygMing();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009077 bool IsIAMCU = Triple.isOSIAMCU();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009078 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9079 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009080 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009081 CmdArgs.push_back("-lgcc");
9082
Logan Chien3d3373c2012-11-19 12:04:11 +00009083 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009084 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009085 CmdArgs.push_back("-lgcc");
9086 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009087 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009088 CmdArgs.push_back("--as-needed");
9089 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009090 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009091 CmdArgs.push_back("--no-as-needed");
9092 }
9093
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009094 if (StaticLibgcc && !isAndroid && !IsIAMCU)
Rafael Espindolacc354322011-10-17 21:39:04 +00009095 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009096 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009097 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009098
9099 // According to Android ABI, we have to link with libdl if we are
9100 // linking with non-static libgcc.
9101 //
9102 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9103 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9104 if (isAndroid && !StaticLibgcc)
9105 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009106}
9107
Renato Golinc4b49242014-02-13 10:01:16 +00009108static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009109 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009110 // Make use of compiler-rt if --rtlib option is used
9111 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9112
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009113 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009114 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009115 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009116 default:
9117 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009118 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009119 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009120 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009121 break;
9122 }
Renato Golinc4b49242014-02-13 10:01:16 +00009123 break;
9124 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009125 // Make sure libgcc is not used under MSVC environment by default
9126 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9127 // Issue error diagnostic if libgcc is explicitly specified
9128 // through command line as --rtlib option argument.
9129 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9130 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9131 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9132 }
9133 } else
9134 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009135 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009136 }
9137}
9138
Rafael Espindola1e085772014-08-15 17:14:35 +00009139static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9140 switch (T.getArch()) {
9141 case llvm::Triple::x86:
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009142 if (T.isOSIAMCU())
9143 return "elf_iamcu";
Rafael Espindola1e085772014-08-15 17:14:35 +00009144 return "elf_i386";
9145 case llvm::Triple::aarch64:
9146 return "aarch64linux";
9147 case llvm::Triple::aarch64_be:
9148 return "aarch64_be_linux";
9149 case llvm::Triple::arm:
9150 case llvm::Triple::thumb:
9151 return "armelf_linux_eabi";
9152 case llvm::Triple::armeb:
9153 case llvm::Triple::thumbeb:
Strahinja Petrovicb8598962016-06-10 16:09:20 +00009154 return "armelfb_linux_eabi";
Rafael Espindola1e085772014-08-15 17:14:35 +00009155 case llvm::Triple::ppc:
9156 return "elf32ppclinux";
9157 case llvm::Triple::ppc64:
9158 return "elf64ppc";
9159 case llvm::Triple::ppc64le:
9160 return "elf64lppc";
9161 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009162 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009163 return "elf32_sparc";
9164 case llvm::Triple::sparcv9:
9165 return "elf64_sparc";
9166 case llvm::Triple::mips:
9167 return "elf32btsmip";
9168 case llvm::Triple::mipsel:
9169 return "elf32ltsmip";
9170 case llvm::Triple::mips64:
9171 if (mips::hasMipsAbiArg(Args, "n32"))
9172 return "elf32btsmipn32";
9173 return "elf64btsmip";
9174 case llvm::Triple::mips64el:
9175 if (mips::hasMipsAbiArg(Args, "n32"))
9176 return "elf32ltsmipn32";
9177 return "elf64ltsmip";
9178 case llvm::Triple::systemz:
9179 return "elf64_s390";
9180 case llvm::Triple::x86_64:
9181 if (T.getEnvironment() == llvm::Triple::GNUX32)
9182 return "elf32_x86_64";
9183 return "elf_x86_64";
9184 default:
9185 llvm_unreachable("Unexpected arch");
9186 }
9187}
9188
Douglas Katzman95354292015-06-23 20:42:09 +00009189void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9190 const InputInfo &Output,
9191 const InputInfoList &Inputs,
9192 const ArgList &Args,
9193 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009194 const toolchains::Linux &ToolChain =
9195 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009196 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009197
9198 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9199 llvm::Triple Triple = llvm::Triple(TripleStr);
9200
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009201 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009202 const bool isAndroid = ToolChain.getTriple().isAndroid();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009203 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009204 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009205 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9206 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009207 const bool HasCRTBeginEndFiles =
9208 ToolChain.getTriple().hasEnvironment() ||
9209 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009210
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009211 ArgStringList CmdArgs;
9212
Rafael Espindolad1002f62010-11-15 18:28:16 +00009213 // Silence warning for "clang -g foo.o -o foo"
9214 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009215 // and "clang -emit-llvm foo.o -o foo"
9216 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009217 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009218 // handled somewhere else.
9219 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009220
Peter Collingbourne39719a72015-11-20 20:49:39 +00009221 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9222 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009223 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009224 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009225 CmdArgs.push_back("-target");
9226 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9227 }
9228
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009229 if (!D.SysRoot.empty())
9230 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009231
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009232 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009233 CmdArgs.push_back("-pie");
9234
Rafael Espindola1c76c592010-11-07 22:57:16 +00009235 if (Args.hasArg(options::OPT_rdynamic))
9236 CmdArgs.push_back("-export-dynamic");
9237
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009238 if (Args.hasArg(options::OPT_s))
9239 CmdArgs.push_back("-s");
9240
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009241 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009242 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009243
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009244 for (const auto &Opt : ToolChain.ExtraOpts)
9245 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009246
9247 if (!Args.hasArg(options::OPT_static)) {
9248 CmdArgs.push_back("--eh-frame-hdr");
9249 }
9250
9251 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009252 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009253
9254 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009255 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9256 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009257 CmdArgs.push_back("-Bstatic");
9258 else
9259 CmdArgs.push_back("-static");
9260 } else if (Args.hasArg(options::OPT_shared)) {
9261 CmdArgs.push_back("-shared");
9262 }
9263
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009264 if (!Args.hasArg(options::OPT_static)) {
9265 if (Args.hasArg(options::OPT_rdynamic))
9266 CmdArgs.push_back("-export-dynamic");
9267
9268 if (!Args.hasArg(options::OPT_shared)) {
9269 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009270 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009271 CmdArgs.push_back("-dynamic-linker");
9272 CmdArgs.push_back(Args.MakeArgString(Loader));
9273 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009274 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009275
9276 CmdArgs.push_back("-o");
9277 CmdArgs.push_back(Output.getFilename());
9278
Douglas Katzman78b37b02015-11-17 20:28:07 +00009279 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009280 if (!isAndroid && !IsIAMCU) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009281 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009282 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009283 if (Args.hasArg(options::OPT_pg))
9284 crt1 = "gcrt1.o";
9285 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009286 crt1 = "Scrt1.o";
9287 else
9288 crt1 = "crt1.o";
9289 }
9290 if (crt1)
9291 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009292
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009293 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9294 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009295
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009296 if (IsIAMCU)
9297 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
9298 else {
9299 const char *crtbegin;
9300 if (Args.hasArg(options::OPT_static))
9301 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
9302 else if (Args.hasArg(options::OPT_shared))
9303 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
9304 else if (IsPIE)
9305 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
9306 else
9307 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009308
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009309 if (HasCRTBeginEndFiles)
9310 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9311 }
Benjamin Kramer058666a2012-10-04 19:42:20 +00009312
9313 // Add crtfastmath.o if available and fast math is enabled.
9314 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009315 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009316
9317 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009318 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009319
Douglas Katzman6059ef92015-11-17 17:41:23 +00009320 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009321
Teresa Johnson945bc502015-10-15 20:35:53 +00009322 if (D.isUsingLTO())
9323 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009324
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009325 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9326 CmdArgs.push_back("--no-demangle");
9327
Alexey Samsonov52550342014-09-15 19:58:40 +00009328 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009329 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009330 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009331 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009332
Douglas Katzman78b37b02015-11-17 20:28:07 +00009333 if (D.CCCIsCXX() &&
9334 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009335 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009336 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009337 if (OnlyLibstdcxxStatic)
9338 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009339 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009340 if (OnlyLibstdcxxStatic)
9341 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009342 CmdArgs.push_back("-lm");
9343 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009344 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9345 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009346
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009347 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009348 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9349 if (Args.hasArg(options::OPT_static))
9350 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009351
Alexey Samsonov52550342014-09-15 19:58:40 +00009352 if (NeedsSanitizerDeps)
9353 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9354
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009355 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9356 Args.hasArg(options::OPT_pthreads);
9357
9358 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9359 options::OPT_fno_openmp, false)) {
9360 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9361 // FIXME: Does this really make sense for all GNU toolchains?
9362 WantPthread = true;
9363
9364 // Also link the particular OpenMP runtimes.
9365 switch (getOpenMPRuntime(ToolChain, Args)) {
9366 case OMPRT_OMP:
9367 CmdArgs.push_back("-lomp");
9368 break;
9369 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009370 CmdArgs.push_back("-lgomp");
9371
9372 // FIXME: Exclude this for platforms with libgomp that don't require
9373 // librt. Most modern Linux platforms require it, but some may not.
9374 CmdArgs.push_back("-lrt");
9375 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009376 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009377 CmdArgs.push_back("-liomp5");
9378 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009379 case OMPRT_Unknown:
9380 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009381 break;
9382 }
Chandler Carruth01538002013-01-17 13:19:29 +00009383 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009384
Renato Golinc4b49242014-02-13 10:01:16 +00009385 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009386
Richard Smith31d1de22015-05-20 22:48:44 +00009387 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009388 CmdArgs.push_back("-lpthread");
9389
Rafael Espindolab17bc532016-01-25 18:29:16 +00009390 if (Args.hasArg(options::OPT_fsplit_stack))
9391 CmdArgs.push_back("--wrap=pthread_create");
9392
Chandler Carruth94a32012012-05-14 18:31:18 +00009393 CmdArgs.push_back("-lc");
9394
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009395 // Add IAMCU specific libs, if needed.
9396 if (IsIAMCU)
9397 CmdArgs.push_back("-lgloss");
9398
Chandler Carruth94a32012012-05-14 18:31:18 +00009399 if (Args.hasArg(options::OPT_static))
9400 CmdArgs.push_back("--end-group");
9401 else
Renato Golinc4b49242014-02-13 10:01:16 +00009402 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009403
9404 // Add IAMCU specific libs (outside the group), if needed.
9405 if (IsIAMCU) {
9406 CmdArgs.push_back("--as-needed");
9407 CmdArgs.push_back("-lsoftfp");
9408 CmdArgs.push_back("--no-as-needed");
9409 }
Chandler Carruth94a32012012-05-14 18:31:18 +00009410 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009411
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009412 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
Rafael Espindola81937ec2010-12-01 01:52:43 +00009413 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009414 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009415 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009416 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009417 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009418 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009419 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009420
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009421 if (HasCRTBeginEndFiles)
9422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009423 if (!isAndroid)
9424 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009425 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009426 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009427
Peter Collingbourne39719a72015-11-20 20:49:39 +00009428 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009429}
9430
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009431// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9432// for the various SFI requirements like register masking. The assembly tool
9433// inserts the file containing the macros as an input into all the assembly
9434// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009435void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9436 const InputInfo &Output,
9437 const InputInfoList &Inputs,
9438 const ArgList &Args,
9439 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009440 const toolchains::NaClToolChain &ToolChain =
9441 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009442 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009443 "nacl-arm-macros.s");
9444 InputInfoList NewInputs;
9445 NewInputs.push_back(NaClMacros);
9446 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009447 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9448 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009449}
9450
Douglas Katzman750cfc52015-06-29 18:42:16 +00009451// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009452// we use static by default, do not yet support sanitizers or LTO, and a few
9453// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009454// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009455void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9456 const InputInfo &Output,
9457 const InputInfoList &Inputs,
9458 const ArgList &Args,
9459 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009460
Douglas Katzman54366072015-07-27 16:53:08 +00009461 const toolchains::NaClToolChain &ToolChain =
9462 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009463 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009464 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009465 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009466 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009467
9468 ArgStringList CmdArgs;
9469
9470 // Silence warning for "clang -g foo.o -o foo"
9471 Args.ClaimAllArgs(options::OPT_g_Group);
9472 // and "clang -emit-llvm foo.o -o foo"
9473 Args.ClaimAllArgs(options::OPT_emit_llvm);
9474 // and for "clang -w foo.o -o foo". Other warning options are already
9475 // handled somewhere else.
9476 Args.ClaimAllArgs(options::OPT_w);
9477
9478 if (!D.SysRoot.empty())
9479 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9480
9481 if (Args.hasArg(options::OPT_rdynamic))
9482 CmdArgs.push_back("-export-dynamic");
9483
9484 if (Args.hasArg(options::OPT_s))
9485 CmdArgs.push_back("-s");
9486
Douglas Katzman54366072015-07-27 16:53:08 +00009487 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9488 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009489 CmdArgs.push_back("--build-id");
9490
9491 if (!IsStatic)
9492 CmdArgs.push_back("--eh-frame-hdr");
9493
9494 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009495 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009496 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009497 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009498 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009499 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009500 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009501 else if (Arch == llvm::Triple::mipsel)
9502 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009503 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009504 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9505 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009506
9507 if (IsStatic)
9508 CmdArgs.push_back("-static");
9509 else if (Args.hasArg(options::OPT_shared))
9510 CmdArgs.push_back("-shared");
9511
9512 CmdArgs.push_back("-o");
9513 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009514 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009515 if (!Args.hasArg(options::OPT_shared))
9516 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9518
9519 const char *crtbegin;
9520 if (IsStatic)
9521 crtbegin = "crtbeginT.o";
9522 else if (Args.hasArg(options::OPT_shared))
9523 crtbegin = "crtbeginS.o";
9524 else
9525 crtbegin = "crtbegin.o";
9526 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9527 }
9528
9529 Args.AddAllArgs(CmdArgs, options::OPT_L);
9530 Args.AddAllArgs(CmdArgs, options::OPT_u);
9531
Douglas Katzman6059ef92015-11-17 17:41:23 +00009532 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009533
9534 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9535 CmdArgs.push_back("--no-demangle");
9536
9537 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9538
Douglas Katzman78b37b02015-11-17 20:28:07 +00009539 if (D.CCCIsCXX() &&
9540 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009541 bool OnlyLibstdcxxStatic =
9542 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009543 if (OnlyLibstdcxxStatic)
9544 CmdArgs.push_back("-Bstatic");
9545 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9546 if (OnlyLibstdcxxStatic)
9547 CmdArgs.push_back("-Bdynamic");
9548 CmdArgs.push_back("-lm");
9549 }
9550
9551 if (!Args.hasArg(options::OPT_nostdlib)) {
9552 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9553 // Always use groups, since it has no effect on dynamic libraries.
9554 CmdArgs.push_back("--start-group");
9555 CmdArgs.push_back("-lc");
9556 // NaCl's libc++ currently requires libpthread, so just always include it
9557 // in the group for C++.
9558 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009559 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009560 // Gold, used by Mips, handles nested groups differently than ld, and
9561 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9562 // which is not a desired behaviour here.
9563 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9564 if (getToolChain().getArch() == llvm::Triple::mipsel)
9565 CmdArgs.push_back("-lnacl");
9566
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009567 CmdArgs.push_back("-lpthread");
9568 }
9569
9570 CmdArgs.push_back("-lgcc");
9571 CmdArgs.push_back("--as-needed");
9572 if (IsStatic)
9573 CmdArgs.push_back("-lgcc_eh");
9574 else
9575 CmdArgs.push_back("-lgcc_s");
9576 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009577
9578 // Mips needs to create and use pnacl_legacy library that contains
9579 // definitions from bitcode/pnaclmm.c and definitions for
9580 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9581 if (getToolChain().getArch() == llvm::Triple::mipsel)
9582 CmdArgs.push_back("-lpnacl_legacy");
9583
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009584 CmdArgs.push_back("--end-group");
9585 }
9586
9587 if (!Args.hasArg(options::OPT_nostartfiles)) {
9588 const char *crtend;
9589 if (Args.hasArg(options::OPT_shared))
9590 crtend = "crtendS.o";
9591 else
9592 crtend = "crtend.o";
9593
9594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9595 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9596 }
9597 }
9598
Peter Collingbourne39719a72015-11-20 20:49:39 +00009599 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9600 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009601}
9602
Douglas Katzman95354292015-06-23 20:42:09 +00009603void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9604 const InputInfo &Output,
9605 const InputInfoList &Inputs,
9606 const ArgList &Args,
9607 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009608 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009609 ArgStringList CmdArgs;
9610
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009611 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009612
9613 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009614 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009615
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009616 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009617 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009618
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009619 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009620 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009621}
9622
Douglas Katzman95354292015-06-23 20:42:09 +00009623void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9624 const InputInfo &Output,
9625 const InputInfoList &Inputs,
9626 const ArgList &Args,
9627 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009628 const Driver &D = getToolChain().getDriver();
9629 ArgStringList CmdArgs;
9630
Daniel Dunbarb440f562010-08-02 02:38:21 +00009631 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009632 CmdArgs.push_back("-o");
9633 CmdArgs.push_back(Output.getFilename());
9634 } else {
9635 assert(Output.isNothing() && "Invalid output.");
9636 }
9637
Douglas Katzman78b37b02015-11-17 20:28:07 +00009638 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009639 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9640 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9641 CmdArgs.push_back(
9642 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9643 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009644 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009645
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009646 Args.AddAllArgs(CmdArgs,
9647 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009648
Daniel Dunbar54423b22010-09-17 00:24:54 +00009649 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009650
Xinliang David Li69306c02015-10-22 06:15:31 +00009651 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009652
Douglas Katzman78b37b02015-11-17 20:28:07 +00009653 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009654 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009655 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009656 CmdArgs.push_back("-lm");
9657 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009658 }
9659
Douglas Katzman78b37b02015-11-17 20:28:07 +00009660 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009661 if (Args.hasArg(options::OPT_pthread))
9662 CmdArgs.push_back("-lpthread");
9663 CmdArgs.push_back("-lc");
9664 CmdArgs.push_back("-lCompilerRT-Generic");
9665 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9666 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009667 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009668 }
9669
Logan Chieneb9162f2014-06-26 14:23:45 +00009670 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009672}
9673
Daniel Dunbarcc912342009-05-02 18:28:39 +00009674/// DragonFly Tools
9675
9676// For now, DragonFly Assemble does just about the same as for
9677// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009678void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9679 const InputInfo &Output,
9680 const InputInfoList &Inputs,
9681 const ArgList &Args,
9682 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009683 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009684 ArgStringList CmdArgs;
9685
9686 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9687 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009688 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009689 CmdArgs.push_back("--32");
9690
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009691 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009692
9693 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009694 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009695
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009696 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009697 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009698
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009699 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009700 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009701}
9702
Douglas Katzman95354292015-06-23 20:42:09 +00009703void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9704 const InputInfo &Output,
9705 const InputInfoList &Inputs,
9706 const ArgList &Args,
9707 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009708 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009709 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009710
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009711 if (!D.SysRoot.empty())
9712 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9713
John McCall65b8da02013-04-11 22:55:55 +00009714 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009715 if (Args.hasArg(options::OPT_static)) {
9716 CmdArgs.push_back("-Bstatic");
9717 } else {
John McCall65b8da02013-04-11 22:55:55 +00009718 if (Args.hasArg(options::OPT_rdynamic))
9719 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009720 if (Args.hasArg(options::OPT_shared))
9721 CmdArgs.push_back("-Bshareable");
9722 else {
9723 CmdArgs.push_back("-dynamic-linker");
9724 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9725 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009726 CmdArgs.push_back("--hash-style=gnu");
9727 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009728 }
9729
9730 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9731 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009732 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009733 CmdArgs.push_back("-m");
9734 CmdArgs.push_back("elf_i386");
9735 }
9736
Daniel Dunbarb440f562010-08-02 02:38:21 +00009737 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009738 CmdArgs.push_back("-o");
9739 CmdArgs.push_back(Output.getFilename());
9740 } else {
9741 assert(Output.isNothing() && "Invalid output.");
9742 }
9743
Douglas Katzman78b37b02015-11-17 20:28:07 +00009744 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009745 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009746 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009747 CmdArgs.push_back(
9748 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009749 else {
9750 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009751 CmdArgs.push_back(
9752 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009753 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009754 CmdArgs.push_back(
9755 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009756 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009757 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009758 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009759 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009760 CmdArgs.push_back(
9761 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009762 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009763 CmdArgs.push_back(
9764 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009765 }
9766
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009767 Args.AddAllArgs(CmdArgs,
9768 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009769
Daniel Dunbar54423b22010-09-17 00:24:54 +00009770 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009771
Douglas Katzman78b37b02015-11-17 20:28:07 +00009772 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009773 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009774
9775 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009776 CmdArgs.push_back("-rpath");
9777 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009778 }
9779
Hans Wennborg70850d82013-07-18 20:29:38 +00009780 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009781 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009782 CmdArgs.push_back("-lm");
9783 }
9784
Daniel Dunbarcc912342009-05-02 18:28:39 +00009785 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009786 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009787
9788 if (!Args.hasArg(options::OPT_nolibc)) {
9789 CmdArgs.push_back("-lc");
9790 }
9791
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009792 if (Args.hasArg(options::OPT_static) ||
9793 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009794 CmdArgs.push_back("-lgcc");
9795 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009796 } else {
9797 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009798 CmdArgs.push_back("-lgcc_pic");
9799 if (!Args.hasArg(options::OPT_shared))
9800 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009801 } else {
John McCall65b8da02013-04-11 22:55:55 +00009802 CmdArgs.push_back("-lgcc");
9803 CmdArgs.push_back("--as-needed");
9804 CmdArgs.push_back("-lgcc_pic");
9805 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009806 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009807 }
9808 }
9809
Douglas Katzman78b37b02015-11-17 20:28:07 +00009810 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009811 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009812 CmdArgs.push_back(
9813 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009814 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009815 CmdArgs.push_back(
9816 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9817 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009818 }
9819
Xinliang David Li69306c02015-10-22 06:15:31 +00009820 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009821
Logan Chieneb9162f2014-06-26 14:23:45 +00009822 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009823 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009824}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009825
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009826// Try to find Exe from a Visual Studio distribution. This first tries to find
9827// an installed copy of Visual Studio and, failing that, looks in the PATH,
9828// making sure that whatever executable that's found is not a same-named exe
9829// from clang itself to prevent clang from falling back to itself.
9830static std::string FindVisualStudioExecutable(const ToolChain &TC,
9831 const char *Exe,
9832 const char *ClangProgramPath) {
9833 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9834 std::string visualStudioBinDir;
9835 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9836 visualStudioBinDir)) {
9837 SmallString<128> FilePath(visualStudioBinDir);
9838 llvm::sys::path::append(FilePath, Exe);
9839 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9840 return FilePath.str();
9841 }
9842
9843 return Exe;
9844}
9845
Douglas Katzman95354292015-06-23 20:42:09 +00009846void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9847 const InputInfo &Output,
9848 const InputInfoList &Inputs,
9849 const ArgList &Args,
9850 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009851 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009852 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009853
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009854 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9855 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009856 CmdArgs.push_back(
9857 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009858
Douglas Katzman78b37b02015-11-17 20:28:07 +00009859 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9860 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009861 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009862
Zachary Turner10d75b22014-10-22 20:40:43 +00009863 if (!llvm::sys::Process::GetEnv("LIB")) {
9864 // If the VC environment hasn't been configured (perhaps because the user
9865 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009866 // the environment variable is set however, assume the user knows what
9867 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009868 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009869 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009870 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9871 SmallString<128> LibDir(VisualStudioDir);
9872 llvm::sys::path::append(LibDir, "VC", "lib");
9873 switch (MSVC.getArch()) {
9874 case llvm::Triple::x86:
9875 // x86 just puts the libraries directly in lib
9876 break;
9877 case llvm::Triple::x86_64:
9878 llvm::sys::path::append(LibDir, "amd64");
9879 break;
9880 case llvm::Triple::arm:
9881 llvm::sys::path::append(LibDir, "arm");
9882 break;
9883 default:
9884 break;
9885 }
9886 CmdArgs.push_back(
9887 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009888
9889 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9890 std::string UniversalCRTLibPath;
9891 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9892 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9893 UniversalCRTLibPath.c_str()));
9894 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009895 }
9896
9897 std::string WindowsSdkLibPath;
9898 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9899 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9900 WindowsSdkLibPath.c_str()));
9901 }
9902
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009903 CmdArgs.push_back("-nologo");
9904
Reid Kleckner124955a2015-08-05 18:51:13 +00009905 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009906 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009908 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009909 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009910 if (DLL) {
9911 CmdArgs.push_back(Args.MakeArgString("-dll"));
9912
9913 SmallString<128> ImplibName(Output.getFilename());
9914 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009915 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009916 }
9917
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009918 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009919 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009920 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009921 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009922 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9923 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009924 // Make sure the dynamic runtime thunk is not optimized out at link time
9925 // to ensure proper SEH handling.
9926 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009927 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009928 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009929 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009930 for (const auto &Lib : {"asan", "asan_cxx"})
9931 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009932 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009933 }
9934
Hans Wennborg2e274592013-08-13 23:38:57 +00009935 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009936
Alexey Bataevc7e84352015-08-19 04:49:01 +00009937 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9938 options::OPT_fno_openmp, false)) {
9939 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9940 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9941 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9942 TC.getDriver().Dir + "/../lib"));
9943 switch (getOpenMPRuntime(getToolChain(), Args)) {
9944 case OMPRT_OMP:
9945 CmdArgs.push_back("-defaultlib:libomp.lib");
9946 break;
9947 case OMPRT_IOMP5:
9948 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9949 break;
9950 case OMPRT_GOMP:
9951 break;
9952 case OMPRT_Unknown:
9953 // Already diagnosed.
9954 break;
9955 }
9956 }
9957
Andrey Turetskiya4868572016-03-14 11:19:43 +00009958 // Add compiler-rt lib in case if it was explicitly
9959 // specified as an argument for --rtlib option.
9960 if (!Args.hasArg(options::OPT_nostdlib)) {
9961 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9962 }
9963
Reid Kleckner337188f2014-09-16 19:22:00 +00009964 // Add filenames, libraries, and other linker inputs.
9965 for (const auto &Input : Inputs) {
9966 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009967 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009968 continue;
9969 }
9970
9971 const Arg &A = Input.getInputArg();
9972
9973 // Render -l options differently for the MSVC linker.
9974 if (A.getOption().matches(options::OPT_l)) {
9975 StringRef Lib = A.getValue();
9976 const char *LinkLibArg;
9977 if (Lib.endswith(".lib"))
9978 LinkLibArg = Args.MakeArgString(Lib);
9979 else
9980 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9981 CmdArgs.push_back(LinkLibArg);
9982 continue;
9983 }
9984
9985 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9986 // or -L. Render it, even if MSVC doesn't understand it.
9987 A.renderAsInput(Args, CmdArgs);
9988 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009989
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009990 TC.addProfileRTLibs(Args, CmdArgs);
9991
Zachary Turner719f58c2014-12-01 23:06:47 +00009992 // We need to special case some linker paths. In the case of lld, we need to
9993 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9994 // linker, we need to use a special search algorithm.
9995 llvm::SmallString<128> linkPath;
9996 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9997 if (Linker.equals_lower("lld"))
9998 Linker = "lld-link";
9999
10000 if (Linker.equals_lower("link")) {
10001 // If we're using the MSVC linker, it's not sufficient to just use link
10002 // from the program PATH, because other environments like GnuWin32 install
10003 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010004 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +000010005 C.getDriver().getClangProgramPath());
10006 } else {
10007 linkPath = Linker;
10008 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010009 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +000010010 }
10011
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010012 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +000010013 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010014}
Hans Wennborg87cfa712013-09-19 20:32:16 +000010015
Douglas Katzman95354292015-06-23 20:42:09 +000010016void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10017 const InputInfo &Output,
10018 const InputInfoList &Inputs,
10019 const ArgList &Args,
10020 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010021 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
10022}
10023
Douglas Katzman95354292015-06-23 20:42:09 +000010024std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +000010025 Compilation &C, const JobAction &JA, const InputInfo &Output,
10026 const InputInfoList &Inputs, const ArgList &Args,
10027 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010028 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +000010029 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010030 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010031 CmdArgs.push_back("/W0"); // No warnings.
10032
10033 // The goal is to be able to invoke this tool correctly based on
10034 // any flag accepted by clang-cl.
10035
10036 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +000010037 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010038
10039 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +000010040 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
10041 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
10042 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010043 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
10044 if (A->getOption().getID() == options::OPT_O0) {
10045 CmdArgs.push_back("/Od");
10046 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +000010047 CmdArgs.push_back("/Og");
10048
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010049 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +000010050 if (OptLevel == "s" || OptLevel == "z")
10051 CmdArgs.push_back("/Os");
10052 else
10053 CmdArgs.push_back("/Ot");
10054
10055 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010056 }
10057 }
David Majnemer015ce0f2015-07-27 07:32:11 +000010058 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
10059 options::OPT_fno_omit_frame_pointer))
10060 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
10061 ? "/Oy"
10062 : "/Oy-");
10063 if (!Args.hasArg(options::OPT_fwritable_strings))
10064 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010065
Nico Weber3f8dafb2015-03-12 19:37:10 +000010066 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010067 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
10068
David Majnemerf6072342014-07-01 22:24:56 +000010069 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
10070 /*default=*/false))
10071 CmdArgs.push_back("/GR-");
Etienne Bergerone28e7f22016-06-15 20:34:33 +000010072
10073 if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS,
10074 /*default=*/false))
10075 CmdArgs.push_back("/GS-");
10076
Hans Wennborg5149a3b2014-03-25 14:48:54 +000010077 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
10078 options::OPT_fno_function_sections))
10079 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10080 ? "/Gy"
10081 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +000010082 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10083 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +000010084 CmdArgs.push_back(
10085 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010086 if (Args.hasArg(options::OPT_fsyntax_only))
10087 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +000010088 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10089 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +000010090 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010091
Nico Weber3f8dafb2015-03-12 19:37:10 +000010092 std::vector<std::string> Includes =
10093 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010094 for (const auto &Include : Includes)
10095 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010096
Hans Wennborg87cfa712013-09-19 20:32:16 +000010097 // Flags that can simply be passed through.
10098 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10099 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010100 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10101 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010102 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010103 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010104
10105 // The order of these flags is relevant, so pick the last one.
10106 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10107 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10108 A->render(Args, CmdArgs);
10109
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010110 // Pass through all unknown arguments so that the fallback command can see
10111 // them too.
10112 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10113
Hans Wennborg87cfa712013-09-19 20:32:16 +000010114 // Input filename.
10115 assert(Inputs.size() == 1);
10116 const InputInfo &II = Inputs[0];
10117 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10118 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10119 if (II.isFilename())
10120 CmdArgs.push_back(II.getFilename());
10121 else
10122 II.getInputArg().renderAsInput(Args, CmdArgs);
10123
10124 // Output filename.
10125 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010126 const char *Fo =
10127 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010128 CmdArgs.push_back(Fo);
10129
Hans Wennborg188382e2013-09-20 18:16:35 +000010130 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010131 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10132 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010133 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010134 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010135}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010136
Yaron Keren1c0070c2015-07-02 04:45:27 +000010137/// MinGW Tools
10138void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10139 const InputInfo &Output,
10140 const InputInfoList &Inputs,
10141 const ArgList &Args,
10142 const char *LinkingOutput) const {
10143 claimNoWarnArgs(Args);
10144 ArgStringList CmdArgs;
10145
10146 if (getToolChain().getArch() == llvm::Triple::x86) {
10147 CmdArgs.push_back("--32");
10148 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10149 CmdArgs.push_back("--64");
10150 }
10151
10152 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10153
10154 CmdArgs.push_back("-o");
10155 CmdArgs.push_back(Output.getFilename());
10156
10157 for (const auto &II : Inputs)
10158 CmdArgs.push_back(II.getFilename());
10159
10160 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010161 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010162
10163 if (Args.hasArg(options::OPT_gsplit_dwarf))
10164 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10165 SplitDebugName(Args, Inputs[0]));
10166}
10167
10168void MinGW::Linker::AddLibGCC(const ArgList &Args,
10169 ArgStringList &CmdArgs) const {
10170 if (Args.hasArg(options::OPT_mthreads))
10171 CmdArgs.push_back("-lmingwthrd");
10172 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010173
Yaron Kerenaa281332015-08-09 00:24:07 +000010174 // Make use of compiler-rt if --rtlib option is used
10175 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10176 if (RLT == ToolChain::RLT_Libgcc) {
10177 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10178 Args.hasArg(options::OPT_static);
10179 bool Shared = Args.hasArg(options::OPT_shared);
10180 bool CXX = getToolChain().getDriver().CCCIsCXX();
10181
10182 if (Static || (!CXX && !Shared)) {
10183 CmdArgs.push_back("-lgcc");
10184 CmdArgs.push_back("-lgcc_eh");
10185 } else {
10186 CmdArgs.push_back("-lgcc_s");
10187 CmdArgs.push_back("-lgcc");
10188 }
10189 } else {
10190 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10191 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010192
Yaron Keren1c0070c2015-07-02 04:45:27 +000010193 CmdArgs.push_back("-lmoldname");
10194 CmdArgs.push_back("-lmingwex");
10195 CmdArgs.push_back("-lmsvcrt");
10196}
10197
10198void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10199 const InputInfo &Output,
10200 const InputInfoList &Inputs,
10201 const ArgList &Args,
10202 const char *LinkingOutput) const {
10203 const ToolChain &TC = getToolChain();
10204 const Driver &D = TC.getDriver();
10205 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10206
10207 ArgStringList CmdArgs;
10208
10209 // Silence warning for "clang -g foo.o -o foo"
10210 Args.ClaimAllArgs(options::OPT_g_Group);
10211 // and "clang -emit-llvm foo.o -o foo"
10212 Args.ClaimAllArgs(options::OPT_emit_llvm);
10213 // and for "clang -w foo.o -o foo". Other warning options are already
10214 // handled somewhere else.
10215 Args.ClaimAllArgs(options::OPT_w);
10216
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010217 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10218 if (LinkerName.equals_lower("lld")) {
10219 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010220 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010221 } else if (!LinkerName.equals_lower("ld")) {
10222 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010223 }
10224
Yaron Keren1c0070c2015-07-02 04:45:27 +000010225 if (!D.SysRoot.empty())
10226 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10227
10228 if (Args.hasArg(options::OPT_s))
10229 CmdArgs.push_back("-s");
10230
10231 CmdArgs.push_back("-m");
10232 if (TC.getArch() == llvm::Triple::x86)
10233 CmdArgs.push_back("i386pe");
10234 if (TC.getArch() == llvm::Triple::x86_64)
10235 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010236 if (TC.getArch() == llvm::Triple::arm)
10237 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010238
10239 if (Args.hasArg(options::OPT_mwindows)) {
10240 CmdArgs.push_back("--subsystem");
10241 CmdArgs.push_back("windows");
10242 } else if (Args.hasArg(options::OPT_mconsole)) {
10243 CmdArgs.push_back("--subsystem");
10244 CmdArgs.push_back("console");
10245 }
10246
10247 if (Args.hasArg(options::OPT_static))
10248 CmdArgs.push_back("-Bstatic");
10249 else {
10250 if (Args.hasArg(options::OPT_mdll))
10251 CmdArgs.push_back("--dll");
10252 else if (Args.hasArg(options::OPT_shared))
10253 CmdArgs.push_back("--shared");
10254 CmdArgs.push_back("-Bdynamic");
10255 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10256 CmdArgs.push_back("-e");
10257 if (TC.getArch() == llvm::Triple::x86)
10258 CmdArgs.push_back("_DllMainCRTStartup@12");
10259 else
10260 CmdArgs.push_back("DllMainCRTStartup");
10261 CmdArgs.push_back("--enable-auto-image-base");
10262 }
10263 }
10264
10265 CmdArgs.push_back("-o");
10266 CmdArgs.push_back(Output.getFilename());
10267
10268 Args.AddAllArgs(CmdArgs, options::OPT_e);
10269 // FIXME: add -N, -n flags
10270 Args.AddLastArg(CmdArgs, options::OPT_r);
10271 Args.AddLastArg(CmdArgs, options::OPT_s);
10272 Args.AddLastArg(CmdArgs, options::OPT_t);
10273 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10274 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10275
Douglas Katzman78b37b02015-11-17 20:28:07 +000010276 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010277 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10278 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10279 } else {
10280 if (Args.hasArg(options::OPT_municode))
10281 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10282 else
10283 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10284 }
10285 if (Args.hasArg(options::OPT_pg))
10286 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10287 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10288 }
10289
10290 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010291 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010292 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10293
10294 // TODO: Add ASan stuff here
10295
10296 // TODO: Add profile stuff here
10297
Douglas Katzman78b37b02015-11-17 20:28:07 +000010298 if (D.CCCIsCXX() &&
10299 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010300 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10301 !Args.hasArg(options::OPT_static);
10302 if (OnlyLibstdcxxStatic)
10303 CmdArgs.push_back("-Bstatic");
10304 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10305 if (OnlyLibstdcxxStatic)
10306 CmdArgs.push_back("-Bdynamic");
10307 }
10308
10309 if (!Args.hasArg(options::OPT_nostdlib)) {
10310 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10311 if (Args.hasArg(options::OPT_static))
10312 CmdArgs.push_back("--start-group");
10313
10314 if (Args.hasArg(options::OPT_fstack_protector) ||
10315 Args.hasArg(options::OPT_fstack_protector_strong) ||
10316 Args.hasArg(options::OPT_fstack_protector_all)) {
10317 CmdArgs.push_back("-lssp_nonshared");
10318 CmdArgs.push_back("-lssp");
10319 }
10320 if (Args.hasArg(options::OPT_fopenmp))
10321 CmdArgs.push_back("-lgomp");
10322
10323 AddLibGCC(Args, CmdArgs);
10324
10325 if (Args.hasArg(options::OPT_pg))
10326 CmdArgs.push_back("-lgmon");
10327
Yaron Kerenadce68e2015-07-06 18:52:19 +000010328 if (Args.hasArg(options::OPT_pthread))
10329 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010330
10331 // add system libraries
10332 if (Args.hasArg(options::OPT_mwindows)) {
10333 CmdArgs.push_back("-lgdi32");
10334 CmdArgs.push_back("-lcomdlg32");
10335 }
10336 CmdArgs.push_back("-ladvapi32");
10337 CmdArgs.push_back("-lshell32");
10338 CmdArgs.push_back("-luser32");
10339 CmdArgs.push_back("-lkernel32");
10340
10341 if (Args.hasArg(options::OPT_static))
10342 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010343 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010344 AddLibGCC(Args, CmdArgs);
10345 }
10346
10347 if (!Args.hasArg(options::OPT_nostartfiles)) {
10348 // Add crtfastmath.o if available and fast math is enabled.
10349 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10350
10351 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10352 }
10353 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010354 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010355 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010356}
10357
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010358/// XCore Tools
10359// We pass assemble and link construction to the xcc tool.
10360
Douglas Katzman95354292015-06-23 20:42:09 +000010361void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10362 const InputInfo &Output,
10363 const InputInfoList &Inputs,
10364 const ArgList &Args,
10365 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010366 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010367 ArgStringList CmdArgs;
10368
10369 CmdArgs.push_back("-o");
10370 CmdArgs.push_back(Output.getFilename());
10371
10372 CmdArgs.push_back("-c");
10373
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010374 if (Args.hasArg(options::OPT_v))
10375 CmdArgs.push_back("-v");
10376
Robert Lytton894d25c2014-05-02 09:33:25 +000010377 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10378 if (!A->getOption().matches(options::OPT_g0))
10379 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010380
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010381 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10382 false))
10383 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010384
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010385 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010386
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010387 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010388 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010389
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010390 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010391 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010392}
10393
Douglas Katzman95354292015-06-23 20:42:09 +000010394void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10395 const InputInfo &Output,
10396 const InputInfoList &Inputs,
10397 const ArgList &Args,
10398 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010399 ArgStringList CmdArgs;
10400
10401 if (Output.isFilename()) {
10402 CmdArgs.push_back("-o");
10403 CmdArgs.push_back(Output.getFilename());
10404 } else {
10405 assert(Output.isNothing() && "Invalid output.");
10406 }
10407
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010408 if (Args.hasArg(options::OPT_v))
10409 CmdArgs.push_back("-v");
10410
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010411 // Pass -fexceptions through to the linker if it was present.
10412 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10413 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010414 CmdArgs.push_back("-fexceptions");
10415
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010416 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10417
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010418 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010420}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010421
Douglas Katzman95354292015-06-23 20:42:09 +000010422void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10423 const InputInfo &Output,
10424 const InputInfoList &Inputs,
10425 const ArgList &Args,
10426 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010427 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010428 const auto &TC =
10429 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10430 ArgStringList CmdArgs;
10431 const char *Exec;
10432
10433 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010434 default:
10435 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010436 case llvm::Triple::arm:
10437 case llvm::Triple::thumb:
10438 break;
10439 case llvm::Triple::x86:
10440 CmdArgs.push_back("--32");
10441 break;
10442 case llvm::Triple::x86_64:
10443 CmdArgs.push_back("--64");
10444 break;
10445 }
10446
10447 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10448
10449 CmdArgs.push_back("-o");
10450 CmdArgs.push_back(Output.getFilename());
10451
10452 for (const auto &Input : Inputs)
10453 CmdArgs.push_back(Input.getFilename());
10454
10455 const std::string Assembler = TC.GetProgramPath("as");
10456 Exec = Args.MakeArgString(Assembler);
10457
Justin Bognerd3371d82015-07-17 03:35:54 +000010458 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010459}
10460
Douglas Katzman95354292015-06-23 20:42:09 +000010461void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10462 const InputInfo &Output,
10463 const InputInfoList &Inputs,
10464 const ArgList &Args,
10465 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010466 const auto &TC =
10467 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10468 const llvm::Triple &T = TC.getTriple();
10469 const Driver &D = TC.getDriver();
10470 SmallString<128> EntryPoint;
10471 ArgStringList CmdArgs;
10472 const char *Exec;
10473
10474 // Silence warning for "clang -g foo.o -o foo"
10475 Args.ClaimAllArgs(options::OPT_g_Group);
10476 // and "clang -emit-llvm foo.o -o foo"
10477 Args.ClaimAllArgs(options::OPT_emit_llvm);
10478 // and for "clang -w foo.o -o foo"
10479 Args.ClaimAllArgs(options::OPT_w);
10480 // Other warning options are already handled somewhere else.
10481
10482 if (!D.SysRoot.empty())
10483 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10484
10485 if (Args.hasArg(options::OPT_pie))
10486 CmdArgs.push_back("-pie");
10487 if (Args.hasArg(options::OPT_rdynamic))
10488 CmdArgs.push_back("-export-dynamic");
10489 if (Args.hasArg(options::OPT_s))
10490 CmdArgs.push_back("--strip-all");
10491
10492 CmdArgs.push_back("-m");
10493 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010494 default:
10495 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010496 case llvm::Triple::arm:
10497 case llvm::Triple::thumb:
10498 // FIXME: this is incorrect for WinCE
10499 CmdArgs.push_back("thumb2pe");
10500 break;
10501 case llvm::Triple::x86:
10502 CmdArgs.push_back("i386pe");
10503 EntryPoint.append("_");
10504 break;
10505 case llvm::Triple::x86_64:
10506 CmdArgs.push_back("i386pep");
10507 break;
10508 }
10509
10510 if (Args.hasArg(options::OPT_shared)) {
10511 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010512 default:
10513 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010514 case llvm::Triple::arm:
10515 case llvm::Triple::thumb:
10516 case llvm::Triple::x86_64:
10517 EntryPoint.append("_DllMainCRTStartup");
10518 break;
10519 case llvm::Triple::x86:
10520 EntryPoint.append("_DllMainCRTStartup@12");
10521 break;
10522 }
10523
10524 CmdArgs.push_back("-shared");
10525 CmdArgs.push_back("-Bdynamic");
10526
10527 CmdArgs.push_back("--enable-auto-image-base");
10528
10529 CmdArgs.push_back("--entry");
10530 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10531 } else {
10532 EntryPoint.append("mainCRTStartup");
10533
10534 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10535 : "-Bdynamic");
10536
Douglas Katzman78b37b02015-11-17 20:28:07 +000010537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010538 CmdArgs.push_back("--entry");
10539 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10540 }
10541
10542 // FIXME: handle subsystem
10543 }
10544
10545 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010546 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010547
10548 CmdArgs.push_back("-o");
10549 CmdArgs.push_back(Output.getFilename());
10550
10551 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10552 SmallString<261> ImpLib(Output.getFilename());
10553 llvm::sys::path::replace_extension(ImpLib, ".lib");
10554
10555 CmdArgs.push_back("--out-implib");
10556 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10557 }
10558
Douglas Katzman78b37b02015-11-17 20:28:07 +000010559 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010560 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10561 const char *CRTBegin;
10562
10563 CRTBegin =
10564 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10565 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10566 }
10567
10568 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010569 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010570 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10571
10572 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10573 !Args.hasArg(options::OPT_nodefaultlibs)) {
10574 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10575 !Args.hasArg(options::OPT_static);
10576 if (StaticCXX)
10577 CmdArgs.push_back("-Bstatic");
10578 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10579 if (StaticCXX)
10580 CmdArgs.push_back("-Bdynamic");
10581 }
10582
10583 if (!Args.hasArg(options::OPT_nostdlib)) {
10584 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10585 // TODO handle /MT[d] /MD[d]
10586 CmdArgs.push_back("-lmsvcrt");
10587 AddRunTimeLibs(TC, D, CmdArgs, Args);
10588 }
10589 }
10590
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010591 if (TC.getSanitizerArgs().needsAsanRt()) {
10592 // TODO handle /MT[d] /MD[d]
10593 if (Args.hasArg(options::OPT_shared)) {
10594 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10595 } else {
10596 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10597 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010598 // Make sure the dynamic runtime thunk is not optimized out at link time
10599 // to ensure proper SEH handling.
10600 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10601 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10602 ? "___asan_seh_interceptor"
10603 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010604 }
10605 }
10606
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010607 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010608
Justin Bognerd3371d82015-07-17 03:35:54 +000010609 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010610}
Douglas Katzman84a75642015-06-19 14:55:19 +000010611
Douglas Katzman95354292015-06-23 20:42:09 +000010612void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10613 const InputInfo &Output,
10614 const InputInfoList &Inputs,
10615 const ArgList &Args,
10616 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010617 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010618 assert(Inputs.size() == 1);
10619 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010620 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10621 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010622
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010623 if (JA.getKind() == Action::PreprocessJobClass) {
10624 Args.ClaimAllArgs();
10625 CmdArgs.push_back("-E");
10626 } else {
10627 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10628 CmdArgs.push_back("-S");
10629 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10630 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010631 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010632
Douglas Katzmanf6071112015-08-03 14:34:22 +000010633 // Append all -I, -iquote, -isystem paths, defines/undefines,
10634 // 'f' flags, optimize flags, and warning options.
10635 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010636 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010637 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010638 options::OPT_f_Group, options::OPT_f_clang_Group,
10639 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010640 options::OPT_O_Group, options::OPT_W_Group,
10641 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010642
10643 // If we're producing a dependency file, and assembly is the final action,
10644 // then the name of the target in the dependency file should be the '.o'
10645 // file, not the '.s' file produced by this step. For example, instead of
10646 // /tmp/mumble.s: mumble.c .../someheader.h
10647 // the filename on the lefthand side should be "mumble.o"
10648 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10649 C.getActions().size() == 1 &&
10650 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10651 Arg *A = Args.getLastArg(options::OPT_o);
10652 if (A) {
10653 CmdArgs.push_back("-MT");
10654 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10655 }
10656 }
10657
Douglas Katzman84a75642015-06-19 14:55:19 +000010658 CmdArgs.push_back(II.getFilename());
10659 CmdArgs.push_back("-o");
10660 CmdArgs.push_back(Output.getFilename());
10661
10662 std::string Exec =
10663 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010664 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10665 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010666}
10667
Douglas Katzman95354292015-06-23 20:42:09 +000010668void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10669 const InputInfo &Output,
10670 const InputInfoList &Inputs,
10671 const ArgList &Args,
10672 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010673 ArgStringList CmdArgs;
10674
10675 assert(Inputs.size() == 1);
10676 const InputInfo &II = Inputs[0];
10677 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10678 assert(Output.getType() == types::TY_Object);
10679
10680 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010681 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10682 if (CPUArg)
10683 CmdArgs.push_back(
10684 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010685 CmdArgs.push_back("-noSPrefixing");
10686 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010687 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10688 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10689 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010690 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010691 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010692 }
10693 CmdArgs.push_back("-elf"); // Output format.
10694 CmdArgs.push_back(II.getFilename());
10695 CmdArgs.push_back(
10696 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10697
10698 std::string Exec =
10699 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010700 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10701 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010702}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010703
10704void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10705 const InputInfo &Output,
10706 const InputInfoList &Inputs,
10707 const ArgList &Args,
10708 const char *LinkingOutput) const {
10709 const auto &TC =
10710 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10711 const llvm::Triple &T = TC.getTriple();
10712 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010713 bool UseStartfiles =
10714 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010715 bool UseDefaultLibs =
10716 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010717
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010718 if (T.getArch() == llvm::Triple::sparc)
10719 CmdArgs.push_back("-EB");
10720 else // SHAVE assumes little-endian, and sparcel is expressly so.
10721 CmdArgs.push_back("-EL");
10722
10723 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10724 // but we never pass through a --sysroot option and various other bits.
10725 // For example, there are no sanitizers (yet) nor gold linker.
10726
10727 // Eat some arguments that may be present but have no effect.
10728 Args.ClaimAllArgs(options::OPT_g_Group);
10729 Args.ClaimAllArgs(options::OPT_w);
10730 Args.ClaimAllArgs(options::OPT_static_libgcc);
10731
10732 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10733 CmdArgs.push_back("-s");
10734
10735 CmdArgs.push_back("-o");
10736 CmdArgs.push_back(Output.getFilename());
10737
10738 if (UseStartfiles) {
10739 // If you want startfiles, it means you want the builtin crti and crtbegin,
10740 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010741 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10742 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010743 }
10744
10745 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10746 options::OPT_e, options::OPT_s, options::OPT_t,
10747 options::OPT_Z_Flag, options::OPT_r});
10748
Douglas Katzman674a3122015-11-18 16:24:46 +000010749 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010750
10751 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10752
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010753 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010754 if (C.getDriver().CCCIsCXX())
10755 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010756 if (T.getOS() == llvm::Triple::RTEMS) {
10757 CmdArgs.push_back("--start-group");
10758 CmdArgs.push_back("-lc");
10759 // You must provide your own "-L" option to enable finding these.
10760 CmdArgs.push_back("-lrtemscpu");
10761 CmdArgs.push_back("-lrtemsbsp");
10762 CmdArgs.push_back("--end-group");
10763 } else {
10764 CmdArgs.push_back("-lc");
10765 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010766 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010767 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010768 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010769 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10770 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010771 }
10772
10773 std::string Exec =
10774 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10775 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10776 CmdArgs, Inputs));
10777}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010778
10779void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10780 const InputInfo &Output,
10781 const InputInfoList &Inputs,
10782 const ArgList &Args,
10783 const char *LinkingOutput) const {
10784 claimNoWarnArgs(Args);
10785 ArgStringList CmdArgs;
10786
10787 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10788
10789 CmdArgs.push_back("-o");
10790 CmdArgs.push_back(Output.getFilename());
10791
10792 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10793 const InputInfo &Input = Inputs[0];
10794 assert(Input.isFilename() && "Invalid input.");
10795 CmdArgs.push_back(Input.getFilename());
10796
10797 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000010798 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010799 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10800}
10801
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010802static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10803 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10804 if (SanArgs.needsUbsanRt()) {
10805 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10806 }
10807 if (SanArgs.needsAsanRt()) {
10808 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10809 }
10810}
10811
10812static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10813 const JobAction &JA, const InputInfo &Output,
10814 const InputInfoList &Inputs,
10815 const ArgList &Args,
10816 const char *LinkingOutput) {
10817 const toolchains::FreeBSD &ToolChain =
10818 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10819 const Driver &D = ToolChain.getDriver();
10820 ArgStringList CmdArgs;
10821
10822 // Silence warning for "clang -g foo.o -o foo"
10823 Args.ClaimAllArgs(options::OPT_g_Group);
10824 // and "clang -emit-llvm foo.o -o foo"
10825 Args.ClaimAllArgs(options::OPT_emit_llvm);
10826 // and for "clang -w foo.o -o foo". Other warning options are already
10827 // handled somewhere else.
10828 Args.ClaimAllArgs(options::OPT_w);
10829
10830 if (!D.SysRoot.empty())
10831 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10832
10833 if (Args.hasArg(options::OPT_pie))
10834 CmdArgs.push_back("-pie");
10835
10836 if (Args.hasArg(options::OPT_rdynamic))
10837 CmdArgs.push_back("-export-dynamic");
10838 if (Args.hasArg(options::OPT_shared))
10839 CmdArgs.push_back("--oformat=so");
10840
10841 if (Output.isFilename()) {
10842 CmdArgs.push_back("-o");
10843 CmdArgs.push_back(Output.getFilename());
10844 } else {
10845 assert(Output.isNothing() && "Invalid output.");
10846 }
10847
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010848 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10849
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010850 Args.AddAllArgs(CmdArgs, options::OPT_L);
10851 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10852 Args.AddAllArgs(CmdArgs, options::OPT_e);
10853 Args.AddAllArgs(CmdArgs, options::OPT_s);
10854 Args.AddAllArgs(CmdArgs, options::OPT_t);
10855 Args.AddAllArgs(CmdArgs, options::OPT_r);
10856
10857 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10858 CmdArgs.push_back("--no-demangle");
10859
10860 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10861
10862 if (Args.hasArg(options::OPT_pthread)) {
10863 CmdArgs.push_back("-lpthread");
10864 }
10865
Paul Robinson9d613612016-05-16 17:22:25 +000010866 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010867
10868 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10869}
10870
10871static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10872 const JobAction &JA, const InputInfo &Output,
10873 const InputInfoList &Inputs,
10874 const ArgList &Args,
10875 const char *LinkingOutput) {
10876 const toolchains::FreeBSD &ToolChain =
10877 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10878 const Driver &D = ToolChain.getDriver();
10879 ArgStringList CmdArgs;
10880
10881 // Silence warning for "clang -g foo.o -o foo"
10882 Args.ClaimAllArgs(options::OPT_g_Group);
10883 // and "clang -emit-llvm foo.o -o foo"
10884 Args.ClaimAllArgs(options::OPT_emit_llvm);
10885 // and for "clang -w foo.o -o foo". Other warning options are already
10886 // handled somewhere else.
10887 Args.ClaimAllArgs(options::OPT_w);
10888
10889 if (!D.SysRoot.empty())
10890 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10891
10892 if (Args.hasArg(options::OPT_pie))
10893 CmdArgs.push_back("-pie");
10894
10895 if (Args.hasArg(options::OPT_static)) {
10896 CmdArgs.push_back("-Bstatic");
10897 } else {
10898 if (Args.hasArg(options::OPT_rdynamic))
10899 CmdArgs.push_back("-export-dynamic");
10900 CmdArgs.push_back("--eh-frame-hdr");
10901 if (Args.hasArg(options::OPT_shared)) {
10902 CmdArgs.push_back("-Bshareable");
10903 } else {
10904 CmdArgs.push_back("-dynamic-linker");
10905 CmdArgs.push_back("/libexec/ld-elf.so.1");
10906 }
10907 CmdArgs.push_back("--enable-new-dtags");
10908 }
10909
10910 if (Output.isFilename()) {
10911 CmdArgs.push_back("-o");
10912 CmdArgs.push_back(Output.getFilename());
10913 } else {
10914 assert(Output.isNothing() && "Invalid output.");
10915 }
10916
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010917 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10918
Douglas Katzman78b37b02015-11-17 20:28:07 +000010919 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010920 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010921 if (!Args.hasArg(options::OPT_shared)) {
10922 if (Args.hasArg(options::OPT_pg))
10923 crt1 = "gcrt1.o";
10924 else if (Args.hasArg(options::OPT_pie))
10925 crt1 = "Scrt1.o";
10926 else
10927 crt1 = "crt1.o";
10928 }
10929 if (crt1)
10930 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10931
10932 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10933
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010934 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010935 if (Args.hasArg(options::OPT_static))
10936 crtbegin = "crtbeginT.o";
10937 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10938 crtbegin = "crtbeginS.o";
10939 else
10940 crtbegin = "crtbegin.o";
10941
10942 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10943 }
10944
10945 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010946 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010947 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10948 Args.AddAllArgs(CmdArgs, options::OPT_e);
10949 Args.AddAllArgs(CmdArgs, options::OPT_s);
10950 Args.AddAllArgs(CmdArgs, options::OPT_t);
10951 Args.AddAllArgs(CmdArgs, options::OPT_r);
10952
10953 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10954 CmdArgs.push_back("--no-demangle");
10955
10956 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10957
Douglas Katzman78b37b02015-11-17 20:28:07 +000010958 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010959 // For PS4, we always want to pass libm, libstdc++ and libkernel
10960 // libraries for both C and C++ compilations.
10961 CmdArgs.push_back("-lkernel");
10962 if (D.CCCIsCXX()) {
10963 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10964 if (Args.hasArg(options::OPT_pg))
10965 CmdArgs.push_back("-lm_p");
10966 else
10967 CmdArgs.push_back("-lm");
10968 }
10969 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10970 // the default system libraries. Just mimic this for now.
10971 if (Args.hasArg(options::OPT_pg))
10972 CmdArgs.push_back("-lgcc_p");
10973 else
10974 CmdArgs.push_back("-lcompiler_rt");
10975 if (Args.hasArg(options::OPT_static)) {
10976 CmdArgs.push_back("-lstdc++");
10977 } else if (Args.hasArg(options::OPT_pg)) {
10978 CmdArgs.push_back("-lgcc_eh_p");
10979 } else {
10980 CmdArgs.push_back("--as-needed");
10981 CmdArgs.push_back("-lstdc++");
10982 CmdArgs.push_back("--no-as-needed");
10983 }
10984
10985 if (Args.hasArg(options::OPT_pthread)) {
10986 if (Args.hasArg(options::OPT_pg))
10987 CmdArgs.push_back("-lpthread_p");
10988 else
10989 CmdArgs.push_back("-lpthread");
10990 }
10991
10992 if (Args.hasArg(options::OPT_pg)) {
10993 if (Args.hasArg(options::OPT_shared))
10994 CmdArgs.push_back("-lc");
10995 else {
10996 if (Args.hasArg(options::OPT_static)) {
10997 CmdArgs.push_back("--start-group");
10998 CmdArgs.push_back("-lc_p");
10999 CmdArgs.push_back("-lpthread_p");
11000 CmdArgs.push_back("--end-group");
11001 } else {
11002 CmdArgs.push_back("-lc_p");
11003 }
11004 }
11005 CmdArgs.push_back("-lgcc_p");
11006 } else {
11007 if (Args.hasArg(options::OPT_static)) {
11008 CmdArgs.push_back("--start-group");
11009 CmdArgs.push_back("-lc");
11010 CmdArgs.push_back("-lpthread");
11011 CmdArgs.push_back("--end-group");
11012 } else {
11013 CmdArgs.push_back("-lc");
11014 }
11015 CmdArgs.push_back("-lcompiler_rt");
11016 }
11017
11018 if (Args.hasArg(options::OPT_static)) {
11019 CmdArgs.push_back("-lstdc++");
11020 } else if (Args.hasArg(options::OPT_pg)) {
11021 CmdArgs.push_back("-lgcc_eh_p");
11022 } else {
11023 CmdArgs.push_back("--as-needed");
11024 CmdArgs.push_back("-lstdc++");
11025 CmdArgs.push_back("--no-as-needed");
11026 }
11027 }
11028
Douglas Katzman78b37b02015-11-17 20:28:07 +000011029 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011030 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11031 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
11032 else
11033 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
11034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
11035 }
11036
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011037 const char *Exec =
11038#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000011039 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011040#else
Paul Robinson9d613612016-05-16 17:22:25 +000011041 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011042#endif
11043
11044 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
11045}
11046
11047void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
11048 const InputInfo &Output,
11049 const InputInfoList &Inputs,
11050 const ArgList &Args,
11051 const char *LinkingOutput) const {
11052 const toolchains::FreeBSD &ToolChain =
11053 static_cast<const toolchains::FreeBSD &>(getToolChain());
11054 const Driver &D = ToolChain.getDriver();
11055 bool PS4Linker;
11056 StringRef LinkerOptName;
11057 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
11058 LinkerOptName = A->getValue();
11059 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
11060 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
11061 }
11062
11063 if (LinkerOptName == "gold")
11064 PS4Linker = false;
11065 else if (LinkerOptName == "ps4")
11066 PS4Linker = true;
11067 else
11068 PS4Linker = !Args.hasArg(options::OPT_shared);
11069
11070 if (PS4Linker)
11071 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11072 else
11073 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11074}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011075
11076void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
11077 const InputInfo &Output,
11078 const InputInfoList &Inputs,
11079 const ArgList &Args,
11080 const char *LinkingOutput) const {
11081 const auto &TC =
11082 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011083 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011084
11085 std::vector<std::string> gpu_archs =
11086 Args.getAllArgValues(options::OPT_march_EQ);
11087 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
11088 const std::string& gpu_arch = gpu_archs[0];
11089
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011090 ArgStringList CmdArgs;
11091 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000011092 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11093 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000011094 // ptxas does not accept -g option if optimization is enabled, so
11095 // we ignore the compiler's -O* options if we want debug info.
11096 CmdArgs.push_back("-g");
11097 CmdArgs.push_back("--dont-merge-basicblocks");
11098 CmdArgs.push_back("--return-at-end");
11099 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11100 // Map the -O we received to -O{0,1,2,3}.
11101 //
11102 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11103 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011104
Justin Lebar2836dcd2016-01-19 19:52:21 +000011105 // -O3 seems like the least-bad option when -Osomething is specified to
11106 // clang but it isn't handled below.
11107 StringRef OOpt = "3";
11108 if (A->getOption().matches(options::OPT_O4) ||
11109 A->getOption().matches(options::OPT_Ofast))
11110 OOpt = "3";
11111 else if (A->getOption().matches(options::OPT_O0))
11112 OOpt = "0";
11113 else if (A->getOption().matches(options::OPT_O)) {
11114 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11115 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11116 .Case("1", "1")
11117 .Case("2", "2")
11118 .Case("3", "3")
11119 .Case("s", "2")
11120 .Case("z", "2")
11121 .Default("2");
11122 }
11123 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11124 } else {
11125 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11126 // to no optimizations, but ptxas's default is -O3.
11127 CmdArgs.push_back("-O0");
11128 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011129
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011130 CmdArgs.push_back("--gpu-name");
11131 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11132 CmdArgs.push_back("--output-file");
11133 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11134 for (const auto& II : Inputs)
11135 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11136
11137 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11138 CmdArgs.push_back(Args.MakeArgString(A));
11139
11140 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11142}
11143
11144// All inputs to this linker must be from CudaDeviceActions, as we need to look
11145// at the Inputs' Actions in order to figure out which GPU architecture they
11146// correspond to.
11147void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11148 const InputInfo &Output,
11149 const InputInfoList &Inputs,
11150 const ArgList &Args,
11151 const char *LinkingOutput) const {
11152 const auto &TC =
11153 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011154 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011155
11156 ArgStringList CmdArgs;
11157 CmdArgs.push_back("--cuda");
11158 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11159 CmdArgs.push_back(Args.MakeArgString("--create"));
11160 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11161
11162 for (const auto& II : Inputs) {
11163 auto* A = cast<const CudaDeviceAction>(II.getAction());
11164 // We need to pass an Arch of the form "sm_XX" for cubin files and
11165 // "compute_XX" for ptx.
11166 const char *Arch = (II.getType() == types::TY_PP_Asm)
11167 ? A->getComputeArchName()
11168 : A->getGpuArchName();
11169 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11170 Arch + ",file=" + II.getFilename()));
11171 }
11172
11173 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11174 CmdArgs.push_back(Args.MakeArgString(A));
11175
11176 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11177 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11178}