blob: b0a3f348b3c31442bd6c63fa68c185bac09e17ab [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,
Hans Wennborg44d061a2016-06-22 16:56:16 +00005408 options::OPT_finline_hint_functions,
Hans Wennborg7a008882016-05-24 20:40:51 +00005409 options::OPT_fno_inline_functions))
5410 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005411
John McCall5fb5df92012-06-20 06:18:46 +00005412 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005413
John McCall5fb5df92012-06-20 06:18:46 +00005414 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005415 // legacy is the default. Except for deployment taget of 10.5,
5416 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5417 // gets ignored silently.
5418 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005419 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5420 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005421 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005422 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005423 if (getToolChain().UseObjCMixedDispatch())
5424 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5425 else
5426 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5427 }
5428 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005429
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005430 // When ObjectiveC legacy runtime is in effect on MacOSX,
5431 // turn on the option to do Array/Dictionary subscripting
5432 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005433 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005434 getToolChain().getTriple().isMacOSX() &&
5435 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5436 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005437 objcRuntime.isNeXTFamily())
5438 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005439
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005440 // -fencode-extended-block-signature=1 is default.
5441 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5442 CmdArgs.push_back("-fencode-extended-block-signature");
5443 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005444
John McCall24fc0de2011-07-06 00:26:06 +00005445 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5446 // NOTE: This logic is duplicated in ToolChains.cpp.
5447 bool ARC = isObjCAutoRefCount(Args);
5448 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005449 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005450
John McCall24fc0de2011-07-06 00:26:06 +00005451 CmdArgs.push_back("-fobjc-arc");
5452
Chandler Carruth491db322011-11-04 07:34:47 +00005453 // FIXME: It seems like this entire block, and several around it should be
5454 // wrapped in isObjC, but for now we just use it here as this is where it
5455 // was being used previously.
5456 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5457 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5458 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5459 else
5460 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5461 }
5462
John McCall24fc0de2011-07-06 00:26:06 +00005463 // Allow the user to enable full exceptions code emission.
5464 // We define off for Objective-CC, on for Objective-C++.
5465 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5466 options::OPT_fno_objc_arc_exceptions,
5467 /*default*/ types::isCXX(InputType)))
5468 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005469
John McCall24fc0de2011-07-06 00:26:06 +00005470 }
5471
5472 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5473 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005474 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005475 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005476
John McCall24fc0de2011-07-06 00:26:06 +00005477 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5478 // takes precedence.
5479 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5480 if (!GCArg)
5481 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5482 if (GCArg) {
5483 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005484 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005485 } else if (getToolChain().SupportsObjCGC()) {
5486 GCArg->render(Args, CmdArgs);
5487 } else {
5488 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005489 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005490 }
5491 }
5492
John McCallfbe5ed72015-11-05 19:19:56 +00005493 // Pass down -fobjc-weak or -fno-objc-weak if present.
5494 if (types::isObjC(InputType)) {
5495 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5496 options::OPT_fno_objc_weak);
5497 if (!WeakArg) {
5498 // nothing to do
5499 } else if (GCArg) {
5500 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5501 D.Diag(diag::err_objc_weak_with_gc);
5502 } else if (!objcRuntime.allowsWeak()) {
5503 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5504 D.Diag(diag::err_objc_weak_unsupported);
5505 } else {
5506 WeakArg->render(Args, CmdArgs);
5507 }
5508 }
5509
Bob Wilsonb111ec92015-03-02 19:01:14 +00005510 if (Args.hasFlag(options::OPT_fapplication_extension,
5511 options::OPT_fno_application_extension, false))
5512 CmdArgs.push_back("-fapplication-extension");
5513
Reid Klecknerc542d372014-06-27 17:02:02 +00005514 // Handle GCC-style exception args.
5515 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005516 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5517 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005518
Saleem Abdulrasool094f17b2016-06-10 20:12:00 +00005519 if (Args.hasArg(options::OPT_fsjlj_exceptions) ||
5520 getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005521 CmdArgs.push_back("-fsjlj-exceptions");
5522
5523 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005524 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5525 options::OPT_fno_assume_sane_operator_new))
5526 CmdArgs.push_back("-fno-assume-sane-operator-new");
5527
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005528 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5529 // most platforms.
5530 if (Args.hasFlag(options::OPT_fsized_deallocation,
5531 options::OPT_fno_sized_deallocation, false))
5532 CmdArgs.push_back("-fsized-deallocation");
5533
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005534 // -fconstant-cfstrings is default, and may be subject to argument translation
5535 // on Darwin.
5536 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5537 options::OPT_fno_constant_cfstrings) ||
5538 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5539 options::OPT_mno_constant_cfstrings))
5540 CmdArgs.push_back("-fno-constant-cfstrings");
5541
John Thompsoned4e2952009-11-05 20:14:16 +00005542 // -fshort-wchar default varies depending on platform; only
5543 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005544 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5545 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005546 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005547
Hans Wennborg28c96312013-07-31 23:39:13 +00005548 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005549 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005550 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005551 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005552
Daniel Dunbar096ed292011-10-05 21:04:55 +00005553 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5554 // -fno-pack-struct doesn't apply to -fpack-struct=.
5555 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005556 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005557 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005558 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005559 } else if (Args.hasFlag(options::OPT_fpack_struct,
5560 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005561 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005562 }
5563
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005564 // Handle -fmax-type-align=N and -fno-type-align
5565 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5566 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5567 if (!SkipMaxTypeAlign) {
5568 std::string MaxTypeAlignStr = "-fmax-type-align=";
5569 MaxTypeAlignStr += A->getValue();
5570 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5571 }
5572 } else if (getToolChain().getTriple().isOSDarwin()) {
5573 if (!SkipMaxTypeAlign) {
5574 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5575 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5576 }
5577 }
5578
John Brawna7b4ec02015-08-10 11:11:28 +00005579 // -fcommon is the default unless compiling kernel code or the target says so
5580 bool NoCommonDefault =
5581 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5582 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5583 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005584 CmdArgs.push_back("-fno-common");
5585
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005586 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005587 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005588 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005589 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005590 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005591 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005592
Daniel Dunbar6358d682010-10-15 22:30:42 +00005593 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005594 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005595 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005597
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005598 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005599 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5600 StringRef value = inputCharset->getValue();
5601 if (value != "UTF-8")
5602 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5603 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005604 }
5605
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005606 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005607 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5608 StringRef value = execCharset->getValue();
5609 if (value != "UTF-8")
5610 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5611 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005612 }
5613
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005614 // -fcaret-diagnostics is default.
5615 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5616 options::OPT_fno_caret_diagnostics, true))
5617 CmdArgs.push_back("-fno-caret-diagnostics");
5618
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005619 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005620 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005621 options::OPT_fno_diagnostics_fixit_info))
5622 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005623
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005624 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005625 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005626 options::OPT_fno_diagnostics_show_option))
5627 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005628
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005629 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005630 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005631 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005632 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005633 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005634
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005635 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005636 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005637 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005638 }
5639
Chandler Carruthb6766f02011-03-27 01:50:55 +00005640 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005641 options::OPT_fdiagnostics_show_note_include_stack,
5642 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005643 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005645 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5646 else
5647 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5648 }
5649
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005650 // Color diagnostics are parsed by the driver directly from argv
5651 // and later re-parsed to construct this job; claim any possible
5652 // color diagnostic here to avoid warn_drv_unused_argument and
5653 // diagnose bad OPT_fdiagnostics_color_EQ values.
5654 for (Arg *A : Args) {
5655 const Option &O = A->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005656 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5657 !O.matches(options::OPT_fdiagnostics_color) &&
5658 !O.matches(options::OPT_fno_color_diagnostics) &&
5659 !O.matches(options::OPT_fno_diagnostics_color) &&
5660 !O.matches(options::OPT_fdiagnostics_color_EQ))
5661 continue;
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005662 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5663 StringRef Value(A->getValue());
5664 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber7e2da792013-04-17 21:52:44 +00005665 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005666 << ("-fdiagnostics-color=" + Value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005667 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005668 A->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005669 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005670 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005671 CmdArgs.push_back("-fcolor-diagnostics");
5672
Nico Rieck7857d462013-09-11 00:38:02 +00005673 if (Args.hasArg(options::OPT_fansi_escape_codes))
5674 CmdArgs.push_back("-fansi-escape-codes");
5675
Daniel Dunbardb097022009-06-08 21:13:54 +00005676 if (!Args.hasFlag(options::OPT_fshow_source_location,
5677 options::OPT_fno_show_source_location))
5678 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005679
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005680 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005681 true))
5682 CmdArgs.push_back("-fno-show-column");
5683
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005684 if (!Args.hasFlag(options::OPT_fspell_checking,
5685 options::OPT_fno_spell_checking))
5686 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005687
Chad Rosierc8e56e82012-12-05 21:08:21 +00005688 // -fno-asm-blocks is default.
5689 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5690 false))
5691 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005692
Steven Wucb0d13f2015-01-16 23:05:28 +00005693 // -fgnu-inline-asm is default.
5694 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5695 options::OPT_fno_gnu_inline_asm, true))
5696 CmdArgs.push_back("-fno-gnu-inline-asm");
5697
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005698 // Enable vectorization per default according to the optimization level
5699 // selected. For optimization levels that want vectorization we use the alias
5700 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005701 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702 OptSpecifier VectorizeAliasOption =
5703 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005704 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005705 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005706 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005707
Chad Rosier136d67d2014-04-28 19:30:57 +00005708 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005709 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005710 OptSpecifier SLPVectAliasOption =
5711 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005712 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005713 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005714 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005715
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005716 // -fno-slp-vectorize-aggressive is default.
5717 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005718 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005719 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005720
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005721 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5722 A->render(Args, CmdArgs);
5723
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005724 if (Arg *A = Args.getLastArg(
5725 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5726 A->render(Args, CmdArgs);
5727
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005728 // -fdollars-in-identifiers default varies depending on platform and
5729 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005730 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005731 options::OPT_fno_dollars_in_identifiers)) {
5732 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005733 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005734 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005735 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005736 }
5737
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005738 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5739 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005740 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005741 options::OPT_fno_unit_at_a_time)) {
5742 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005743 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005744 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005745
Eli Friedman055c9702011-11-02 01:53:16 +00005746 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5747 options::OPT_fno_apple_pragma_pack, false))
5748 CmdArgs.push_back("-fapple-pragma-pack");
5749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005750 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005751 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5752 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005753 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005754 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005755 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005757// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5758//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005759// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005760#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005761 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005762 (getToolChain().getArch() == llvm::Triple::arm ||
5763 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005764 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5765 CmdArgs.push_back("-fno-builtin-strcat");
5766 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5767 CmdArgs.push_back("-fno-builtin-strcpy");
5768 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005769#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005770
Justin Bognera88f0122014-06-20 22:59:50 +00005771 // Enable rewrite includes if the user's asked for it or if we're generating
5772 // diagnostics.
5773 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5774 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005775 if (Args.hasFlag(options::OPT_frewrite_includes,
5776 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005777 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005778 CmdArgs.push_back("-frewrite-includes");
5779
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005780 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005781 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005782 options::OPT_traditional_cpp)) {
5783 if (isa<PreprocessJobAction>(JA))
5784 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005785 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005786 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005787 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005788
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005789 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005790 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005791
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005792 // Handle serialized diagnostics.
5793 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5794 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005795 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005796 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005797
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005798 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5799 CmdArgs.push_back("-fretain-comments-from-system-headers");
5800
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005801 // Forward -fcomment-block-commands to -cc1.
5802 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005803 // Forward -fparse-all-comments to -cc1.
5804 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005805
John Brawnad31ace2015-09-23 13:55:40 +00005806 // Turn -fplugin=name.so into -load name.so
5807 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5808 CmdArgs.push_back("-load");
5809 CmdArgs.push_back(A->getValue());
5810 A->claim();
5811 }
5812
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005813 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5814 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005815 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005816 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5817 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005818
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005819 // We translate this by hand to the -cc1 argument, since nightly test uses
5820 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005821 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005822 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005823 } else
Sean Silva14facf32015-06-09 01:57:17 +00005824 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005825 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005826
Bob Wilson23a55f12014-12-21 07:00:00 +00005827 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005828 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5829 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005830 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5831 // has slightly different breakdown between stages.
5832 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5833 // pristine IR generated by the frontend. Ideally, a new compile action should
5834 // be added so both IR can be captured.
5835 if (C.getDriver().isSaveTempsEnabled() &&
5836 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005837 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005838
Daniel Dunbard67a3222009-03-30 06:36:42 +00005839 if (Output.getType() == types::TY_Dependencies) {
5840 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005841 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005842 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005843 CmdArgs.push_back(Output.getFilename());
5844 } else {
5845 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005846 }
5847
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005848 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005849
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005850 if (Input.isFilename())
5851 CmdArgs.push_back(Input.getFilename());
5852 else
5853 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005854
Chris Lattnere9d7d782009-11-03 19:50:27 +00005855 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5856
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005857 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005858
5859 // Optionally embed the -cc1 level arguments into the debug info, for build
5860 // analysis.
5861 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005862 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005863 for (const auto &Arg : Args)
5864 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005865
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005866 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005867 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005868 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005869 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005870 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005871 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005872 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005873 }
5874 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005875 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005876 }
5877
Eric Christopherd3804002013-02-22 20:12:52 +00005878 // Add the split debug info name to the command lines here so we
5879 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005880 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005881 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5882 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005883 const char *SplitDwarfOut;
5884 if (SplitDwarf) {
5885 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005886 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005887 CmdArgs.push_back(SplitDwarfOut);
5888 }
5889
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005890 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5891 // Include them with -fcuda-include-gpubinary.
5892 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005893 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005894 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005895 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005896 }
5897
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005898 bool WholeProgramVTables =
5899 Args.hasFlag(options::OPT_fwhole_program_vtables,
5900 options::OPT_fno_whole_program_vtables, false);
5901 if (WholeProgramVTables) {
5902 if (!D.isUsingLTO())
5903 D.Diag(diag::err_drv_argument_only_allowed_with)
5904 << "-fwhole-program-vtables"
5905 << "-flto";
5906 CmdArgs.push_back("-fwhole-program-vtables");
5907 }
5908
Eric Christopherd3804002013-02-22 20:12:52 +00005909 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005910 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005911 Output.getType() == types::TY_Object &&
5912 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005913 auto CLCommand =
5914 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005915 C.addCommand(llvm::make_unique<FallbackCommand>(
5916 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005917 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5918 isa<PrecompileJobAction>(JA)) {
5919 // In /fallback builds, run the main compilation even if the pch generation
5920 // fails, so that the main compilation's fallback to cl.exe runs.
5921 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5922 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005923 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005924 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005925 }
5926
Eric Christopherf1545832013-02-22 23:50:16 +00005927 // Handle the debug info splitting at object creation time if we're
5928 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005929 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005930 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005931 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005932
Roman Divacky178e01602011-02-10 16:52:03 +00005933 if (Arg *A = Args.getLastArg(options::OPT_pg))
5934 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005935 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5936 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005937
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005938 // Claim some arguments which clang supports automatically.
5939
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005940 // -fpch-preprocess is used with gcc to add a special marker in the output to
5941 // include the PCH file. Clang's PTH solution is completely transparent, so we
5942 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005943 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005944
Daniel Dunbar17731772009-03-23 19:03:36 +00005945 // Claim some arguments which clang doesn't support, but we don't
5946 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005947 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5948 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005949
Rafael Espindolab0092d72013-09-04 19:37:35 +00005950 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005951 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005952}
5953
John McCall5fb5df92012-06-20 06:18:46 +00005954/// Add options related to the Objective-C runtime/ABI.
5955///
5956/// Returns true if the runtime is non-fragile.
5957ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5958 ArgStringList &cmdArgs,
5959 RewriteKind rewriteKind) const {
5960 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 Arg *runtimeArg =
5962 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5963 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005964
5965 // Just forward -fobjc-runtime= to the frontend. This supercedes
5966 // options about fragility.
5967 if (runtimeArg &&
5968 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5969 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005970 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005971 if (runtime.tryParse(value)) {
5972 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005973 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005974 }
5975
5976 runtimeArg->render(args, cmdArgs);
5977 return runtime;
5978 }
5979
5980 // Otherwise, we'll need the ABI "version". Version numbers are
5981 // slightly confusing for historical reasons:
5982 // 1 - Traditional "fragile" ABI
5983 // 2 - Non-fragile ABI, version 1
5984 // 3 - Non-fragile ABI, version 2
5985 unsigned objcABIVersion = 1;
5986 // If -fobjc-abi-version= is present, use that to set the version.
5987 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005988 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005989 if (value == "1")
5990 objcABIVersion = 1;
5991 else if (value == "2")
5992 objcABIVersion = 2;
5993 else if (value == "3")
5994 objcABIVersion = 3;
5995 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005996 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005997 } else {
5998 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005999 bool nonFragileABIIsDefault =
6000 (rewriteKind == RK_NonFragile ||
6001 (rewriteKind == RK_None &&
6002 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00006003 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
6004 options::OPT_fno_objc_nonfragile_abi,
6005 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006006// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00006007#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
6008 unsigned nonFragileABIVersion = 1;
6009#else
6010 unsigned nonFragileABIVersion = 2;
6011#endif
6012
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006013 if (Arg *abiArg =
6014 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006015 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00006016 if (value == "1")
6017 nonFragileABIVersion = 1;
6018 else if (value == "2")
6019 nonFragileABIVersion = 2;
6020 else
6021 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006022 << value;
John McCall5fb5df92012-06-20 06:18:46 +00006023 }
6024
6025 objcABIVersion = 1 + nonFragileABIVersion;
6026 } else {
6027 objcABIVersion = 1;
6028 }
6029 }
6030
6031 // We don't actually care about the ABI version other than whether
6032 // it's non-fragile.
6033 bool isNonFragile = objcABIVersion != 1;
6034
6035 // If we have no runtime argument, ask the toolchain for its default runtime.
6036 // However, the rewriter only really supports the Mac runtime, so assume that.
6037 ObjCRuntime runtime;
6038 if (!runtimeArg) {
6039 switch (rewriteKind) {
6040 case RK_None:
6041 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6042 break;
6043 case RK_Fragile:
6044 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
6045 break;
6046 case RK_NonFragile:
6047 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6048 break;
6049 }
6050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006051 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006052 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6053 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006054 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006055 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6056
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006057 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006058 } else {
6059 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6060 }
6061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006062 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006063 } else {
6064 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006065 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006066 // non-fragile mode or the GCC runtime in fragile mode.
6067 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006068 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006069 else
6070 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006071 }
6072
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006073 cmdArgs.push_back(
6074 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006075 return runtime;
6076}
6077
Reid Klecknerc542d372014-06-27 17:02:02 +00006078static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6079 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6080 I += HaveDash;
6081 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006082}
Reid Klecknerc542d372014-06-27 17:02:02 +00006083
Benjamin Kramere003ca22015-10-28 13:54:16 +00006084namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006085struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006086 bool Synch = false;
6087 bool Asynch = false;
6088 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006089};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006090} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006091
6092/// /EH controls whether to run destructor cleanups when exceptions are
6093/// thrown. There are three modifiers:
6094/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6095/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6096/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006097/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006098/// The default is /EHs-c-, meaning cleanups are disabled.
6099static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6100 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006101
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006102 std::vector<std::string> EHArgs =
6103 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006104 for (auto EHVal : EHArgs) {
6105 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6106 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006107 case 'a':
6108 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006109 if (EH.Asynch)
6110 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006111 continue;
6112 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006113 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006114 continue;
6115 case 's':
6116 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006117 if (EH.Synch)
6118 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006119 continue;
6120 default:
6121 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006122 }
6123 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6124 break;
6125 }
6126 }
David Majnemerb8809092016-02-20 09:23:44 +00006127 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006128 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006129 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006130 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6131 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006132 EH.Synch = true;
6133 EH.NoUnwindC = true;
6134 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006135
Reid Klecknerc542d372014-06-27 17:02:02 +00006136 return EH;
6137}
6138
David Majnemercd5855e2016-02-29 01:40:36 +00006139void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6140 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006141 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006142 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006143 unsigned RTOptionID = options::OPT__SLASH_MT;
6144
Hans Wennborgf1a74252013-09-10 20:18:04 +00006145 if (Args.hasArg(options::OPT__SLASH_LDd))
6146 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6147 // but defining _DEBUG is sticky.
6148 RTOptionID = options::OPT__SLASH_MTd;
6149
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006150 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006151 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006152
David Majnemere2afb472015-07-24 06:49:13 +00006153 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006154 switch (RTOptionID) {
6155 case options::OPT__SLASH_MD:
6156 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006157 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006158 CmdArgs.push_back("-D_MT");
6159 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006160 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006161 break;
6162 case options::OPT__SLASH_MDd:
6163 CmdArgs.push_back("-D_DEBUG");
6164 CmdArgs.push_back("-D_MT");
6165 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006166 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006167 break;
6168 case options::OPT__SLASH_MT:
6169 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006170 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006171 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006172 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006173 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006174 break;
6175 case options::OPT__SLASH_MTd:
6176 CmdArgs.push_back("-D_DEBUG");
6177 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006178 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006179 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006180 break;
6181 default:
6182 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006183 }
6184
David Majnemere2afb472015-07-24 06:49:13 +00006185 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6186 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6187 } else {
6188 CmdArgs.push_back(FlagForCRT.data());
6189
6190 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6191 // users want. The /Za flag to cl.exe turns this off, but it's not
6192 // implemented in clang.
6193 CmdArgs.push_back("--dependent-lib=oldnames");
6194 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006195
Hans Wennborg8858a032014-07-21 23:42:07 +00006196 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6197 // would produce interleaved output, so ignore /showIncludes in such cases.
6198 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6199 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6200 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006201
David Majnemerf6072342014-07-01 22:24:56 +00006202 // This controls whether or not we emit RTTI data for polymorphic types.
6203 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6204 /*default=*/false))
6205 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006206
Etienne Bergerone28e7f22016-06-15 20:34:33 +00006207 // This controls whether or not we emit stack-protector instrumentation.
6208 // In MSVC, Buffer Security Check (/GS) is on by default.
6209 if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_,
6210 /*default=*/true)) {
6211 CmdArgs.push_back("-stack-protector");
6212 CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong)));
6213 }
6214
Reid Kleckner124955a2015-08-05 18:51:13 +00006215 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006216 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006217 if (*EmitCodeView)
6218 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006219 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006220 CmdArgs.push_back("-gcodeview");
6221
Reid Klecknerc542d372014-06-27 17:02:02 +00006222 const Driver &D = getToolChain().getDriver();
6223 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006224 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006225 if (types::isCXX(InputType))
6226 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006227 CmdArgs.push_back("-fexceptions");
6228 }
David Majnemercd5855e2016-02-29 01:40:36 +00006229 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6230 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006231
Hans Wennborge50cec32014-06-13 20:59:54 +00006232 // /EP should expand to -E -P.
6233 if (Args.hasArg(options::OPT__SLASH_EP)) {
6234 CmdArgs.push_back("-E");
6235 CmdArgs.push_back("-P");
6236 }
6237
David Majnemera5b195a2015-02-14 01:35:12 +00006238 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006239 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6240 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006241 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6242 else
6243 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6244
6245 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6246 VolatileOptionID = A->getOption().getID();
6247
6248 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6249 CmdArgs.push_back("-fms-volatile");
6250
David Majnemer86c318f2014-02-11 21:05:00 +00006251 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6252 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6253 if (MostGeneralArg && BestCaseArg)
6254 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6255 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6256
6257 if (MostGeneralArg) {
6258 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6259 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6260 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6261
6262 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6263 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6264 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6265 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6266 << FirstConflict->getAsString(Args)
6267 << SecondConflict->getAsString(Args);
6268
6269 if (SingleArg)
6270 CmdArgs.push_back("-fms-memptr-rep=single");
6271 else if (MultipleArg)
6272 CmdArgs.push_back("-fms-memptr-rep=multiple");
6273 else
6274 CmdArgs.push_back("-fms-memptr-rep=virtual");
6275 }
6276
Alexey Bataeva7547182016-05-18 09:06:38 +00006277 if (Args.getLastArg(options::OPT__SLASH_Gd))
6278 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6279 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6280 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6281 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6282 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6283 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6284 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6285
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006286 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6287 A->render(Args, CmdArgs);
6288
Hans Wennborg81f74482013-09-10 01:07:07 +00006289 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6290 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006291 if (Args.hasArg(options::OPT__SLASH_fallback))
6292 CmdArgs.push_back("msvc-fallback");
6293 else
6294 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006295 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006296}
6297
Douglas Katzman95354292015-06-23 20:42:09 +00006298visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006299 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006300 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006301 return CLFallback.get();
6302}
6303
Daniel Sanders7f933f42015-01-30 17:35:23 +00006304void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6305 ArgStringList &CmdArgs) const {
6306 StringRef CPUName;
6307 StringRef ABIName;
6308 const llvm::Triple &Triple = getToolChain().getTriple();
6309 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6310
6311 CmdArgs.push_back("-target-abi");
6312 CmdArgs.push_back(ABIName.data());
6313}
6314
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006315void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006316 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006317 const ArgList &Args,
6318 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006319 ArgStringList CmdArgs;
6320
6321 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6322 const InputInfo &Input = Inputs[0];
6323
James Y Knight2db38f32015-08-15 03:45:25 +00006324 std::string TripleStr =
6325 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6326 const llvm::Triple Triple(TripleStr);
6327
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006328 // Don't warn about "clang -w -c foo.s"
6329 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006330 // and "clang -emit-llvm -c foo.s"
6331 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006332
Rafael Espindola577637a2015-01-03 00:06:04 +00006333 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006334
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006335 // Invoke ourselves in -cc1as mode.
6336 //
6337 // FIXME: Implement custom jobs for internal actions.
6338 CmdArgs.push_back("-cc1as");
6339
6340 // Add the "effective" target triple.
6341 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006342 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6343
6344 // Set the output mode, we currently only expect to be used as a real
6345 // assembler.
6346 CmdArgs.push_back("-filetype");
6347 CmdArgs.push_back("obj");
6348
Eric Christopher45f2e712012-12-18 00:31:10 +00006349 // Set the main file name, so that debug info works even with
6350 // -save-temps or preprocessed assembly.
6351 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006352 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006353
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006354 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006355 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006356 if (!CPU.empty()) {
6357 CmdArgs.push_back("-target-cpu");
6358 CmdArgs.push_back(Args.MakeArgString(CPU));
6359 }
6360
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006361 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006362 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006363
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006364 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006365 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006366
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006367 // Pass along any -I options so we get proper .include search paths.
6368 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6369
Eric Christopherfc3ee562012-01-10 00:38:01 +00006370 // Determine the original source input.
6371 const Action *SourceAction = &JA;
6372 while (SourceAction->getKind() != Action::InputClass) {
6373 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6374 SourceAction = SourceAction->getInputs()[0];
6375 }
6376
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006377 // Forward -g and handle debug info related flags, assuming we are dealing
6378 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006379 bool WantDebug = false;
6380 unsigned DwarfVersion = 0;
6381 Args.ClaimAllArgs(options::OPT_g_Group);
6382 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6383 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6384 !A->getOption().matches(options::OPT_ggdb0);
6385 if (WantDebug)
6386 DwarfVersion = DwarfVersionNum(A->getSpelling());
6387 }
6388 if (DwarfVersion == 0)
6389 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6390
6391 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6392
Eric Christopherfc3ee562012-01-10 00:38:01 +00006393 if (SourceAction->getType() == types::TY_Asm ||
6394 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006395 // You might think that it would be ok to set DebugInfoKind outside of
6396 // the guard for source type, however there is a test which asserts
6397 // that some assembler invocation receives no -debug-info-kind,
6398 // and it's not clear whether that test is just overly restrictive.
6399 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6400 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006401 // Add the -fdebug-compilation-dir flag if needed.
6402 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006403
6404 // Set the AT_producer to the clang version when using the integrated
6405 // assembler on assembly source files.
6406 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006407 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006408
6409 // And pass along -I options
6410 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006411 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006412 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6413 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006414
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006415 // Handle -fPIC et al -- the relocation-model affects the assembler
6416 // for some targets.
6417 llvm::Reloc::Model RelocationModel;
6418 unsigned PICLevel;
6419 bool IsPIE;
6420 std::tie(RelocationModel, PICLevel, IsPIE) =
6421 ParsePICArgs(getToolChain(), Triple, Args);
6422
6423 const char *RMName = RelocationModelName(RelocationModel);
6424 if (RMName) {
6425 CmdArgs.push_back("-mrelocation-model");
6426 CmdArgs.push_back(RMName);
6427 }
6428
Kevin Enderby292dc082011-12-22 19:31:58 +00006429 // Optionally embed the -cc1as level arguments into the debug info, for build
6430 // analysis.
6431 if (getToolChain().UseDwarfDebugFlags()) {
6432 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006433 for (const auto &Arg : Args)
6434 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006435
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006436 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006437 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6438 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006439 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006440 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006441 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006442 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006443 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006444 }
6445 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006446 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006447 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006448
6449 // FIXME: Add -static support, once we have it.
6450
Daniel Sanders7f933f42015-01-30 17:35:23 +00006451 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006452 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006453 default:
6454 break;
6455
6456 case llvm::Triple::mips:
6457 case llvm::Triple::mipsel:
6458 case llvm::Triple::mips64:
6459 case llvm::Triple::mips64el:
6460 AddMIPSTargetArgs(Args, CmdArgs);
6461 break;
6462 }
6463
David Blaikie372d9502014-01-17 03:17:40 +00006464 // Consume all the warning flags. Usually this would be handled more
6465 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6466 // doesn't handle that so rather than warning about unused flags that are
6467 // actually used, we'll lie by omission instead.
6468 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006469 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006470
David Blaikie9260ed62013-07-25 21:19:01 +00006471 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6472 getToolChain().getDriver());
6473
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006474 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006475
6476 assert(Output.isFilename() && "Unexpected lipo output.");
6477 CmdArgs.push_back("-o");
6478 CmdArgs.push_back(Output.getFilename());
6479
Daniel Dunbarb440f562010-08-02 02:38:21 +00006480 assert(Input.isFilename() && "Invalid input.");
6481 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006482
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006483 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006484 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006485
6486 // Handle the debug info splitting at object creation time if we're
6487 // creating an object.
6488 // TODO: Currently only works on linux with newer objcopy.
6489 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006490 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006491 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006492 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006493}
6494
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006495void GnuTool::anchor() {}
6496
Daniel Dunbara3246a02009-03-18 08:07:30 +00006497void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006498 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006499 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006500 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006501 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006502 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006504 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006505 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006506 // It is unfortunate that we have to claim here, as this means
6507 // we will basically never report anything interesting for
6508 // platforms using a generic gcc, even if we are just using gcc
6509 // to get to the assembler.
6510 A->claim();
6511
Daniel Dunbar939c1212010-08-03 16:14:14 +00006512 // Don't forward any -g arguments to assembly steps.
6513 if (isa<AssembleJobAction>(JA) &&
6514 A->getOption().matches(options::OPT_g_Group))
6515 continue;
6516
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006517 // Don't forward any -W arguments to assembly and link steps.
6518 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6519 A->getOption().matches(options::OPT_W_Group))
6520 continue;
6521
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006522 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006523 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006524 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006525
Daniel Dunbar4e295052010-01-25 22:35:08 +00006526 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006527
6528 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006529 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006530 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006531 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006532 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006533 }
6534
Daniel Dunbar5716d872009-05-02 21:41:52 +00006535 // Try to force gcc to match the tool chain we want, if we recognize
6536 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006537 //
6538 // FIXME: The triple class should directly provide the information we want
6539 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006540 switch (getToolChain().getArch()) {
6541 default:
6542 break;
6543 case llvm::Triple::x86:
6544 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006545 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006546 break;
6547 case llvm::Triple::x86_64:
6548 case llvm::Triple::ppc64:
6549 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006550 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006551 break;
6552 case llvm::Triple::sparcel:
6553 CmdArgs.push_back("-EL");
6554 break;
6555 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006556
Daniel Dunbarb440f562010-08-02 02:38:21 +00006557 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006558 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006559 CmdArgs.push_back(Output.getFilename());
6560 } else {
6561 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006562 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006563 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006564
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006565 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006566
6567 // Only pass -x if gcc will understand it; otherwise hope gcc
6568 // understands the suffix correctly. The main use case this would go
6569 // wrong in is for linker inputs if they happened to have an odd
6570 // suffix; really the only way to get this to happen is a command
6571 // like '-x foobar a.c' which will treat a.c like a linker input.
6572 //
6573 // FIXME: For the linker case specifically, can we safely convert
6574 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006575 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006576 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006577 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006578 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006579 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006580 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006581 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006582 else if (II.getType() == types::TY_ModuleFile)
6583 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006584 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006585
Daniel Dunbara3246a02009-03-18 08:07:30 +00006586 if (types::canTypeBeUserSpecified(II.getType())) {
6587 CmdArgs.push_back("-x");
6588 CmdArgs.push_back(types::getTypeName(II.getType()));
6589 }
6590
Daniel Dunbarb440f562010-08-02 02:38:21 +00006591 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006592 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006593 else {
6594 const Arg &A = II.getInputArg();
6595
6596 // Reverse translate some rewritten options.
6597 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6598 CmdArgs.push_back("-lstdc++");
6599 continue;
6600 }
6601
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006602 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006603 A.render(Args, CmdArgs);
6604 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006605 }
6606
Benjamin Kramer2e018ef2016-05-27 13:36:58 +00006607 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006608 const char *GCCName;
6609 if (!customGCCName.empty())
6610 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006611 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006612 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006613 } else
6614 GCCName = "gcc";
6615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006616 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006617 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006618}
6619
Douglas Katzman95354292015-06-23 20:42:09 +00006620void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6621 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006622 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006623}
6624
Douglas Katzman95354292015-06-23 20:42:09 +00006625void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6626 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006627 const Driver &D = getToolChain().getDriver();
6628
Eric Christophercc7ff502015-01-29 00:56:17 +00006629 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006630 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006631 case types::TY_LLVM_IR:
6632 case types::TY_LTO_IR:
6633 case types::TY_LLVM_BC:
6634 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006635 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006636 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006637 // We assume we've got an "integrated" assembler in that gcc will produce an
6638 // object file itself.
6639 case types::TY_Object:
6640 CmdArgs.push_back("-c");
6641 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006642 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006643 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006644 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006645 case types::TY_Nothing:
6646 CmdArgs.push_back("-fsyntax-only");
6647 break;
6648 default:
6649 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006650 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006651}
6652
Douglas Katzman95354292015-06-23 20:42:09 +00006653void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6654 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006655 // The types are (hopefully) good enough.
6656}
6657
Tony Linthicum76329bf2011-12-12 21:14:55 +00006658// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006659void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006660 ArgStringList &CmdArgs) const {
6661}
6662
Douglas Katzman95354292015-06-23 20:42:09 +00006663void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6664 const InputInfo &Output,
6665 const InputInfoList &Inputs,
6666 const ArgList &Args,
6667 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006668 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006669
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006670 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6671 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006672 ArgStringList CmdArgs;
6673
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006674 std::string MArchString = "-march=hexagon";
6675 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006676
6677 RenderExtraToolArgs(JA, CmdArgs);
6678
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006679 std::string AsName = "hexagon-llvm-mc";
6680 std::string MCpuString = "-mcpu=hexagon" +
6681 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6682 CmdArgs.push_back("-filetype=obj");
6683 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6684
Tony Linthicum76329bf2011-12-12 21:14:55 +00006685 if (Output.isFilename()) {
6686 CmdArgs.push_back("-o");
6687 CmdArgs.push_back(Output.getFilename());
6688 } else {
6689 assert(Output.isNothing() && "Unexpected output");
6690 CmdArgs.push_back("-fsyntax-only");
6691 }
6692
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006693 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6694 std::string N = llvm::utostr(G.getValue());
6695 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6696 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006698 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006699
Tony Linthicum76329bf2011-12-12 21:14:55 +00006700 // Only pass -x if gcc will understand it; otherwise hope gcc
6701 // understands the suffix correctly. The main use case this would go
6702 // wrong in is for linker inputs if they happened to have an odd
6703 // suffix; really the only way to get this to happen is a command
6704 // like '-x foobar a.c' which will treat a.c like a linker input.
6705 //
6706 // FIXME: For the linker case specifically, can we safely convert
6707 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006708 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006709 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006710 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006711 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006712 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006713 else if (II.getType() == types::TY_AST)
6714 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006715 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006716 else if (II.getType() == types::TY_ModuleFile)
6717 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006718 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006719
6720 if (II.isFilename())
6721 CmdArgs.push_back(II.getFilename());
6722 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006723 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006724 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006725 II.getInputArg().render(Args, CmdArgs);
6726 }
6727
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006728 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006729 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006730}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006731
Douglas Katzman95354292015-06-23 20:42:09 +00006732void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6733 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006734}
6735
Douglas Katzman54366072015-07-27 16:53:08 +00006736static void
6737constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006738 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006739 const InputInfo &Output, const InputInfoList &Inputs,
6740 const ArgList &Args, ArgStringList &CmdArgs,
6741 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006742
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006743 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006744
Matthew Curtise689b052012-12-06 15:46:07 +00006745 //----------------------------------------------------------------------------
6746 //
6747 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006748 bool IsStatic = Args.hasArg(options::OPT_static);
6749 bool IsShared = Args.hasArg(options::OPT_shared);
6750 bool IsPIE = Args.hasArg(options::OPT_pie);
6751 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6752 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6753 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6754 bool UseG0 = false;
6755 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006756
Matthew Curtise689b052012-12-06 15:46:07 +00006757 //----------------------------------------------------------------------------
6758 // Silence warnings for various options
6759 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006760 Args.ClaimAllArgs(options::OPT_g_Group);
6761 Args.ClaimAllArgs(options::OPT_emit_llvm);
6762 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6763 // handled somewhere else.
6764 Args.ClaimAllArgs(options::OPT_static_libgcc);
6765
6766 //----------------------------------------------------------------------------
6767 //
6768 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006769 if (Args.hasArg(options::OPT_s))
6770 CmdArgs.push_back("-s");
6771
6772 if (Args.hasArg(options::OPT_r))
6773 CmdArgs.push_back("-r");
6774
6775 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006776 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006777
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006778 CmdArgs.push_back("-march=hexagon");
6779 std::string CpuVer =
6780 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6781 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6782 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006783
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006784 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006785 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006786 // The following should be the default, but doing as hexagon-gcc does.
6787 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006788 }
6789
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006790 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006791 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006792
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006793 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006794 CmdArgs.push_back("-pie");
6795
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006796 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6797 std::string N = llvm::utostr(G.getValue());
6798 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6799 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006800 }
6801
Matthew Curtise689b052012-12-06 15:46:07 +00006802 //----------------------------------------------------------------------------
6803 //
6804 //----------------------------------------------------------------------------
6805 CmdArgs.push_back("-o");
6806 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006807
Matthew Curtise689b052012-12-06 15:46:07 +00006808 //----------------------------------------------------------------------------
6809 // moslib
6810 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006811 std::vector<std::string> OsLibs;
6812 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006813
Sean Silva14facf32015-06-09 01:57:17 +00006814 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6815 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006816 OsLibs.emplace_back(A->getValue());
6817 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006818 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006819 if (OsLibs.empty()) {
6820 OsLibs.push_back("standalone");
6821 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006822 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006823
Matthew Curtise689b052012-12-06 15:46:07 +00006824 //----------------------------------------------------------------------------
6825 // Start Files
6826 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006827 const std::string MCpuSuffix = "/" + CpuVer;
6828 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6829 const std::string RootDir =
6830 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6831 const std::string StartSubDir =
6832 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006833
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006834 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6835 const char *Name) -> std::string {
6836 std::string RelName = SubDir + Name;
6837 std::string P = HTC.GetFilePath(RelName.c_str());
6838 if (llvm::sys::fs::exists(P))
6839 return P;
6840 return RootDir + RelName;
6841 };
6842
6843 if (IncStdLib && IncStartFiles) {
6844 if (!IsShared) {
6845 if (HasStandalone) {
6846 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6847 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006848 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006849 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6850 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006851 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006852 std::string Init = UseShared
6853 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6854 : Find(RootDir, StartSubDir, "/init.o");
6855 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006856 }
6857
6858 //----------------------------------------------------------------------------
6859 // Library Search Paths
6860 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006861 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6862 for (const auto &LibPath : LibPaths)
6863 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006864
6865 //----------------------------------------------------------------------------
6866 //
6867 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006868 Args.AddAllArgs(CmdArgs,
6869 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6870 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006871
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006872 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006873
6874 //----------------------------------------------------------------------------
6875 // Libraries
6876 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006877 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006878 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006879 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006880 CmdArgs.push_back("-lm");
6881 }
6882
6883 CmdArgs.push_back("--start-group");
6884
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006885 if (!IsShared) {
6886 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006887 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006888 CmdArgs.push_back("-lc");
6889 }
6890 CmdArgs.push_back("-lgcc");
6891
6892 CmdArgs.push_back("--end-group");
6893 }
6894
6895 //----------------------------------------------------------------------------
6896 // End files
6897 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006898 if (IncStdLib && IncStartFiles) {
6899 std::string Fini = UseShared
6900 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6901 : Find(RootDir, StartSubDir, "/fini.o");
6902 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006903 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006904}
6905
Douglas Katzman95354292015-06-23 20:42:09 +00006906void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6907 const InputInfo &Output,
6908 const InputInfoList &Inputs,
6909 const ArgList &Args,
6910 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006911 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006912
6913 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006914 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006915 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006916
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006917 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006918 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006919 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006920}
6921// Hexagon tools end.
6922
Tom Stellard8fa33092015-07-18 01:49:05 +00006923void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6924 const InputInfo &Output,
6925 const InputInfoList &Inputs,
6926 const ArgList &Args,
6927 const char *LinkingOutput) const {
6928
6929 std::string Linker = getToolChain().GetProgramPath(getShortName());
6930 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006931 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006932 CmdArgs.push_back("-shared");
6933 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006934 CmdArgs.push_back(Output.getFilename());
6935 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6936 CmdArgs, Inputs));
6937}
6938// AMDGPU tools end.
6939
Dan Gohman52816862015-12-16 23:30:41 +00006940wasm::Linker::Linker(const ToolChain &TC)
6941 : GnuTool("wasm::Linker", "lld", TC) {}
6942
6943bool wasm::Linker::isLinkJob() const {
6944 return true;
6945}
6946
6947bool wasm::Linker::hasIntegratedCPP() const {
6948 return false;
6949}
6950
6951void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6952 const InputInfo &Output,
6953 const InputInfoList &Inputs,
6954 const ArgList &Args,
6955 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006956
6957 const ToolChain &ToolChain = getToolChain();
6958 const Driver &D = ToolChain.getDriver();
6959 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006960 ArgStringList CmdArgs;
6961 CmdArgs.push_back("-flavor");
6962 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006963
6964 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006965 // size is of particular importance. This is significantly facilitated by
6966 // the enabling of -ffunction-sections and -fdata-sections in
6967 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006968 if (areOptimizationsEnabled(Args))
6969 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006970
Dan Gohman57b62c52016-02-22 19:26:15 +00006971 if (Args.hasArg(options::OPT_rdynamic))
6972 CmdArgs.push_back("-export-dynamic");
6973 if (Args.hasArg(options::OPT_s))
6974 CmdArgs.push_back("--strip-all");
6975 if (Args.hasArg(options::OPT_shared))
6976 CmdArgs.push_back("-shared");
6977 if (Args.hasArg(options::OPT_static))
6978 CmdArgs.push_back("-Bstatic");
6979
6980 Args.AddAllArgs(CmdArgs, options::OPT_L);
6981 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6982
6983 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6984 if (Args.hasArg(options::OPT_shared))
6985 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6986 else if (Args.hasArg(options::OPT_pie))
6987 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6988 else
6989 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6990
6991 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6992 }
6993
6994 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6995
6996 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6997 if (D.CCCIsCXX())
6998 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6999
7000 if (Args.hasArg(options::OPT_pthread))
7001 CmdArgs.push_back("-lpthread");
7002
7003 CmdArgs.push_back("-lc");
7004 CmdArgs.push_back("-lcompiler_rt");
7005 }
7006
7007 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
7008 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7009
Dan Gohman52816862015-12-16 23:30:41 +00007010 CmdArgs.push_back("-o");
7011 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00007012
Dan Gohman52816862015-12-16 23:30:41 +00007013 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
7014}
7015
Renato Golin7c542b42015-07-27 23:44:45 +00007016const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00007017 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00007018 if (!Arch.empty())
7019 MArch = Arch;
7020 else
Bernard Ogden31561762013-12-12 13:27:11 +00007021 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00007022 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00007023
7024 // Handle -march=native.
7025 if (MArch == "native") {
7026 std::string CPU = llvm::sys::getHostCPUName();
7027 if (CPU != "generic") {
7028 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007029 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007030 // If there is no valid architecture suffix for this CPU we don't know how
7031 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007032 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00007033 MArch = "";
7034 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007035 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00007036 }
7037 }
7038
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007039 return MArch;
7040}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007041
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007042/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007043StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00007044 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007045 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
7046 // here means an -march=native that we can't handle, so instead return no CPU.
7047 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007048 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00007049
John Brawna95c1a82015-05-08 12:52:18 +00007050 // We need to return an empty string here on invalid MArch values as the
7051 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007052 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00007053}
7054
7055/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00007056std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007057 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00007058 // FIXME: Warn on inconsistent use of -mcpu and -march.
7059 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00007060 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00007061 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00007062 // Handle -mcpu=native.
7063 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007064 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007065 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007066 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007067 }
7068
Renato Goline17c5802015-07-27 23:44:42 +00007069 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007070}
7071
7072/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007073/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007074// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007075StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7076 const llvm::Triple &Triple) {
7077 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007078 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007079 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007080 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007081 if (ArchKind == llvm::ARM::AK_INVALID)
7082 // In case of generic Arch, i.e. "arm",
7083 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007084 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007085 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007086 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7087 // armv7k triple if it's actually been specified via "-arch armv7k".
7088 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007089 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007090 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007091 }
Renato Golin3c007252015-05-28 15:05:53 +00007092 if (ArchKind == llvm::ARM::AK_INVALID)
7093 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007094 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007095}
7096
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007097void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007098 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007099 if (Args.hasArg(options::OPT_r))
7100 return;
7101
John Brawn94fd9632015-05-21 12:19:49 +00007102 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7103 // to generate BE-8 executables.
7104 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7105 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007106}
7107
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007108mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007109 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7110 // was first introduced in Release 3. However, other compilers have
7111 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007112 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7113 .Case("mips1", NanLegacy)
7114 .Case("mips2", NanLegacy)
7115 .Case("mips3", NanLegacy)
7116 .Case("mips4", NanLegacy)
7117 .Case("mips5", NanLegacy)
7118 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007119 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007120 .Case("mips32r3", NanLegacy | Nan2008)
7121 .Case("mips32r5", NanLegacy | Nan2008)
7122 .Case("mips32r6", Nan2008)
7123 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007124 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007125 .Case("mips64r3", NanLegacy | Nan2008)
7126 .Case("mips64r5", NanLegacy | Nan2008)
7127 .Case("mips64r6", Nan2008)
7128 .Default(NanLegacy);
7129}
7130
Simon Dardisd0e83ba2016-05-27 15:13:31 +00007131bool mips::hasCompactBranches(StringRef &CPU) {
7132 // mips32r6 and mips64r6 have compact branches.
7133 return llvm::StringSwitch<bool>(CPU)
7134 .Case("mips32r6", true)
7135 .Case("mips64r6", true)
7136 .Default(false);
7137}
7138
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007139bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7140 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7141 return A && (A->getValue() == StringRef(Value));
7142}
7143
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007144bool mips::isUCLibc(const ArgList &Args) {
7145 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007146 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007147}
7148
Daniel Sanders2bf13662014-07-10 14:40:57 +00007149bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007150 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7151 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007152 .Case("2008", true)
7153 .Case("legacy", false)
7154 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007155
7156 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007157 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007158 .Cases("mips32r6", "mips64r6", true)
7159 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007160
7161 return false;
7162}
7163
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007164bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7165 if (!Triple.isAndroid())
7166 return false;
7167
7168 // Android MIPS32R6 defaults to FP64A.
7169 return llvm::StringSwitch<bool>(CPUName)
7170 .Case("mips32r6", true)
7171 .Default(false);
7172}
7173
Daniel Sanders379d44b2014-07-16 11:52:23 +00007174bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007175 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007176 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007177 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7178 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007179 return false;
7180
7181 if (ABIName != "32")
7182 return false;
7183
Toma Tabacu94ea6862015-06-16 13:54:13 +00007184 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7185 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007186 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007187 return false;
7188
Daniel Sanders379d44b2014-07-16 11:52:23 +00007189 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007190 .Cases("mips2", "mips3", "mips4", "mips5", true)
7191 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7192 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7193 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007194}
7195
Toma Tabacu94ea6862015-06-16 13:54:13 +00007196bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7197 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007198 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007199 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7200
7201 // FPXX shouldn't be used if -msingle-float is present.
7202 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7203 options::OPT_mdouble_float))
7204 if (A->getOption().matches(options::OPT_msingle_float))
7205 UseFPXX = false;
7206
7207 return UseFPXX;
7208}
7209
Tim Northover157d9112014-01-16 08:48:16 +00007210llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007211 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7212 // archs which Darwin doesn't use.
7213
7214 // The matching this routine does is fairly pointless, since it is neither the
7215 // complete architecture list, nor a reasonable subset. The problem is that
7216 // historically the driver driver accepts this and also ties its -march=
7217 // handling to the architecture name, so we need to be careful before removing
7218 // support for it.
7219
7220 // This code must be kept in sync with Clang's Darwin specific argument
7221 // translation.
7222
7223 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007224 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7225 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7226 .Case("ppc64", llvm::Triple::ppc64)
7227 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7228 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7229 llvm::Triple::x86)
7230 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7231 // This is derived from the driver driver.
7232 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7233 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7234 .Cases("armv7s", "xscale", llvm::Triple::arm)
7235 .Case("arm64", llvm::Triple::aarch64)
7236 .Case("r600", llvm::Triple::r600)
7237 .Case("amdgcn", llvm::Triple::amdgcn)
7238 .Case("nvptx", llvm::Triple::nvptx)
7239 .Case("nvptx64", llvm::Triple::nvptx64)
7240 .Case("amdil", llvm::Triple::amdil)
7241 .Case("spir", llvm::Triple::spir)
7242 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007243}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007244
Tim Northover157d9112014-01-16 08:48:16 +00007245void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007246 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007247 T.setArch(Arch);
7248
7249 if (Str == "x86_64h")
7250 T.setArchName(Str);
7251 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7252 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007253 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007254 }
7255}
7256
Bob Wilsondecc03e2012-11-23 06:14:39 +00007257const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007258 const InputInfo &Input) {
7259 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007260}
7261
Bob Wilsondecc03e2012-11-23 06:14:39 +00007262const char *Clang::getBaseInputStem(const ArgList &Args,
7263 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007264 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007265
Chris Lattner906bb902011-01-16 08:14:11 +00007266 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007267 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007268
7269 return Str;
7270}
7271
Bob Wilsondecc03e2012-11-23 06:14:39 +00007272const char *Clang::getDependencyFileName(const ArgList &Args,
7273 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007274 // FIXME: Think about this more.
7275 std::string Res;
7276
7277 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007278 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007279 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007280 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007281 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007282 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007283 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007284}
7285
Douglas Katzman95354292015-06-23 20:42:09 +00007286void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7287 const InputInfo &Output,
7288 const InputInfoList &Inputs,
7289 const ArgList &Args,
7290 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007291 const ToolChain &ToolChain = getToolChain();
7292 const Driver &D = ToolChain.getDriver();
7293 ArgStringList CmdArgs;
7294
7295 // Silence warning for "clang -g foo.o -o foo"
7296 Args.ClaimAllArgs(options::OPT_g_Group);
7297 // and "clang -emit-llvm foo.o -o foo"
7298 Args.ClaimAllArgs(options::OPT_emit_llvm);
7299 // and for "clang -w foo.o -o foo". Other warning options are already
7300 // handled somewhere else.
7301 Args.ClaimAllArgs(options::OPT_w);
7302
7303 if (!D.SysRoot.empty())
7304 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7305
7306 // CloudABI only supports static linkage.
7307 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007308
7309 // CloudABI uses Position Independent Executables exclusively.
7310 CmdArgs.push_back("-pie");
7311 CmdArgs.push_back("--no-dynamic-linker");
7312 CmdArgs.push_back("-zrelro");
7313
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007314 CmdArgs.push_back("--eh-frame-hdr");
7315 CmdArgs.push_back("--gc-sections");
7316
7317 if (Output.isFilename()) {
7318 CmdArgs.push_back("-o");
7319 CmdArgs.push_back(Output.getFilename());
7320 } else {
7321 assert(Output.isNothing() && "Invalid output.");
7322 }
7323
Douglas Katzman78b37b02015-11-17 20:28:07 +00007324 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7326 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7327 }
7328
7329 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007330 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007331 Args.AddAllArgs(CmdArgs,
7332 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7333 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007334
Teresa Johnson945bc502015-10-15 20:35:53 +00007335 if (D.isUsingLTO())
7336 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007337
7338 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7339
Douglas Katzman78b37b02015-11-17 20:28:07 +00007340 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007341 if (D.CCCIsCXX())
7342 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7343 CmdArgs.push_back("-lc");
7344 CmdArgs.push_back("-lcompiler_rt");
7345 }
7346
Douglas Katzman78b37b02015-11-17 20:28:07 +00007347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007348 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7349
7350 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007351 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007352}
7353
Douglas Katzman95354292015-06-23 20:42:09 +00007354void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7355 const InputInfo &Output,
7356 const InputInfoList &Inputs,
7357 const ArgList &Args,
7358 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007359 ArgStringList CmdArgs;
7360
7361 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7362 const InputInfo &Input = Inputs[0];
7363
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007364 // Determine the original source input.
7365 const Action *SourceAction = &JA;
7366 while (SourceAction->getKind() != Action::InputClass) {
7367 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7368 SourceAction = SourceAction->getInputs()[0];
7369 }
7370
Eric Christopherf5a8f492015-12-08 00:10:10 +00007371 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007372 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007373 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7374 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007375 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007376 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007377 const llvm::Triple &T(getToolChain().getTriple());
7378 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007379 CmdArgs.push_back("-Q");
7380 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007381
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007382 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007383 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007384 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007385 if (Args.hasArg(options::OPT_gstabs))
7386 CmdArgs.push_back("--gstabs");
7387 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007388 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007389 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007390
Daniel Dunbarbe220842009-03-20 16:06:39 +00007391 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007392 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007393
Daniel Dunbar6d484762010-07-22 01:47:22 +00007394 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007395 if (getToolChain().getArch() == llvm::Triple::x86 ||
7396 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007397 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7398 CmdArgs.push_back("-force_cpusubtype_ALL");
7399
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007400 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007401 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007402 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007403 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007404 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007405 CmdArgs.push_back("-static");
7406
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007407 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007408
7409 assert(Output.isFilename() && "Unexpected lipo output.");
7410 CmdArgs.push_back("-o");
7411 CmdArgs.push_back(Output.getFilename());
7412
Daniel Dunbarb440f562010-08-02 02:38:21 +00007413 assert(Input.isFilename() && "Invalid input.");
7414 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007415
7416 // asm_final spec is empty.
7417
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007418 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007420}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007421
Tim Northover157d9112014-01-16 08:48:16 +00007422void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007423
Tim Northover157d9112014-01-16 08:48:16 +00007424void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7425 ArgStringList &CmdArgs) const {
7426 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007427
Daniel Dunbarc1964212009-03-26 16:23:12 +00007428 // Derived from darwin_arch spec.
7429 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007430 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007431
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007432 // FIXME: Is this needed anymore?
7433 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007434 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007435}
7436
Douglas Katzman95354292015-06-23 20:42:09 +00007437bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007438 // We only need to generate a temp path for LTO if we aren't compiling object
7439 // files. When compiling source files, we run 'dsymutil' after linking. We
7440 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007441 for (const auto &Input : Inputs)
7442 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007443 return true;
7444
7445 return false;
7446}
7447
Douglas Katzman95354292015-06-23 20:42:09 +00007448void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7449 ArgStringList &CmdArgs,
7450 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007451 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007452 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007453
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007454 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007455 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007456 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007457 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007458 }
7459
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007460 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007461 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007462 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7463 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007464
Bob Wilson3d27dad2013-08-02 22:25:34 +00007465 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7466 CmdArgs.push_back("-export_dynamic");
7467
Bob Wilsonb111ec92015-03-02 19:01:14 +00007468 // If we are using App Extension restrictions, pass a flag to the linker
7469 // telling it that the compiled code has been audited.
7470 if (Args.hasFlag(options::OPT_fapplication_extension,
7471 options::OPT_fno_application_extension, false))
7472 CmdArgs.push_back("-application_extension");
7473
Teresa Johnson945bc502015-10-15 20:35:53 +00007474 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007475 // If we are using LTO, then automatically create a temporary file path for
7476 // the linker to use, so that it's lifetime will extend past a possible
7477 // dsymutil step.
7478 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7479 const char *TmpPath = C.getArgs().MakeArgString(
7480 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7481 C.addTempFile(TmpPath);
7482 CmdArgs.push_back("-object_path_lto");
7483 CmdArgs.push_back(TmpPath);
7484 }
7485
7486 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7487 // it in clang installed libraries. If not found, the option is not used
7488 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7489 if (Version[0] >= 133) {
7490 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7491 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7492 SmallString<128> LibLTOPath(P);
7493 llvm::sys::path::append(LibLTOPath, "lib");
7494 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7495 if (llvm::sys::fs::exists(LibLTOPath)) {
7496 CmdArgs.push_back("-lto_library");
7497 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7498 } else {
7499 D.Diag(diag::warn_drv_lto_libpath);
7500 }
7501 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007502 }
7503
Daniel Dunbarc1964212009-03-26 16:23:12 +00007504 // Derived from the "link" spec.
7505 Args.AddAllArgs(CmdArgs, options::OPT_static);
7506 if (!Args.hasArg(options::OPT_static))
7507 CmdArgs.push_back("-dynamic");
7508 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7509 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7510 // here. How do we wish to handle such things?
7511 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007512
Daniel Dunbarc1964212009-03-26 16:23:12 +00007513 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007514 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007515 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007516 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007517
7518 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7519 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7520 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7521
7522 Arg *A;
7523 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7524 (A = Args.getLastArg(options::OPT_current__version)) ||
7525 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007526 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7527 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007528
7529 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7530 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7531 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7532 } else {
7533 CmdArgs.push_back("-dylib");
7534
7535 Arg *A;
7536 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7537 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7538 (A = Args.getLastArg(options::OPT_client__name)) ||
7539 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7540 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7541 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007542 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7543 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007544
Daniel Dunbarc1964212009-03-26 16:23:12 +00007545 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7546 "-dylib_compatibility_version");
7547 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7548 "-dylib_current_version");
7549
Tim Northover157d9112014-01-16 08:48:16 +00007550 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007551
7552 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7553 "-dylib_install_name");
7554 }
7555
7556 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7557 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7558 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007559 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007560 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007561 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7562 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7563 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7564 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7565 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7566 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007567 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007568 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7569 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7570 Args.AddAllArgs(CmdArgs, options::OPT_init);
7571
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007572 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007573 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007574
Daniel Dunbarc1964212009-03-26 16:23:12 +00007575 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7576 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7577 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7578 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7579 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007581 if (const Arg *A =
7582 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7583 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007584 if (A->getOption().matches(options::OPT_fpie) ||
7585 A->getOption().matches(options::OPT_fPIE))
7586 CmdArgs.push_back("-pie");
7587 else
7588 CmdArgs.push_back("-no_pie");
7589 }
Steven Wu574b0f22016-03-01 01:07:58 +00007590 // for embed-bitcode, use -bitcode_bundle in linker command
7591 if (C.getDriver().embedBitcodeEnabled() ||
7592 C.getDriver().embedBitcodeMarkerOnly()) {
7593 // Check if the toolchain supports bitcode build flow.
7594 if (MachOTC.SupportsEmbeddedBitcode())
7595 CmdArgs.push_back("-bitcode_bundle");
7596 else
7597 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7598 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007599
7600 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7601 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7602 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7603 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7604 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7605 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7606 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7607 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7608 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7609 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7610 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7611 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7612 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7613 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7614 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7615 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007616
Daniel Dunbar84384642011-05-02 21:03:47 +00007617 // Give --sysroot= preference, over the Apple specific behavior to also use
7618 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007619 StringRef sysroot = C.getSysRoot();
7620 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007621 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007622 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007623 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7624 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007625 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007626 }
7627
Daniel Dunbarc1964212009-03-26 16:23:12 +00007628 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7629 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7630 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7631 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7632 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007633 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007634 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7635 Args.AddAllArgs(CmdArgs, options::OPT_y);
7636 Args.AddLastArg(CmdArgs, options::OPT_w);
7637 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7638 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7639 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7640 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7641 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7642 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7643 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7644 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7645 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7646 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7647 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7648 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7649}
7650
Douglas Katzman95354292015-06-23 20:42:09 +00007651void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7652 const InputInfo &Output,
7653 const InputInfoList &Inputs,
7654 const ArgList &Args,
7655 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007656 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007657
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007658 // If the number of arguments surpasses the system limits, we will encode the
7659 // input files in a separate file, shortening the command line. To this end,
7660 // build a list of input file names that can be passed via a file with the
7661 // -filelist linker option.
7662 llvm::opt::ArgStringList InputFileList;
7663
Daniel Dunbarc1964212009-03-26 16:23:12 +00007664 // The logic here is derived from gcc's behavior; most of which
7665 // comes from specs (starting with link_command). Consult gcc for
7666 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007667 ArgStringList CmdArgs;
7668
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007669 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7670 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7671 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007672 for (const auto &Arg : Args)
7673 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007674 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007675 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007676 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007677 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007678 return;
7679 }
7680
Daniel Dunbarc1964212009-03-26 16:23:12 +00007681 // I'm not sure why this particular decomposition exists in gcc, but
7682 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007683 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007684
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007685 // It seems that the 'e' option is completely ignored for dynamic executables
7686 // (the default), and with static executables, the last one wins, as expected.
7687 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7688 options::OPT_Z_Flag, options::OPT_u_Group,
7689 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007690
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007691 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7692 // members of static archive libraries which implement Objective-C classes or
7693 // categories.
7694 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7695 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007696
Daniel Dunbarc1964212009-03-26 16:23:12 +00007697 CmdArgs.push_back("-o");
7698 CmdArgs.push_back(Output.getFilename());
7699
Douglas Katzman78b37b02015-11-17 20:28:07 +00007700 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007701 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007702
Peter Collingbournec4122c12015-06-15 21:08:13 +00007703 // SafeStack requires its own runtime libraries
7704 // These libraries should be linked first, to make sure the
7705 // __safestack_init constructor executes before everything else
7706 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7707 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7708 "libclang_rt.safestack_osx.a",
7709 /*AlwaysLink=*/true);
7710 }
7711
Daniel Dunbarc1964212009-03-26 16:23:12 +00007712 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007713
Douglas Gregor9295df02012-05-15 21:00:27 +00007714 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007715 // Build the input file for -filelist (list of linker input files) in case we
7716 // need it later
7717 for (const auto &II : Inputs) {
7718 if (!II.isFilename()) {
7719 // This is a linker input argument.
7720 // We cannot mix input arguments and file names in a -filelist input, thus
7721 // we prematurely stop our list (remaining files shall be passed as
7722 // arguments).
7723 if (InputFileList.size() > 0)
7724 break;
7725
7726 continue;
7727 }
7728
7729 InputFileList.push_back(II.getFilename());
7730 }
7731
Douglas Katzman78b37b02015-11-17 20:28:07 +00007732 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007733 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7734
Douglas Katzman78b37b02015-11-17 20:28:07 +00007735 if (isObjCRuntimeLinked(Args) &&
7736 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007737 // We use arclite library for both ARC and subscripting support.
7738 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7739
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007740 CmdArgs.push_back("-framework");
7741 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007742 // Link libobj.
7743 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007744 }
John McCall31168b02011-06-15 23:02:42 +00007745
Daniel Dunbarc1964212009-03-26 16:23:12 +00007746 if (LinkingOutput) {
7747 CmdArgs.push_back("-arch_multiple");
7748 CmdArgs.push_back("-final_output");
7749 CmdArgs.push_back(LinkingOutput);
7750 }
7751
Daniel Dunbarc1964212009-03-26 16:23:12 +00007752 if (Args.hasArg(options::OPT_fnested_functions))
7753 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007754
Justin Bognerc7701242015-05-12 05:44:36 +00007755 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7756
Douglas Katzman78b37b02015-11-17 20:28:07 +00007757 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007758 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007759 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007760
Daniel Dunbarc1964212009-03-26 16:23:12 +00007761 // link_ssp spec is empty.
7762
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007763 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007764 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007765 }
7766
Douglas Katzman78b37b02015-11-17 20:28:07 +00007767 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007768 // endfile_spec is empty.
7769 }
7770
7771 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7772 Args.AddAllArgs(CmdArgs, options::OPT_F);
7773
Steven Wu3ffb61b2015-02-06 18:08:29 +00007774 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007775 for (const Arg *A : Args.filtered(options::OPT_iframework))
7776 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007777
Douglas Katzman78b37b02015-11-17 20:28:07 +00007778 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007779 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7780 if (A->getValue() == StringRef("Accelerate")) {
7781 CmdArgs.push_back("-framework");
7782 CmdArgs.push_back("Accelerate");
7783 }
7784 }
7785 }
7786
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007787 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007788 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007789 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007790 Cmd->setInputFileList(std::move(InputFileList));
7791 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007792}
7793
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007794void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007795 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007796 const InputInfoList &Inputs,
7797 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007798 const char *LinkingOutput) const {
7799 ArgStringList CmdArgs;
7800
7801 CmdArgs.push_back("-create");
7802 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007803
7804 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007805 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007806
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007807 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007808 assert(II.isFilename() && "Unexpected lipo input.");
7809 CmdArgs.push_back(II.getFilename());
7810 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007811
7812 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007813 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007814}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007815
Daniel Dunbar88299622010-06-04 18:28:36 +00007816void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007817 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007818 const InputInfoList &Inputs,
7819 const ArgList &Args,
7820 const char *LinkingOutput) const {
7821 ArgStringList CmdArgs;
7822
Daniel Dunbareb86b042011-05-09 17:23:16 +00007823 CmdArgs.push_back("-o");
7824 CmdArgs.push_back(Output.getFilename());
7825
Daniel Dunbar88299622010-06-04 18:28:36 +00007826 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7827 const InputInfo &Input = Inputs[0];
7828 assert(Input.isFilename() && "Unexpected dsymutil input.");
7829 CmdArgs.push_back(Input.getFilename());
7830
Daniel Dunbar88299622010-06-04 18:28:36 +00007831 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007832 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007833 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007834}
7835
Eric Christopher551ef452011-08-23 17:56:55 +00007836void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007837 const InputInfo &Output,
7838 const InputInfoList &Inputs,
7839 const ArgList &Args,
7840 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007841 ArgStringList CmdArgs;
7842 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007843 CmdArgs.push_back("--debug-info");
7844 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007845 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007846
7847 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7848 const InputInfo &Input = Inputs[0];
7849 assert(Input.isFilename() && "Unexpected verify input");
7850
7851 // Grabbing the output of the earlier dsymutil run.
7852 CmdArgs.push_back(Input.getFilename());
7853
7854 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007855 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007856 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007857}
7858
Douglas Katzman95354292015-06-23 20:42:09 +00007859void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007860 const InputInfo &Output,
7861 const InputInfoList &Inputs,
7862 const ArgList &Args,
7863 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007864 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007865 ArgStringList CmdArgs;
7866
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007867 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007868
7869 CmdArgs.push_back("-o");
7870 CmdArgs.push_back(Output.getFilename());
7871
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007872 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007873 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007874
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007875 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007876 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007877}
7878
Douglas Katzman95354292015-06-23 20:42:09 +00007879void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7880 const InputInfo &Output,
7881 const InputInfoList &Inputs,
7882 const ArgList &Args,
7883 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007884 ArgStringList CmdArgs;
7885
David Chisnall272a0712012-02-29 15:06:12 +00007886 // Demangle C++ names in errors
7887 CmdArgs.push_back("-C");
7888
Douglas Katzman78b37b02015-11-17 20:28:07 +00007889 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007890 CmdArgs.push_back("-e");
7891 CmdArgs.push_back("_start");
7892 }
7893
7894 if (Args.hasArg(options::OPT_static)) {
7895 CmdArgs.push_back("-Bstatic");
7896 CmdArgs.push_back("-dn");
7897 } else {
7898 CmdArgs.push_back("-Bdynamic");
7899 if (Args.hasArg(options::OPT_shared)) {
7900 CmdArgs.push_back("-shared");
7901 } else {
7902 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007903 CmdArgs.push_back(
7904 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007905 }
7906 }
7907
7908 if (Output.isFilename()) {
7909 CmdArgs.push_back("-o");
7910 CmdArgs.push_back(Output.getFilename());
7911 } else {
7912 assert(Output.isNothing() && "Invalid output.");
7913 }
7914
Douglas Katzman78b37b02015-11-17 20:28:07 +00007915 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007916 if (!Args.hasArg(options::OPT_shared))
7917 CmdArgs.push_back(
7918 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7919
7920 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7921 CmdArgs.push_back(
7922 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7923 CmdArgs.push_back(
7924 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007925 }
7926
Douglas Katzman6059ef92015-11-17 17:41:23 +00007927 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007928
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007929 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7930 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007931
7932 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7933
Douglas Katzman78b37b02015-11-17 20:28:07 +00007934 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007935 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007936 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007937 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007938 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007939 if (!Args.hasArg(options::OPT_shared)) {
7940 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007941 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007942 }
David Chisnallf571cde2012-02-15 13:39:01 +00007943 }
7944
Douglas Katzman78b37b02015-11-17 20:28:07 +00007945 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007946 CmdArgs.push_back(
7947 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007948 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007949 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007950
Xinliang David Li69306c02015-10-22 06:15:31 +00007951 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007953 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007955}
7956
Douglas Katzman95354292015-06-23 20:42:09 +00007957void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7958 const InputInfo &Output,
7959 const InputInfoList &Inputs,
7960 const ArgList &Args,
7961 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007962 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007963 ArgStringList CmdArgs;
7964
Rafael Espindolacc126272014-02-28 01:55:21 +00007965 switch (getToolChain().getArch()) {
7966 case llvm::Triple::x86:
7967 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7968 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007969 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007970 break;
7971
7972 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007973 CmdArgs.push_back("-mppc");
7974 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007975 break;
7976
7977 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007978 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007979 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007980 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7981 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7982 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007983 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007984 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007985
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007986 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007987 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007988 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7989 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7990 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007991 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007992 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007993
7994 case llvm::Triple::mips64:
7995 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007996 StringRef CPUName;
7997 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007998 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007999
8000 CmdArgs.push_back("-mabi");
8001 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8002
8003 if (getToolChain().getArch() == llvm::Triple::mips64)
8004 CmdArgs.push_back("-EB");
8005 else
8006 CmdArgs.push_back("-EL");
8007
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008008 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00008009 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008010 }
8011
Rafael Espindolacc126272014-02-28 01:55:21 +00008012 default:
8013 break;
8014 }
8015
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008016 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008017
8018 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008019 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008020
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008021 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008022 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008024 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008025 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008026}
8027
Douglas Katzman95354292015-06-23 20:42:09 +00008028void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8029 const InputInfo &Output,
8030 const InputInfoList &Inputs,
8031 const ArgList &Args,
8032 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008033 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008034 ArgStringList CmdArgs;
8035
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00008036 // Silence warning for "clang -g foo.o -o foo"
8037 Args.ClaimAllArgs(options::OPT_g_Group);
8038 // and "clang -emit-llvm foo.o -o foo"
8039 Args.ClaimAllArgs(options::OPT_emit_llvm);
8040 // and for "clang -w foo.o -o foo". Other warning options are already
8041 // handled somewhere else.
8042 Args.ClaimAllArgs(options::OPT_w);
8043
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008044 if (getToolChain().getArch() == llvm::Triple::mips64)
8045 CmdArgs.push_back("-EB");
8046 else if (getToolChain().getArch() == llvm::Triple::mips64el)
8047 CmdArgs.push_back("-EL");
8048
Douglas Katzman78b37b02015-11-17 20:28:07 +00008049 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008050 CmdArgs.push_back("-e");
8051 CmdArgs.push_back("__start");
8052 }
8053
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008054 if (Args.hasArg(options::OPT_static)) {
8055 CmdArgs.push_back("-Bstatic");
8056 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008057 if (Args.hasArg(options::OPT_rdynamic))
8058 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008059 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008060 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008061 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008062 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008063 } else {
8064 CmdArgs.push_back("-dynamic-linker");
8065 CmdArgs.push_back("/usr/libexec/ld.so");
8066 }
8067 }
8068
Rafael Espindola044f7832013-06-05 04:28:55 +00008069 if (Args.hasArg(options::OPT_nopie))
8070 CmdArgs.push_back("-nopie");
8071
Daniel Dunbarb440f562010-08-02 02:38:21 +00008072 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008073 CmdArgs.push_back("-o");
8074 CmdArgs.push_back(Output.getFilename());
8075 } else {
8076 assert(Output.isNothing() && "Invalid output.");
8077 }
8078
Douglas Katzman78b37b02015-11-17 20:28:07 +00008079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008080 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008081 if (Args.hasArg(options::OPT_pg))
8082 CmdArgs.push_back(
8083 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008084 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008085 CmdArgs.push_back(
8086 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8087 CmdArgs.push_back(
8088 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008089 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008090 CmdArgs.push_back(
8091 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008092 }
8093 }
8094
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008095 std::string Triple = getToolChain().getTripleString();
8096 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008097 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008098 CmdArgs.push_back(
8099 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008100
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008101 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8102 options::OPT_e, options::OPT_s, options::OPT_t,
8103 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008104
Daniel Dunbar54423b22010-09-17 00:24:54 +00008105 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008106
Douglas Katzman78b37b02015-11-17 20:28:07 +00008107 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008108 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008109 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008110 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008111 CmdArgs.push_back("-lm_p");
8112 else
8113 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008114 }
8115
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008116 // FIXME: For some reason GCC passes -lgcc before adding
8117 // the default system libraries. Just mimic this for now.
8118 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008119
Eric Christopher17674ec2012-09-13 06:32:34 +00008120 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008121 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8122 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008123 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008124 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008125 }
8126
Chandler Carruth45661652011-12-17 22:32:42 +00008127 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008128 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008129 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008130 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008131 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008132 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008133
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008134 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008135 }
8136
Douglas Katzman78b37b02015-11-17 20:28:07 +00008137 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008138 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008139 CmdArgs.push_back(
8140 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008141 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008142 CmdArgs.push_back(
8143 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008144 }
8145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008146 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008147 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008148}
Ed Schoutene33194b2009-04-02 19:13:12 +00008149
Douglas Katzman95354292015-06-23 20:42:09 +00008150void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8151 const InputInfo &Output,
8152 const InputInfoList &Inputs,
8153 const ArgList &Args,
8154 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008155 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008156 ArgStringList CmdArgs;
8157
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008158 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008159
8160 CmdArgs.push_back("-o");
8161 CmdArgs.push_back(Output.getFilename());
8162
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008163 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008164 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008165
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008166 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008167 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008168}
8169
Douglas Katzman95354292015-06-23 20:42:09 +00008170void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8171 const InputInfo &Output,
8172 const InputInfoList &Inputs,
8173 const ArgList &Args,
8174 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008175 const Driver &D = getToolChain().getDriver();
8176 ArgStringList CmdArgs;
8177
Douglas Katzman78b37b02015-11-17 20:28:07 +00008178 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008179 CmdArgs.push_back("-e");
8180 CmdArgs.push_back("__start");
8181 }
8182
8183 if (Args.hasArg(options::OPT_static)) {
8184 CmdArgs.push_back("-Bstatic");
8185 } else {
8186 if (Args.hasArg(options::OPT_rdynamic))
8187 CmdArgs.push_back("-export-dynamic");
8188 CmdArgs.push_back("--eh-frame-hdr");
8189 CmdArgs.push_back("-Bdynamic");
8190 if (Args.hasArg(options::OPT_shared)) {
8191 CmdArgs.push_back("-shared");
8192 } else {
8193 CmdArgs.push_back("-dynamic-linker");
8194 CmdArgs.push_back("/usr/libexec/ld.so");
8195 }
8196 }
8197
8198 if (Output.isFilename()) {
8199 CmdArgs.push_back("-o");
8200 CmdArgs.push_back(Output.getFilename());
8201 } else {
8202 assert(Output.isNothing() && "Invalid output.");
8203 }
8204
Douglas Katzman78b37b02015-11-17 20:28:07 +00008205 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008206 if (!Args.hasArg(options::OPT_shared)) {
8207 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008208 CmdArgs.push_back(
8209 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008210 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008211 CmdArgs.push_back(
8212 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8213 CmdArgs.push_back(
8214 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008215 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008216 CmdArgs.push_back(
8217 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008218 }
8219 }
8220
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008221 Args.AddAllArgs(CmdArgs,
8222 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008223
8224 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8225
Douglas Katzman78b37b02015-11-17 20:28:07 +00008226 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008227 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008228 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8229 if (Args.hasArg(options::OPT_pg))
8230 CmdArgs.push_back("-lm_p");
8231 else
8232 CmdArgs.push_back("-lm");
8233 }
8234
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008235 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008236 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008237 CmdArgs.push_back("-lpthread_p");
8238 else
8239 CmdArgs.push_back("-lpthread");
8240 }
8241
Eli Friedman9fa28852012-08-08 23:57:20 +00008242 if (!Args.hasArg(options::OPT_shared)) {
8243 if (Args.hasArg(options::OPT_pg))
8244 CmdArgs.push_back("-lc_p");
8245 else
8246 CmdArgs.push_back("-lc");
8247 }
8248
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008249 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008250 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008251 case llvm::Triple::arm:
8252 MyArch = "arm";
8253 break;
8254 case llvm::Triple::x86:
8255 MyArch = "i386";
8256 break;
8257 case llvm::Triple::x86_64:
8258 MyArch = "amd64";
8259 break;
8260 default:
8261 llvm_unreachable("Unsupported architecture");
8262 }
8263 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008264 }
8265
Douglas Katzman78b37b02015-11-17 20:28:07 +00008266 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008267 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008268 CmdArgs.push_back(
8269 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008270 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008271 CmdArgs.push_back(
8272 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008273 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008274
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008275 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008276 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008277}
8278
Douglas Katzman95354292015-06-23 20:42:09 +00008279void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8280 const InputInfo &Output,
8281 const InputInfoList &Inputs,
8282 const ArgList &Args,
8283 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008284 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008285 ArgStringList CmdArgs;
8286
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008287 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8288 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008289 switch (getToolChain().getArch()) {
8290 default:
8291 break;
8292 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008293 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008294 break;
8295 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008296 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008297 break;
8298 case llvm::Triple::mips:
8299 case llvm::Triple::mipsel:
8300 case llvm::Triple::mips64:
8301 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008302 StringRef CPUName;
8303 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008304 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008305
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008306 CmdArgs.push_back("-march");
8307 CmdArgs.push_back(CPUName.data());
8308
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008309 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008310 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008311
8312 if (getToolChain().getArch() == llvm::Triple::mips ||
8313 getToolChain().getArch() == llvm::Triple::mips64)
8314 CmdArgs.push_back("-EB");
8315 else
8316 CmdArgs.push_back("-EL");
8317
Dimitry Andric46f338c2015-12-27 10:36:44 +00008318 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8319 StringRef v = A->getValue();
8320 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8321 A->claim();
8322 }
8323
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008324 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008325 break;
8326 }
8327 case llvm::Triple::arm:
8328 case llvm::Triple::armeb:
8329 case llvm::Triple::thumb:
8330 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008331 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008332
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008333 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008334 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008335 else
Renato Golinf4421f72014-02-19 10:44:07 +00008336 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008338 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008339 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008340 case llvm::Triple::GNUEABI:
8341 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008342 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008343 break;
8344
8345 default:
8346 CmdArgs.push_back("-matpcs");
8347 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008348 break;
8349 }
8350 case llvm::Triple::sparc:
8351 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008352 case llvm::Triple::sparcv9: {
8353 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8354 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008355 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008356 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008357 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008358 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008359
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008360 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008361
8362 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008363 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008364
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008365 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008366 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008367
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008368 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008369 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008370}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008371
Douglas Katzman95354292015-06-23 20:42:09 +00008372void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8373 const InputInfo &Output,
8374 const InputInfoList &Inputs,
8375 const ArgList &Args,
8376 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008377 const toolchains::FreeBSD &ToolChain =
8378 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008379 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008380 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008381 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008382 !Args.hasArg(options::OPT_shared) &&
8383 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008384 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008385
8386 // Silence warning for "clang -g foo.o -o foo"
8387 Args.ClaimAllArgs(options::OPT_g_Group);
8388 // and "clang -emit-llvm foo.o -o foo"
8389 Args.ClaimAllArgs(options::OPT_emit_llvm);
8390 // and for "clang -w foo.o -o foo". Other warning options are already
8391 // handled somewhere else.
8392 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008393
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008394 if (!D.SysRoot.empty())
8395 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8396
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008397 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008398 CmdArgs.push_back("-pie");
8399
Ed Maste1bc232d2016-04-12 21:11:46 +00008400 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008401 if (Args.hasArg(options::OPT_static)) {
8402 CmdArgs.push_back("-Bstatic");
8403 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008404 if (Args.hasArg(options::OPT_rdynamic))
8405 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008406 if (Args.hasArg(options::OPT_shared)) {
8407 CmdArgs.push_back("-Bshareable");
8408 } else {
8409 CmdArgs.push_back("-dynamic-linker");
8410 CmdArgs.push_back("/libexec/ld-elf.so.1");
8411 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008412 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008413 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8414 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8415 CmdArgs.push_back("--hash-style=both");
8416 }
8417 }
8418 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008419 }
8420
8421 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8422 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008423 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008424 CmdArgs.push_back("-m");
8425 CmdArgs.push_back("elf_i386_fbsd");
8426 }
8427
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008428 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008429 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008430 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008431 }
8432
Dimitry Andric904895f2015-12-27 06:47:09 +00008433 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8434 if (ToolChain.getArch() == llvm::Triple::mips ||
8435 ToolChain.getArch() == llvm::Triple::mipsel ||
8436 ToolChain.getArch() == llvm::Triple::mips64 ||
8437 ToolChain.getArch() == llvm::Triple::mips64el) {
8438 StringRef v = A->getValue();
8439 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8440 A->claim();
8441 }
8442 }
8443
Daniel Dunbarb440f562010-08-02 02:38:21 +00008444 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008445 CmdArgs.push_back("-o");
8446 CmdArgs.push_back(Output.getFilename());
8447 } else {
8448 assert(Output.isNothing() && "Invalid output.");
8449 }
8450
Douglas Katzman78b37b02015-11-17 20:28:07 +00008451 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008452 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008453 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008454 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008455 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008456 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008457 crt1 = "Scrt1.o";
8458 else
8459 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008460 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008461 if (crt1)
8462 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8463
8464 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8465
Craig Topper92fc2df2014-05-17 16:56:41 +00008466 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008467 if (Args.hasArg(options::OPT_static))
8468 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008469 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008470 crtbegin = "crtbeginS.o";
8471 else
8472 crtbegin = "crtbegin.o";
8473
8474 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008475 }
8476
8477 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008478 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008479 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8480 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008481 Args.AddAllArgs(CmdArgs, options::OPT_s);
8482 Args.AddAllArgs(CmdArgs, options::OPT_t);
8483 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8484 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008485
Teresa Johnson945bc502015-10-15 20:35:53 +00008486 if (D.isUsingLTO())
8487 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008488
Alexey Samsonov52550342014-09-15 19:58:40 +00008489 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008490 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008491
Douglas Katzman78b37b02015-11-17 20:28:07 +00008492 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008493 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008494 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008495 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008496 if (Args.hasArg(options::OPT_pg))
8497 CmdArgs.push_back("-lm_p");
8498 else
8499 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008500 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008501 if (NeedsSanitizerDeps)
8502 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008503 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8504 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008505 if (Args.hasArg(options::OPT_pg))
8506 CmdArgs.push_back("-lgcc_p");
8507 else
8508 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008509 if (Args.hasArg(options::OPT_static)) {
8510 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008511 } else if (Args.hasArg(options::OPT_pg)) {
8512 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008513 } else {
8514 CmdArgs.push_back("--as-needed");
8515 CmdArgs.push_back("-lgcc_s");
8516 CmdArgs.push_back("--no-as-needed");
8517 }
8518
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008519 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008520 if (Args.hasArg(options::OPT_pg))
8521 CmdArgs.push_back("-lpthread_p");
8522 else
8523 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008524 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008525
Roman Divacky66f22762011-02-10 16:59:40 +00008526 if (Args.hasArg(options::OPT_pg)) {
8527 if (Args.hasArg(options::OPT_shared))
8528 CmdArgs.push_back("-lc");
8529 else
8530 CmdArgs.push_back("-lc_p");
8531 CmdArgs.push_back("-lgcc_p");
8532 } else {
8533 CmdArgs.push_back("-lc");
8534 CmdArgs.push_back("-lgcc");
8535 }
8536
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008537 if (Args.hasArg(options::OPT_static)) {
8538 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008539 } else if (Args.hasArg(options::OPT_pg)) {
8540 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008541 } else {
8542 CmdArgs.push_back("--as-needed");
8543 CmdArgs.push_back("-lgcc_s");
8544 CmdArgs.push_back("--no-as-needed");
8545 }
8546 }
8547
Douglas Katzman78b37b02015-11-17 20:28:07 +00008548 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008549 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008550 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008551 else
8552 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008554 }
8555
Xinliang David Li69306c02015-10-22 06:15:31 +00008556 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008557
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008558 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008559 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008560}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008561
Douglas Katzman95354292015-06-23 20:42:09 +00008562void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008563 const InputInfo &Output,
8564 const InputInfoList &Inputs,
8565 const ArgList &Args,
8566 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008567 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008568 ArgStringList CmdArgs;
8569
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008570 // GNU as needs different flags for creating the correct output format
8571 // on architectures with different ABIs or optional feature sets.
8572 switch (getToolChain().getArch()) {
8573 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008574 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008575 break;
8576 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008577 case llvm::Triple::armeb:
8578 case llvm::Triple::thumb:
8579 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008580 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008581 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8582 std::string Arch =
8583 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008584 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008585 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008586 }
8587
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008588 case llvm::Triple::mips:
8589 case llvm::Triple::mipsel:
8590 case llvm::Triple::mips64:
8591 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008592 StringRef CPUName;
8593 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008594 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008595
8596 CmdArgs.push_back("-march");
8597 CmdArgs.push_back(CPUName.data());
8598
8599 CmdArgs.push_back("-mabi");
8600 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8601
8602 if (getToolChain().getArch() == llvm::Triple::mips ||
8603 getToolChain().getArch() == llvm::Triple::mips64)
8604 CmdArgs.push_back("-EB");
8605 else
8606 CmdArgs.push_back("-EL");
8607
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008608 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008609 break;
8610 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008611
8612 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008613 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008614 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008615 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8616 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008617 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008618 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008619 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008620
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008621 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008622 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008623 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8624 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008626 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008627 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008628
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008629 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008630 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008631 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008632
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008633 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008634
8635 CmdArgs.push_back("-o");
8636 CmdArgs.push_back(Output.getFilename());
8637
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008638 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008639 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008640
David Chisnallddbd68f2011-09-27 22:03:18 +00008641 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008642 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008643}
8644
Douglas Katzman95354292015-06-23 20:42:09 +00008645void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8646 const InputInfo &Output,
8647 const InputInfoList &Inputs,
8648 const ArgList &Args,
8649 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008650 const Driver &D = getToolChain().getDriver();
8651 ArgStringList CmdArgs;
8652
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008653 if (!D.SysRoot.empty())
8654 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8655
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008656 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008657 if (Args.hasArg(options::OPT_static)) {
8658 CmdArgs.push_back("-Bstatic");
8659 } else {
8660 if (Args.hasArg(options::OPT_rdynamic))
8661 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008662 if (Args.hasArg(options::OPT_shared)) {
8663 CmdArgs.push_back("-Bshareable");
8664 } else {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008665 Args.AddAllArgs(CmdArgs, options::OPT_pie);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008666 CmdArgs.push_back("-dynamic-linker");
8667 CmdArgs.push_back("/libexec/ld.elf_so");
8668 }
8669 }
8670
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008671 // Many NetBSD architectures support more than one ABI.
8672 // Determine the correct emulation for ld.
8673 switch (getToolChain().getArch()) {
8674 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008675 CmdArgs.push_back("-m");
8676 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008677 break;
8678 case llvm::Triple::arm:
8679 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008680 CmdArgs.push_back("-m");
8681 switch (getToolChain().getTriple().getEnvironment()) {
8682 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008683 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008684 CmdArgs.push_back("armelf_nbsd_eabi");
8685 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008686 case llvm::Triple::EABIHF:
8687 case llvm::Triple::GNUEABIHF:
8688 CmdArgs.push_back("armelf_nbsd_eabihf");
8689 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008690 default:
8691 CmdArgs.push_back("armelf_nbsd");
8692 break;
8693 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008694 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008695 case llvm::Triple::armeb:
8696 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008697 arm::appendEBLinkFlags(
8698 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008699 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008700 CmdArgs.push_back("-m");
8701 switch (getToolChain().getTriple().getEnvironment()) {
8702 case llvm::Triple::EABI:
8703 case llvm::Triple::GNUEABI:
8704 CmdArgs.push_back("armelfb_nbsd_eabi");
8705 break;
8706 case llvm::Triple::EABIHF:
8707 case llvm::Triple::GNUEABIHF:
8708 CmdArgs.push_back("armelfb_nbsd_eabihf");
8709 break;
8710 default:
8711 CmdArgs.push_back("armelfb_nbsd");
8712 break;
8713 }
8714 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008715 case llvm::Triple::mips64:
8716 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008717 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008718 CmdArgs.push_back("-m");
8719 if (getToolChain().getArch() == llvm::Triple::mips64)
8720 CmdArgs.push_back("elf32btsmip");
8721 else
8722 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008723 } else if (mips::hasMipsAbiArg(Args, "64")) {
8724 CmdArgs.push_back("-m");
8725 if (getToolChain().getArch() == llvm::Triple::mips64)
8726 CmdArgs.push_back("elf64btsmip");
8727 else
8728 CmdArgs.push_back("elf64ltsmip");
8729 }
8730 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008731 case llvm::Triple::ppc:
8732 CmdArgs.push_back("-m");
8733 CmdArgs.push_back("elf32ppc_nbsd");
8734 break;
8735
8736 case llvm::Triple::ppc64:
8737 case llvm::Triple::ppc64le:
8738 CmdArgs.push_back("-m");
8739 CmdArgs.push_back("elf64ppc");
8740 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008741
8742 case llvm::Triple::sparc:
8743 CmdArgs.push_back("-m");
8744 CmdArgs.push_back("elf32_sparc");
8745 break;
8746
8747 case llvm::Triple::sparcv9:
8748 CmdArgs.push_back("-m");
8749 CmdArgs.push_back("elf64_sparc");
8750 break;
8751
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008752 default:
8753 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008754 }
8755
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008756 if (Output.isFilename()) {
8757 CmdArgs.push_back("-o");
8758 CmdArgs.push_back(Output.getFilename());
8759 } else {
8760 assert(Output.isNothing() && "Invalid output.");
8761 }
8762
Douglas Katzman78b37b02015-11-17 20:28:07 +00008763 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008764 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008765 CmdArgs.push_back(
8766 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008767 }
8768 CmdArgs.push_back(
8769 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8770 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008771 CmdArgs.push_back(
8772 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008773 } else {
8774 CmdArgs.push_back(
8775 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008776 }
8777 }
8778
8779 Args.AddAllArgs(CmdArgs, options::OPT_L);
8780 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8781 Args.AddAllArgs(CmdArgs, options::OPT_e);
8782 Args.AddAllArgs(CmdArgs, options::OPT_s);
8783 Args.AddAllArgs(CmdArgs, options::OPT_t);
8784 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8785 Args.AddAllArgs(CmdArgs, options::OPT_r);
8786
8787 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8788
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008789 unsigned Major, Minor, Micro;
8790 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8791 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008792 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008793 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008794 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008795 case llvm::Triple::arm:
8796 case llvm::Triple::armeb:
8797 case llvm::Triple::thumb:
8798 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008799 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008800 case llvm::Triple::ppc64:
8801 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008802 case llvm::Triple::sparc:
8803 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008804 case llvm::Triple::x86:
8805 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008806 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008807 break;
8808 default:
8809 break;
8810 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008811 }
8812
Douglas Katzman78b37b02015-11-17 20:28:07 +00008813 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008814 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008815 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008816 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8817 CmdArgs.push_back("-lm");
8818 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008819 if (Args.hasArg(options::OPT_pthread))
8820 CmdArgs.push_back("-lpthread");
8821 CmdArgs.push_back("-lc");
8822
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008823 if (useLibgcc) {
8824 if (Args.hasArg(options::OPT_static)) {
8825 // libgcc_eh depends on libc, so resolve as much as possible,
8826 // pull in any new requirements from libc and then get the rest
8827 // of libgcc.
8828 CmdArgs.push_back("-lgcc_eh");
8829 CmdArgs.push_back("-lc");
8830 CmdArgs.push_back("-lgcc");
8831 } else {
8832 CmdArgs.push_back("-lgcc");
8833 CmdArgs.push_back("--as-needed");
8834 CmdArgs.push_back("-lgcc_s");
8835 CmdArgs.push_back("--no-as-needed");
8836 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008837 }
8838 }
8839
Douglas Katzman78b37b02015-11-17 20:28:07 +00008840 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008841 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008842 CmdArgs.push_back(
8843 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008844 else
8845 CmdArgs.push_back(
8846 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008847 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008848 }
8849
Xinliang David Li69306c02015-10-22 06:15:31 +00008850 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008851
Logan Chieneb9162f2014-06-26 14:23:45 +00008852 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008853 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008854}
8855
Douglas Katzman95354292015-06-23 20:42:09 +00008856void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8857 const InputInfo &Output,
8858 const InputInfoList &Inputs,
8859 const ArgList &Args,
8860 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008861 claimNoWarnArgs(Args);
8862
James Y Knight2db38f32015-08-15 03:45:25 +00008863 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8864 llvm::Triple Triple = llvm::Triple(TripleStr);
8865
Rafael Espindola92b00932010-08-10 00:25:48 +00008866 ArgStringList CmdArgs;
8867
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008868 llvm::Reloc::Model RelocationModel;
8869 unsigned PICLevel;
8870 bool IsPIE;
8871 std::tie(RelocationModel, PICLevel, IsPIE) =
8872 ParsePICArgs(getToolChain(), Triple, Args);
8873
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008874 switch (getToolChain().getArch()) {
8875 default:
8876 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008877 // Add --32/--64 to make sure we get the format we want.
8878 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008879 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008880 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008881 break;
8882 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008883 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8884 CmdArgs.push_back("--x32");
8885 else
8886 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008887 break;
8888 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008889 CmdArgs.push_back("-a32");
8890 CmdArgs.push_back("-mppc");
8891 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008892 break;
8893 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008894 CmdArgs.push_back("-a64");
8895 CmdArgs.push_back("-mppc64");
8896 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008897 break;
8898 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008899 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008900 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008901 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008902 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008903 break;
8904 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008905 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008906 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008907 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8908 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8909 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008910 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008911 }
8912 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008913 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008914 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8915 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8916 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008917 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008918 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008919 case llvm::Triple::arm:
8920 case llvm::Triple::armeb:
8921 case llvm::Triple::thumb:
8922 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008923 const llvm::Triple &Triple2 = getToolChain().getTriple();
8924 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008925 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008926 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008927 break;
8928 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008929 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008930 break;
8931 default:
8932 break;
8933 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008934
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008935 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008936 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8937 case arm::FloatABI::Soft:
8938 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8939 break;
8940 case arm::FloatABI::SoftFP:
8941 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8942 break;
8943 case arm::FloatABI::Hard:
8944 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8945 break;
8946 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008947
8948 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008949
8950 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008951 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008952 // march from being picked in the absence of a cpu flag.
8953 Arg *A;
8954 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008955 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008956 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008957 else
8958 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008959 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008960 break;
8961 }
8962 case llvm::Triple::mips:
8963 case llvm::Triple::mipsel:
8964 case llvm::Triple::mips64:
8965 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008966 StringRef CPUName;
8967 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008968 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008969 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008970
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008971 CmdArgs.push_back("-march");
8972 CmdArgs.push_back(CPUName.data());
8973
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008974 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008975 CmdArgs.push_back(ABIName.data());
8976
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008977 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8978 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008979 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008980 CmdArgs.push_back("-mno-shared");
8981
Daniel Sanders379d44b2014-07-16 11:52:23 +00008982 // LLVM doesn't support -mplt yet and acts as if it is always given.
8983 // However, -mplt has no effect with the N64 ABI.
8984 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008985
8986 if (getToolChain().getArch() == llvm::Triple::mips ||
8987 getToolChain().getArch() == llvm::Triple::mips64)
8988 CmdArgs.push_back("-EB");
8989 else
8990 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008991
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008992 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8993 if (StringRef(A->getValue()) == "2008")
8994 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8995 }
8996
Daniel Sanders379d44b2014-07-16 11:52:23 +00008997 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8998 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8999 options::OPT_mfp64)) {
9000 A->claim();
9001 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00009002 } else if (mips::shouldUseFPXX(
9003 Args, getToolChain().getTriple(), CPUName, ABIName,
9004 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00009005 CmdArgs.push_back("-mfpxx");
9006
9007 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
9008 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 if (Arg *A =
9010 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00009011 if (A->getOption().matches(options::OPT_mips16)) {
9012 A->claim();
9013 A->render(Args, CmdArgs);
9014 } else {
9015 A->claim();
9016 CmdArgs.push_back("-no-mips16");
9017 }
9018 }
9019
Simon Atanasyan036d16d2013-04-30 07:47:13 +00009020 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
9021 options::OPT_mno_micromips);
9022 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
9023 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
9024
Simon Atanasyanbd986632013-11-26 11:58:04 +00009025 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
9026 // Do not use AddLastArg because not all versions of MIPS assembler
9027 // support -mmsa / -mno-msa options.
9028 if (A->getOption().matches(options::OPT_mmsa))
9029 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
9030 }
9031
Daniel Sanders379d44b2014-07-16 11:52:23 +00009032 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
9033 options::OPT_msoft_float);
9034
Toma Tabacub36d6102015-06-11 12:13:18 +00009035 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
9036 options::OPT_msingle_float);
9037
Daniel Sanders379d44b2014-07-16 11:52:23 +00009038 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
9039 options::OPT_mno_odd_spreg);
9040
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009041 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009042 break;
9043 }
9044 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009045 // Always pass an -march option, since our default of z10 is later
9046 // than the GNU assembler's default.
9047 StringRef CPUName = getSystemZTargetCPU(Args);
9048 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009049 break;
9050 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009051 }
9052
Renato Golina74bbc72015-07-22 15:32:36 +00009053 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009054 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00009055
9056 CmdArgs.push_back("-o");
9057 CmdArgs.push_back(Output.getFilename());
9058
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009059 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00009060 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00009061
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009062 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009063 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00009064
9065 // Handle the debug info splitting at object creation time if we're
9066 // creating an object.
9067 // TODO: Currently only works on linux with newer objcopy.
9068 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00009069 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00009070 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00009071 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009072}
9073
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009074static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009075 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009076 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009077 bool isCygMing = Triple.isOSCygMing();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009078 bool IsIAMCU = Triple.isOSIAMCU();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009079 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9080 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009081 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009082 CmdArgs.push_back("-lgcc");
9083
Logan Chien3d3373c2012-11-19 12:04:11 +00009084 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009085 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009086 CmdArgs.push_back("-lgcc");
9087 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009088 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009089 CmdArgs.push_back("--as-needed");
9090 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009091 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009092 CmdArgs.push_back("--no-as-needed");
9093 }
9094
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009095 if (StaticLibgcc && !isAndroid && !IsIAMCU)
Rafael Espindolacc354322011-10-17 21:39:04 +00009096 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009097 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009098 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009099
9100 // According to Android ABI, we have to link with libdl if we are
9101 // linking with non-static libgcc.
9102 //
9103 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9104 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9105 if (isAndroid && !StaticLibgcc)
9106 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009107}
9108
Renato Golinc4b49242014-02-13 10:01:16 +00009109static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009110 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009111 // Make use of compiler-rt if --rtlib option is used
9112 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9113
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009114 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009115 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009116 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009117 default:
9118 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009119 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009120 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009121 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009122 break;
9123 }
Renato Golinc4b49242014-02-13 10:01:16 +00009124 break;
9125 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009126 // Make sure libgcc is not used under MSVC environment by default
9127 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9128 // Issue error diagnostic if libgcc is explicitly specified
9129 // through command line as --rtlib option argument.
9130 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9131 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9132 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9133 }
9134 } else
9135 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009136 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009137 }
9138}
9139
Rafael Espindola1e085772014-08-15 17:14:35 +00009140static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9141 switch (T.getArch()) {
9142 case llvm::Triple::x86:
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009143 if (T.isOSIAMCU())
9144 return "elf_iamcu";
Rafael Espindola1e085772014-08-15 17:14:35 +00009145 return "elf_i386";
9146 case llvm::Triple::aarch64:
9147 return "aarch64linux";
9148 case llvm::Triple::aarch64_be:
9149 return "aarch64_be_linux";
9150 case llvm::Triple::arm:
9151 case llvm::Triple::thumb:
9152 return "armelf_linux_eabi";
9153 case llvm::Triple::armeb:
9154 case llvm::Triple::thumbeb:
Strahinja Petrovicb8598962016-06-10 16:09:20 +00009155 return "armelfb_linux_eabi";
Rafael Espindola1e085772014-08-15 17:14:35 +00009156 case llvm::Triple::ppc:
9157 return "elf32ppclinux";
9158 case llvm::Triple::ppc64:
9159 return "elf64ppc";
9160 case llvm::Triple::ppc64le:
9161 return "elf64lppc";
9162 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009163 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009164 return "elf32_sparc";
9165 case llvm::Triple::sparcv9:
9166 return "elf64_sparc";
9167 case llvm::Triple::mips:
9168 return "elf32btsmip";
9169 case llvm::Triple::mipsel:
9170 return "elf32ltsmip";
9171 case llvm::Triple::mips64:
9172 if (mips::hasMipsAbiArg(Args, "n32"))
9173 return "elf32btsmipn32";
9174 return "elf64btsmip";
9175 case llvm::Triple::mips64el:
9176 if (mips::hasMipsAbiArg(Args, "n32"))
9177 return "elf32ltsmipn32";
9178 return "elf64ltsmip";
9179 case llvm::Triple::systemz:
9180 return "elf64_s390";
9181 case llvm::Triple::x86_64:
9182 if (T.getEnvironment() == llvm::Triple::GNUX32)
9183 return "elf32_x86_64";
9184 return "elf_x86_64";
9185 default:
9186 llvm_unreachable("Unexpected arch");
9187 }
9188}
9189
Douglas Katzman95354292015-06-23 20:42:09 +00009190void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9191 const InputInfo &Output,
9192 const InputInfoList &Inputs,
9193 const ArgList &Args,
9194 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009195 const toolchains::Linux &ToolChain =
9196 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009197 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009198
9199 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9200 llvm::Triple Triple = llvm::Triple(TripleStr);
9201
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009202 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009203 const bool isAndroid = ToolChain.getTriple().isAndroid();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009204 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009205 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009206 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9207 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009208 const bool HasCRTBeginEndFiles =
9209 ToolChain.getTriple().hasEnvironment() ||
9210 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009211
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009212 ArgStringList CmdArgs;
9213
Rafael Espindolad1002f62010-11-15 18:28:16 +00009214 // Silence warning for "clang -g foo.o -o foo"
9215 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009216 // and "clang -emit-llvm foo.o -o foo"
9217 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009218 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009219 // handled somewhere else.
9220 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009221
Peter Collingbourne39719a72015-11-20 20:49:39 +00009222 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9223 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009224 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009225 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009226 CmdArgs.push_back("-target");
9227 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9228 }
9229
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009230 if (!D.SysRoot.empty())
9231 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009232
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009233 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009234 CmdArgs.push_back("-pie");
9235
Rafael Espindola1c76c592010-11-07 22:57:16 +00009236 if (Args.hasArg(options::OPT_rdynamic))
9237 CmdArgs.push_back("-export-dynamic");
9238
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009239 if (Args.hasArg(options::OPT_s))
9240 CmdArgs.push_back("-s");
9241
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009242 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009243 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009244
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009245 for (const auto &Opt : ToolChain.ExtraOpts)
9246 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009247
9248 if (!Args.hasArg(options::OPT_static)) {
9249 CmdArgs.push_back("--eh-frame-hdr");
9250 }
9251
9252 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009253 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009254
9255 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009256 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9257 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009258 CmdArgs.push_back("-Bstatic");
9259 else
9260 CmdArgs.push_back("-static");
9261 } else if (Args.hasArg(options::OPT_shared)) {
9262 CmdArgs.push_back("-shared");
9263 }
9264
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009265 if (!Args.hasArg(options::OPT_static)) {
9266 if (Args.hasArg(options::OPT_rdynamic))
9267 CmdArgs.push_back("-export-dynamic");
9268
9269 if (!Args.hasArg(options::OPT_shared)) {
9270 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009271 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009272 CmdArgs.push_back("-dynamic-linker");
9273 CmdArgs.push_back(Args.MakeArgString(Loader));
9274 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009275 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009276
9277 CmdArgs.push_back("-o");
9278 CmdArgs.push_back(Output.getFilename());
9279
Douglas Katzman78b37b02015-11-17 20:28:07 +00009280 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009281 if (!isAndroid && !IsIAMCU) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009282 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009283 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009284 if (Args.hasArg(options::OPT_pg))
9285 crt1 = "gcrt1.o";
9286 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009287 crt1 = "Scrt1.o";
9288 else
9289 crt1 = "crt1.o";
9290 }
9291 if (crt1)
9292 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009293
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009294 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9295 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009296
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009297 if (IsIAMCU)
9298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
9299 else {
9300 const char *crtbegin;
9301 if (Args.hasArg(options::OPT_static))
9302 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
9303 else if (Args.hasArg(options::OPT_shared))
9304 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
9305 else if (IsPIE)
9306 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
9307 else
9308 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009309
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009310 if (HasCRTBeginEndFiles)
9311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9312 }
Benjamin Kramer058666a2012-10-04 19:42:20 +00009313
9314 // Add crtfastmath.o if available and fast math is enabled.
9315 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009316 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009317
9318 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009319 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009320
Douglas Katzman6059ef92015-11-17 17:41:23 +00009321 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009322
Teresa Johnson945bc502015-10-15 20:35:53 +00009323 if (D.isUsingLTO())
9324 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009325
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009326 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9327 CmdArgs.push_back("--no-demangle");
9328
Alexey Samsonov52550342014-09-15 19:58:40 +00009329 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009330 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009331 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009332 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009333
Douglas Katzman78b37b02015-11-17 20:28:07 +00009334 if (D.CCCIsCXX() &&
9335 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009336 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009337 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009338 if (OnlyLibstdcxxStatic)
9339 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009340 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009341 if (OnlyLibstdcxxStatic)
9342 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009343 CmdArgs.push_back("-lm");
9344 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009345 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9346 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009347
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009348 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009349 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9350 if (Args.hasArg(options::OPT_static))
9351 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009352
Alexey Samsonov52550342014-09-15 19:58:40 +00009353 if (NeedsSanitizerDeps)
9354 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9355
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009356 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9357 Args.hasArg(options::OPT_pthreads);
9358
9359 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9360 options::OPT_fno_openmp, false)) {
9361 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9362 // FIXME: Does this really make sense for all GNU toolchains?
9363 WantPthread = true;
9364
9365 // Also link the particular OpenMP runtimes.
9366 switch (getOpenMPRuntime(ToolChain, Args)) {
9367 case OMPRT_OMP:
9368 CmdArgs.push_back("-lomp");
9369 break;
9370 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009371 CmdArgs.push_back("-lgomp");
9372
9373 // FIXME: Exclude this for platforms with libgomp that don't require
9374 // librt. Most modern Linux platforms require it, but some may not.
9375 CmdArgs.push_back("-lrt");
9376 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009377 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009378 CmdArgs.push_back("-liomp5");
9379 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009380 case OMPRT_Unknown:
9381 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009382 break;
9383 }
Chandler Carruth01538002013-01-17 13:19:29 +00009384 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009385
Renato Golinc4b49242014-02-13 10:01:16 +00009386 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009387
Richard Smith31d1de22015-05-20 22:48:44 +00009388 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009389 CmdArgs.push_back("-lpthread");
9390
Rafael Espindolab17bc532016-01-25 18:29:16 +00009391 if (Args.hasArg(options::OPT_fsplit_stack))
9392 CmdArgs.push_back("--wrap=pthread_create");
9393
Chandler Carruth94a32012012-05-14 18:31:18 +00009394 CmdArgs.push_back("-lc");
9395
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009396 // Add IAMCU specific libs, if needed.
9397 if (IsIAMCU)
9398 CmdArgs.push_back("-lgloss");
9399
Chandler Carruth94a32012012-05-14 18:31:18 +00009400 if (Args.hasArg(options::OPT_static))
9401 CmdArgs.push_back("--end-group");
9402 else
Renato Golinc4b49242014-02-13 10:01:16 +00009403 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009404
9405 // Add IAMCU specific libs (outside the group), if needed.
9406 if (IsIAMCU) {
9407 CmdArgs.push_back("--as-needed");
9408 CmdArgs.push_back("-lsoftfp");
9409 CmdArgs.push_back("--no-as-needed");
9410 }
Chandler Carruth94a32012012-05-14 18:31:18 +00009411 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009412
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009413 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
Rafael Espindola81937ec2010-12-01 01:52:43 +00009414 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009415 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009416 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009417 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009418 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009419 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009420 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009421
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009422 if (HasCRTBeginEndFiles)
9423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009424 if (!isAndroid)
9425 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009426 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009427 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009428
Peter Collingbourne39719a72015-11-20 20:49:39 +00009429 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009430}
9431
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009432// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9433// for the various SFI requirements like register masking. The assembly tool
9434// inserts the file containing the macros as an input into all the assembly
9435// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009436void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9437 const InputInfo &Output,
9438 const InputInfoList &Inputs,
9439 const ArgList &Args,
9440 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009441 const toolchains::NaClToolChain &ToolChain =
9442 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009443 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009444 "nacl-arm-macros.s");
9445 InputInfoList NewInputs;
9446 NewInputs.push_back(NaClMacros);
9447 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009448 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9449 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009450}
9451
Douglas Katzman750cfc52015-06-29 18:42:16 +00009452// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009453// we use static by default, do not yet support sanitizers or LTO, and a few
9454// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009455// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009456void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9457 const InputInfo &Output,
9458 const InputInfoList &Inputs,
9459 const ArgList &Args,
9460 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009461
Douglas Katzman54366072015-07-27 16:53:08 +00009462 const toolchains::NaClToolChain &ToolChain =
9463 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009464 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009465 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009466 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009467 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009468
9469 ArgStringList CmdArgs;
9470
9471 // Silence warning for "clang -g foo.o -o foo"
9472 Args.ClaimAllArgs(options::OPT_g_Group);
9473 // and "clang -emit-llvm foo.o -o foo"
9474 Args.ClaimAllArgs(options::OPT_emit_llvm);
9475 // and for "clang -w foo.o -o foo". Other warning options are already
9476 // handled somewhere else.
9477 Args.ClaimAllArgs(options::OPT_w);
9478
9479 if (!D.SysRoot.empty())
9480 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9481
9482 if (Args.hasArg(options::OPT_rdynamic))
9483 CmdArgs.push_back("-export-dynamic");
9484
9485 if (Args.hasArg(options::OPT_s))
9486 CmdArgs.push_back("-s");
9487
Douglas Katzman54366072015-07-27 16:53:08 +00009488 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9489 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009490 CmdArgs.push_back("--build-id");
9491
9492 if (!IsStatic)
9493 CmdArgs.push_back("--eh-frame-hdr");
9494
9495 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009496 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009497 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009498 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009499 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009500 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009501 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009502 else if (Arch == llvm::Triple::mipsel)
9503 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009504 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009505 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9506 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009507
9508 if (IsStatic)
9509 CmdArgs.push_back("-static");
9510 else if (Args.hasArg(options::OPT_shared))
9511 CmdArgs.push_back("-shared");
9512
9513 CmdArgs.push_back("-o");
9514 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009515 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009516 if (!Args.hasArg(options::OPT_shared))
9517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9519
9520 const char *crtbegin;
9521 if (IsStatic)
9522 crtbegin = "crtbeginT.o";
9523 else if (Args.hasArg(options::OPT_shared))
9524 crtbegin = "crtbeginS.o";
9525 else
9526 crtbegin = "crtbegin.o";
9527 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9528 }
9529
9530 Args.AddAllArgs(CmdArgs, options::OPT_L);
9531 Args.AddAllArgs(CmdArgs, options::OPT_u);
9532
Douglas Katzman6059ef92015-11-17 17:41:23 +00009533 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009534
9535 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9536 CmdArgs.push_back("--no-demangle");
9537
9538 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9539
Douglas Katzman78b37b02015-11-17 20:28:07 +00009540 if (D.CCCIsCXX() &&
9541 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009542 bool OnlyLibstdcxxStatic =
9543 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009544 if (OnlyLibstdcxxStatic)
9545 CmdArgs.push_back("-Bstatic");
9546 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9547 if (OnlyLibstdcxxStatic)
9548 CmdArgs.push_back("-Bdynamic");
9549 CmdArgs.push_back("-lm");
9550 }
9551
9552 if (!Args.hasArg(options::OPT_nostdlib)) {
9553 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9554 // Always use groups, since it has no effect on dynamic libraries.
9555 CmdArgs.push_back("--start-group");
9556 CmdArgs.push_back("-lc");
9557 // NaCl's libc++ currently requires libpthread, so just always include it
9558 // in the group for C++.
9559 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009561 // Gold, used by Mips, handles nested groups differently than ld, and
9562 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9563 // which is not a desired behaviour here.
9564 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9565 if (getToolChain().getArch() == llvm::Triple::mipsel)
9566 CmdArgs.push_back("-lnacl");
9567
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009568 CmdArgs.push_back("-lpthread");
9569 }
9570
9571 CmdArgs.push_back("-lgcc");
9572 CmdArgs.push_back("--as-needed");
9573 if (IsStatic)
9574 CmdArgs.push_back("-lgcc_eh");
9575 else
9576 CmdArgs.push_back("-lgcc_s");
9577 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009578
9579 // Mips needs to create and use pnacl_legacy library that contains
9580 // definitions from bitcode/pnaclmm.c and definitions for
9581 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9582 if (getToolChain().getArch() == llvm::Triple::mipsel)
9583 CmdArgs.push_back("-lpnacl_legacy");
9584
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009585 CmdArgs.push_back("--end-group");
9586 }
9587
9588 if (!Args.hasArg(options::OPT_nostartfiles)) {
9589 const char *crtend;
9590 if (Args.hasArg(options::OPT_shared))
9591 crtend = "crtendS.o";
9592 else
9593 crtend = "crtend.o";
9594
9595 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9596 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9597 }
9598 }
9599
Peter Collingbourne39719a72015-11-20 20:49:39 +00009600 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9601 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009602}
9603
Douglas Katzman95354292015-06-23 20:42:09 +00009604void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9605 const InputInfo &Output,
9606 const InputInfoList &Inputs,
9607 const ArgList &Args,
9608 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009609 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009610 ArgStringList CmdArgs;
9611
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009612 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009613
9614 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009615 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009616
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009617 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009618 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009619
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009620 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009622}
9623
Douglas Katzman95354292015-06-23 20:42:09 +00009624void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9625 const InputInfo &Output,
9626 const InputInfoList &Inputs,
9627 const ArgList &Args,
9628 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009629 const Driver &D = getToolChain().getDriver();
9630 ArgStringList CmdArgs;
9631
Daniel Dunbarb440f562010-08-02 02:38:21 +00009632 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009633 CmdArgs.push_back("-o");
9634 CmdArgs.push_back(Output.getFilename());
9635 } else {
9636 assert(Output.isNothing() && "Invalid output.");
9637 }
9638
Douglas Katzman78b37b02015-11-17 20:28:07 +00009639 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009640 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9641 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9642 CmdArgs.push_back(
9643 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9644 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009645 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009646
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009647 Args.AddAllArgs(CmdArgs,
9648 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009649
Daniel Dunbar54423b22010-09-17 00:24:54 +00009650 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009651
Xinliang David Li69306c02015-10-22 06:15:31 +00009652 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009653
Douglas Katzman78b37b02015-11-17 20:28:07 +00009654 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009655 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009656 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009657 CmdArgs.push_back("-lm");
9658 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009659 }
9660
Douglas Katzman78b37b02015-11-17 20:28:07 +00009661 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009662 if (Args.hasArg(options::OPT_pthread))
9663 CmdArgs.push_back("-lpthread");
9664 CmdArgs.push_back("-lc");
9665 CmdArgs.push_back("-lCompilerRT-Generic");
9666 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9667 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009668 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009669 }
9670
Logan Chieneb9162f2014-06-26 14:23:45 +00009671 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009673}
9674
Daniel Dunbarcc912342009-05-02 18:28:39 +00009675/// DragonFly Tools
9676
9677// For now, DragonFly Assemble does just about the same as for
9678// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009679void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9680 const InputInfo &Output,
9681 const InputInfoList &Inputs,
9682 const ArgList &Args,
9683 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009684 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009685 ArgStringList CmdArgs;
9686
9687 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9688 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009689 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009690 CmdArgs.push_back("--32");
9691
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009692 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009693
9694 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009695 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009696
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009697 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009698 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009699
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009700 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009702}
9703
Douglas Katzman95354292015-06-23 20:42:09 +00009704void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9705 const InputInfo &Output,
9706 const InputInfoList &Inputs,
9707 const ArgList &Args,
9708 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009709 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009710 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009711
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009712 if (!D.SysRoot.empty())
9713 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9714
John McCall65b8da02013-04-11 22:55:55 +00009715 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009716 if (Args.hasArg(options::OPT_static)) {
9717 CmdArgs.push_back("-Bstatic");
9718 } else {
John McCall65b8da02013-04-11 22:55:55 +00009719 if (Args.hasArg(options::OPT_rdynamic))
9720 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009721 if (Args.hasArg(options::OPT_shared))
9722 CmdArgs.push_back("-Bshareable");
9723 else {
9724 CmdArgs.push_back("-dynamic-linker");
9725 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9726 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009727 CmdArgs.push_back("--hash-style=gnu");
9728 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009729 }
9730
9731 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9732 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009733 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009734 CmdArgs.push_back("-m");
9735 CmdArgs.push_back("elf_i386");
9736 }
9737
Daniel Dunbarb440f562010-08-02 02:38:21 +00009738 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009739 CmdArgs.push_back("-o");
9740 CmdArgs.push_back(Output.getFilename());
9741 } else {
9742 assert(Output.isNothing() && "Invalid output.");
9743 }
9744
Douglas Katzman78b37b02015-11-17 20:28:07 +00009745 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009746 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009747 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009748 CmdArgs.push_back(
9749 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009750 else {
9751 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009752 CmdArgs.push_back(
9753 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009754 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009755 CmdArgs.push_back(
9756 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009757 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009758 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009759 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009760 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009761 CmdArgs.push_back(
9762 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009763 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009764 CmdArgs.push_back(
9765 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009766 }
9767
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009768 Args.AddAllArgs(CmdArgs,
9769 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009770
Daniel Dunbar54423b22010-09-17 00:24:54 +00009771 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009772
Douglas Katzman78b37b02015-11-17 20:28:07 +00009773 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009774 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009775
9776 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009777 CmdArgs.push_back("-rpath");
9778 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009779 }
9780
Hans Wennborg70850d82013-07-18 20:29:38 +00009781 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009782 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009783 CmdArgs.push_back("-lm");
9784 }
9785
Daniel Dunbarcc912342009-05-02 18:28:39 +00009786 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009787 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009788
9789 if (!Args.hasArg(options::OPT_nolibc)) {
9790 CmdArgs.push_back("-lc");
9791 }
9792
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009793 if (Args.hasArg(options::OPT_static) ||
9794 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009795 CmdArgs.push_back("-lgcc");
9796 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009797 } else {
9798 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009799 CmdArgs.push_back("-lgcc_pic");
9800 if (!Args.hasArg(options::OPT_shared))
9801 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009802 } else {
John McCall65b8da02013-04-11 22:55:55 +00009803 CmdArgs.push_back("-lgcc");
9804 CmdArgs.push_back("--as-needed");
9805 CmdArgs.push_back("-lgcc_pic");
9806 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009807 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009808 }
9809 }
9810
Douglas Katzman78b37b02015-11-17 20:28:07 +00009811 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009812 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009813 CmdArgs.push_back(
9814 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009815 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009816 CmdArgs.push_back(
9817 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9818 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009819 }
9820
Xinliang David Li69306c02015-10-22 06:15:31 +00009821 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009822
Logan Chieneb9162f2014-06-26 14:23:45 +00009823 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009825}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009826
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009827// Try to find Exe from a Visual Studio distribution. This first tries to find
9828// an installed copy of Visual Studio and, failing that, looks in the PATH,
9829// making sure that whatever executable that's found is not a same-named exe
9830// from clang itself to prevent clang from falling back to itself.
9831static std::string FindVisualStudioExecutable(const ToolChain &TC,
9832 const char *Exe,
9833 const char *ClangProgramPath) {
9834 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9835 std::string visualStudioBinDir;
9836 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9837 visualStudioBinDir)) {
9838 SmallString<128> FilePath(visualStudioBinDir);
9839 llvm::sys::path::append(FilePath, Exe);
9840 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9841 return FilePath.str();
9842 }
9843
9844 return Exe;
9845}
9846
Douglas Katzman95354292015-06-23 20:42:09 +00009847void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9848 const InputInfo &Output,
9849 const InputInfoList &Inputs,
9850 const ArgList &Args,
9851 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009852 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009853 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009854
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009855 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9856 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009857 CmdArgs.push_back(
9858 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009859
Douglas Katzman78b37b02015-11-17 20:28:07 +00009860 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9861 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009862 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009863
Zachary Turner10d75b22014-10-22 20:40:43 +00009864 if (!llvm::sys::Process::GetEnv("LIB")) {
9865 // If the VC environment hasn't been configured (perhaps because the user
9866 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009867 // the environment variable is set however, assume the user knows what
9868 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009869 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009870 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009871 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9872 SmallString<128> LibDir(VisualStudioDir);
9873 llvm::sys::path::append(LibDir, "VC", "lib");
9874 switch (MSVC.getArch()) {
9875 case llvm::Triple::x86:
9876 // x86 just puts the libraries directly in lib
9877 break;
9878 case llvm::Triple::x86_64:
9879 llvm::sys::path::append(LibDir, "amd64");
9880 break;
9881 case llvm::Triple::arm:
9882 llvm::sys::path::append(LibDir, "arm");
9883 break;
9884 default:
9885 break;
9886 }
9887 CmdArgs.push_back(
9888 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009889
9890 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9891 std::string UniversalCRTLibPath;
9892 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9893 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9894 UniversalCRTLibPath.c_str()));
9895 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009896 }
9897
9898 std::string WindowsSdkLibPath;
9899 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9900 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9901 WindowsSdkLibPath.c_str()));
9902 }
9903
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009904 CmdArgs.push_back("-nologo");
9905
Reid Kleckner124955a2015-08-05 18:51:13 +00009906 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009907 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009909 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009910 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009911 if (DLL) {
9912 CmdArgs.push_back(Args.MakeArgString("-dll"));
9913
9914 SmallString<128> ImplibName(Output.getFilename());
9915 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009916 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009917 }
9918
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009919 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009920 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009921 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009922 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009923 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9924 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009925 // Make sure the dynamic runtime thunk is not optimized out at link time
9926 // to ensure proper SEH handling.
9927 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009928 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009929 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009930 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009931 for (const auto &Lib : {"asan", "asan_cxx"})
9932 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009933 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009934 }
9935
Hans Wennborg2e274592013-08-13 23:38:57 +00009936 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009937
Alexey Bataevc7e84352015-08-19 04:49:01 +00009938 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9939 options::OPT_fno_openmp, false)) {
9940 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9941 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9942 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9943 TC.getDriver().Dir + "/../lib"));
9944 switch (getOpenMPRuntime(getToolChain(), Args)) {
9945 case OMPRT_OMP:
9946 CmdArgs.push_back("-defaultlib:libomp.lib");
9947 break;
9948 case OMPRT_IOMP5:
9949 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9950 break;
9951 case OMPRT_GOMP:
9952 break;
9953 case OMPRT_Unknown:
9954 // Already diagnosed.
9955 break;
9956 }
9957 }
9958
Andrey Turetskiya4868572016-03-14 11:19:43 +00009959 // Add compiler-rt lib in case if it was explicitly
9960 // specified as an argument for --rtlib option.
9961 if (!Args.hasArg(options::OPT_nostdlib)) {
9962 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9963 }
9964
Reid Kleckner337188f2014-09-16 19:22:00 +00009965 // Add filenames, libraries, and other linker inputs.
9966 for (const auto &Input : Inputs) {
9967 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009968 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009969 continue;
9970 }
9971
9972 const Arg &A = Input.getInputArg();
9973
9974 // Render -l options differently for the MSVC linker.
9975 if (A.getOption().matches(options::OPT_l)) {
9976 StringRef Lib = A.getValue();
9977 const char *LinkLibArg;
9978 if (Lib.endswith(".lib"))
9979 LinkLibArg = Args.MakeArgString(Lib);
9980 else
9981 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9982 CmdArgs.push_back(LinkLibArg);
9983 continue;
9984 }
9985
9986 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9987 // or -L. Render it, even if MSVC doesn't understand it.
9988 A.renderAsInput(Args, CmdArgs);
9989 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009990
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009991 TC.addProfileRTLibs(Args, CmdArgs);
9992
Zachary Turner719f58c2014-12-01 23:06:47 +00009993 // We need to special case some linker paths. In the case of lld, we need to
9994 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9995 // linker, we need to use a special search algorithm.
9996 llvm::SmallString<128> linkPath;
9997 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9998 if (Linker.equals_lower("lld"))
9999 Linker = "lld-link";
10000
10001 if (Linker.equals_lower("link")) {
10002 // If we're using the MSVC linker, it's not sufficient to just use link
10003 // from the program PATH, because other environments like GnuWin32 install
10004 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010005 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +000010006 C.getDriver().getClangProgramPath());
10007 } else {
10008 linkPath = Linker;
10009 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010010 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +000010011 }
10012
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010013 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +000010014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010015}
Hans Wennborg87cfa712013-09-19 20:32:16 +000010016
Douglas Katzman95354292015-06-23 20:42:09 +000010017void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10018 const InputInfo &Output,
10019 const InputInfoList &Inputs,
10020 const ArgList &Args,
10021 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010022 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
10023}
10024
Douglas Katzman95354292015-06-23 20:42:09 +000010025std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +000010026 Compilation &C, const JobAction &JA, const InputInfo &Output,
10027 const InputInfoList &Inputs, const ArgList &Args,
10028 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010029 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +000010030 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010031 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010032 CmdArgs.push_back("/W0"); // No warnings.
10033
10034 // The goal is to be able to invoke this tool correctly based on
10035 // any flag accepted by clang-cl.
10036
10037 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +000010038 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010039
10040 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +000010041 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
10042 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
10043 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010044 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
10045 if (A->getOption().getID() == options::OPT_O0) {
10046 CmdArgs.push_back("/Od");
10047 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +000010048 CmdArgs.push_back("/Og");
10049
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010050 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +000010051 if (OptLevel == "s" || OptLevel == "z")
10052 CmdArgs.push_back("/Os");
10053 else
10054 CmdArgs.push_back("/Ot");
10055
10056 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010057 }
10058 }
David Majnemer015ce0f2015-07-27 07:32:11 +000010059 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
10060 options::OPT_fno_omit_frame_pointer))
10061 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
10062 ? "/Oy"
10063 : "/Oy-");
10064 if (!Args.hasArg(options::OPT_fwritable_strings))
10065 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010066
Nico Weber3f8dafb2015-03-12 19:37:10 +000010067 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010068 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
10069
David Majnemerf6072342014-07-01 22:24:56 +000010070 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
10071 /*default=*/false))
10072 CmdArgs.push_back("/GR-");
Etienne Bergerone28e7f22016-06-15 20:34:33 +000010073
10074 if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS,
10075 /*default=*/false))
10076 CmdArgs.push_back("/GS-");
10077
Hans Wennborg5149a3b2014-03-25 14:48:54 +000010078 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
10079 options::OPT_fno_function_sections))
10080 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10081 ? "/Gy"
10082 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +000010083 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10084 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +000010085 CmdArgs.push_back(
10086 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010087 if (Args.hasArg(options::OPT_fsyntax_only))
10088 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +000010089 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10090 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +000010091 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010092
Nico Weber3f8dafb2015-03-12 19:37:10 +000010093 std::vector<std::string> Includes =
10094 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010095 for (const auto &Include : Includes)
10096 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010097
Hans Wennborg87cfa712013-09-19 20:32:16 +000010098 // Flags that can simply be passed through.
10099 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10100 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010101 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10102 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010103 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010104 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010105
10106 // The order of these flags is relevant, so pick the last one.
10107 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10108 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10109 A->render(Args, CmdArgs);
10110
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010111 // Pass through all unknown arguments so that the fallback command can see
10112 // them too.
10113 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10114
Hans Wennborg87cfa712013-09-19 20:32:16 +000010115 // Input filename.
10116 assert(Inputs.size() == 1);
10117 const InputInfo &II = Inputs[0];
10118 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10119 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10120 if (II.isFilename())
10121 CmdArgs.push_back(II.getFilename());
10122 else
10123 II.getInputArg().renderAsInput(Args, CmdArgs);
10124
10125 // Output filename.
10126 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010127 const char *Fo =
10128 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010129 CmdArgs.push_back(Fo);
10130
Hans Wennborg188382e2013-09-20 18:16:35 +000010131 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010132 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10133 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010134 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010135 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010136}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010137
Yaron Keren1c0070c2015-07-02 04:45:27 +000010138/// MinGW Tools
10139void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10140 const InputInfo &Output,
10141 const InputInfoList &Inputs,
10142 const ArgList &Args,
10143 const char *LinkingOutput) const {
10144 claimNoWarnArgs(Args);
10145 ArgStringList CmdArgs;
10146
10147 if (getToolChain().getArch() == llvm::Triple::x86) {
10148 CmdArgs.push_back("--32");
10149 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10150 CmdArgs.push_back("--64");
10151 }
10152
10153 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10154
10155 CmdArgs.push_back("-o");
10156 CmdArgs.push_back(Output.getFilename());
10157
10158 for (const auto &II : Inputs)
10159 CmdArgs.push_back(II.getFilename());
10160
10161 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010162 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010163
10164 if (Args.hasArg(options::OPT_gsplit_dwarf))
10165 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10166 SplitDebugName(Args, Inputs[0]));
10167}
10168
10169void MinGW::Linker::AddLibGCC(const ArgList &Args,
10170 ArgStringList &CmdArgs) const {
10171 if (Args.hasArg(options::OPT_mthreads))
10172 CmdArgs.push_back("-lmingwthrd");
10173 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010174
Yaron Kerenaa281332015-08-09 00:24:07 +000010175 // Make use of compiler-rt if --rtlib option is used
10176 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10177 if (RLT == ToolChain::RLT_Libgcc) {
10178 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10179 Args.hasArg(options::OPT_static);
10180 bool Shared = Args.hasArg(options::OPT_shared);
10181 bool CXX = getToolChain().getDriver().CCCIsCXX();
10182
10183 if (Static || (!CXX && !Shared)) {
10184 CmdArgs.push_back("-lgcc");
10185 CmdArgs.push_back("-lgcc_eh");
10186 } else {
10187 CmdArgs.push_back("-lgcc_s");
10188 CmdArgs.push_back("-lgcc");
10189 }
10190 } else {
10191 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10192 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010193
Yaron Keren1c0070c2015-07-02 04:45:27 +000010194 CmdArgs.push_back("-lmoldname");
10195 CmdArgs.push_back("-lmingwex");
10196 CmdArgs.push_back("-lmsvcrt");
10197}
10198
10199void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10200 const InputInfo &Output,
10201 const InputInfoList &Inputs,
10202 const ArgList &Args,
10203 const char *LinkingOutput) const {
10204 const ToolChain &TC = getToolChain();
10205 const Driver &D = TC.getDriver();
10206 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10207
10208 ArgStringList CmdArgs;
10209
10210 // Silence warning for "clang -g foo.o -o foo"
10211 Args.ClaimAllArgs(options::OPT_g_Group);
10212 // and "clang -emit-llvm foo.o -o foo"
10213 Args.ClaimAllArgs(options::OPT_emit_llvm);
10214 // and for "clang -w foo.o -o foo". Other warning options are already
10215 // handled somewhere else.
10216 Args.ClaimAllArgs(options::OPT_w);
10217
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010218 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10219 if (LinkerName.equals_lower("lld")) {
10220 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010221 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010222 } else if (!LinkerName.equals_lower("ld")) {
10223 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010224 }
10225
Yaron Keren1c0070c2015-07-02 04:45:27 +000010226 if (!D.SysRoot.empty())
10227 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10228
10229 if (Args.hasArg(options::OPT_s))
10230 CmdArgs.push_back("-s");
10231
10232 CmdArgs.push_back("-m");
10233 if (TC.getArch() == llvm::Triple::x86)
10234 CmdArgs.push_back("i386pe");
10235 if (TC.getArch() == llvm::Triple::x86_64)
10236 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010237 if (TC.getArch() == llvm::Triple::arm)
10238 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010239
10240 if (Args.hasArg(options::OPT_mwindows)) {
10241 CmdArgs.push_back("--subsystem");
10242 CmdArgs.push_back("windows");
10243 } else if (Args.hasArg(options::OPT_mconsole)) {
10244 CmdArgs.push_back("--subsystem");
10245 CmdArgs.push_back("console");
10246 }
10247
10248 if (Args.hasArg(options::OPT_static))
10249 CmdArgs.push_back("-Bstatic");
10250 else {
10251 if (Args.hasArg(options::OPT_mdll))
10252 CmdArgs.push_back("--dll");
10253 else if (Args.hasArg(options::OPT_shared))
10254 CmdArgs.push_back("--shared");
10255 CmdArgs.push_back("-Bdynamic");
10256 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10257 CmdArgs.push_back("-e");
10258 if (TC.getArch() == llvm::Triple::x86)
10259 CmdArgs.push_back("_DllMainCRTStartup@12");
10260 else
10261 CmdArgs.push_back("DllMainCRTStartup");
10262 CmdArgs.push_back("--enable-auto-image-base");
10263 }
10264 }
10265
10266 CmdArgs.push_back("-o");
10267 CmdArgs.push_back(Output.getFilename());
10268
10269 Args.AddAllArgs(CmdArgs, options::OPT_e);
10270 // FIXME: add -N, -n flags
10271 Args.AddLastArg(CmdArgs, options::OPT_r);
10272 Args.AddLastArg(CmdArgs, options::OPT_s);
10273 Args.AddLastArg(CmdArgs, options::OPT_t);
10274 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10275 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10276
Douglas Katzman78b37b02015-11-17 20:28:07 +000010277 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010278 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10279 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10280 } else {
10281 if (Args.hasArg(options::OPT_municode))
10282 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10283 else
10284 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10285 }
10286 if (Args.hasArg(options::OPT_pg))
10287 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10288 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10289 }
10290
10291 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010292 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010293 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10294
10295 // TODO: Add ASan stuff here
10296
10297 // TODO: Add profile stuff here
10298
Douglas Katzman78b37b02015-11-17 20:28:07 +000010299 if (D.CCCIsCXX() &&
10300 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010301 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10302 !Args.hasArg(options::OPT_static);
10303 if (OnlyLibstdcxxStatic)
10304 CmdArgs.push_back("-Bstatic");
10305 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10306 if (OnlyLibstdcxxStatic)
10307 CmdArgs.push_back("-Bdynamic");
10308 }
10309
10310 if (!Args.hasArg(options::OPT_nostdlib)) {
10311 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10312 if (Args.hasArg(options::OPT_static))
10313 CmdArgs.push_back("--start-group");
10314
10315 if (Args.hasArg(options::OPT_fstack_protector) ||
10316 Args.hasArg(options::OPT_fstack_protector_strong) ||
10317 Args.hasArg(options::OPT_fstack_protector_all)) {
10318 CmdArgs.push_back("-lssp_nonshared");
10319 CmdArgs.push_back("-lssp");
10320 }
10321 if (Args.hasArg(options::OPT_fopenmp))
10322 CmdArgs.push_back("-lgomp");
10323
10324 AddLibGCC(Args, CmdArgs);
10325
10326 if (Args.hasArg(options::OPT_pg))
10327 CmdArgs.push_back("-lgmon");
10328
Yaron Kerenadce68e2015-07-06 18:52:19 +000010329 if (Args.hasArg(options::OPT_pthread))
10330 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010331
10332 // add system libraries
10333 if (Args.hasArg(options::OPT_mwindows)) {
10334 CmdArgs.push_back("-lgdi32");
10335 CmdArgs.push_back("-lcomdlg32");
10336 }
10337 CmdArgs.push_back("-ladvapi32");
10338 CmdArgs.push_back("-lshell32");
10339 CmdArgs.push_back("-luser32");
10340 CmdArgs.push_back("-lkernel32");
10341
10342 if (Args.hasArg(options::OPT_static))
10343 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010344 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010345 AddLibGCC(Args, CmdArgs);
10346 }
10347
10348 if (!Args.hasArg(options::OPT_nostartfiles)) {
10349 // Add crtfastmath.o if available and fast math is enabled.
10350 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10351
10352 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10353 }
10354 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010355 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010356 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010357}
10358
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010359/// XCore Tools
10360// We pass assemble and link construction to the xcc tool.
10361
Douglas Katzman95354292015-06-23 20:42:09 +000010362void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10363 const InputInfo &Output,
10364 const InputInfoList &Inputs,
10365 const ArgList &Args,
10366 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010367 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010368 ArgStringList CmdArgs;
10369
10370 CmdArgs.push_back("-o");
10371 CmdArgs.push_back(Output.getFilename());
10372
10373 CmdArgs.push_back("-c");
10374
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010375 if (Args.hasArg(options::OPT_v))
10376 CmdArgs.push_back("-v");
10377
Robert Lytton894d25c2014-05-02 09:33:25 +000010378 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10379 if (!A->getOption().matches(options::OPT_g0))
10380 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010381
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010382 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10383 false))
10384 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010385
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010386 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010387
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010388 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010389 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010390
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010391 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010392 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010393}
10394
Douglas Katzman95354292015-06-23 20:42:09 +000010395void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10396 const InputInfo &Output,
10397 const InputInfoList &Inputs,
10398 const ArgList &Args,
10399 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010400 ArgStringList CmdArgs;
10401
10402 if (Output.isFilename()) {
10403 CmdArgs.push_back("-o");
10404 CmdArgs.push_back(Output.getFilename());
10405 } else {
10406 assert(Output.isNothing() && "Invalid output.");
10407 }
10408
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010409 if (Args.hasArg(options::OPT_v))
10410 CmdArgs.push_back("-v");
10411
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010412 // Pass -fexceptions through to the linker if it was present.
10413 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10414 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010415 CmdArgs.push_back("-fexceptions");
10416
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010417 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10418
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010419 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010421}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010422
Douglas Katzman95354292015-06-23 20:42:09 +000010423void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10424 const InputInfo &Output,
10425 const InputInfoList &Inputs,
10426 const ArgList &Args,
10427 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010428 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010429 const auto &TC =
10430 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10431 ArgStringList CmdArgs;
10432 const char *Exec;
10433
10434 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010435 default:
10436 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010437 case llvm::Triple::arm:
10438 case llvm::Triple::thumb:
10439 break;
10440 case llvm::Triple::x86:
10441 CmdArgs.push_back("--32");
10442 break;
10443 case llvm::Triple::x86_64:
10444 CmdArgs.push_back("--64");
10445 break;
10446 }
10447
10448 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10449
10450 CmdArgs.push_back("-o");
10451 CmdArgs.push_back(Output.getFilename());
10452
10453 for (const auto &Input : Inputs)
10454 CmdArgs.push_back(Input.getFilename());
10455
10456 const std::string Assembler = TC.GetProgramPath("as");
10457 Exec = Args.MakeArgString(Assembler);
10458
Justin Bognerd3371d82015-07-17 03:35:54 +000010459 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010460}
10461
Douglas Katzman95354292015-06-23 20:42:09 +000010462void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10463 const InputInfo &Output,
10464 const InputInfoList &Inputs,
10465 const ArgList &Args,
10466 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010467 const auto &TC =
10468 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10469 const llvm::Triple &T = TC.getTriple();
10470 const Driver &D = TC.getDriver();
10471 SmallString<128> EntryPoint;
10472 ArgStringList CmdArgs;
10473 const char *Exec;
10474
10475 // Silence warning for "clang -g foo.o -o foo"
10476 Args.ClaimAllArgs(options::OPT_g_Group);
10477 // and "clang -emit-llvm foo.o -o foo"
10478 Args.ClaimAllArgs(options::OPT_emit_llvm);
10479 // and for "clang -w foo.o -o foo"
10480 Args.ClaimAllArgs(options::OPT_w);
10481 // Other warning options are already handled somewhere else.
10482
10483 if (!D.SysRoot.empty())
10484 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10485
10486 if (Args.hasArg(options::OPT_pie))
10487 CmdArgs.push_back("-pie");
10488 if (Args.hasArg(options::OPT_rdynamic))
10489 CmdArgs.push_back("-export-dynamic");
10490 if (Args.hasArg(options::OPT_s))
10491 CmdArgs.push_back("--strip-all");
10492
10493 CmdArgs.push_back("-m");
10494 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010495 default:
10496 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010497 case llvm::Triple::arm:
10498 case llvm::Triple::thumb:
10499 // FIXME: this is incorrect for WinCE
10500 CmdArgs.push_back("thumb2pe");
10501 break;
10502 case llvm::Triple::x86:
10503 CmdArgs.push_back("i386pe");
10504 EntryPoint.append("_");
10505 break;
10506 case llvm::Triple::x86_64:
10507 CmdArgs.push_back("i386pep");
10508 break;
10509 }
10510
10511 if (Args.hasArg(options::OPT_shared)) {
10512 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010513 default:
10514 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010515 case llvm::Triple::arm:
10516 case llvm::Triple::thumb:
10517 case llvm::Triple::x86_64:
10518 EntryPoint.append("_DllMainCRTStartup");
10519 break;
10520 case llvm::Triple::x86:
10521 EntryPoint.append("_DllMainCRTStartup@12");
10522 break;
10523 }
10524
10525 CmdArgs.push_back("-shared");
10526 CmdArgs.push_back("-Bdynamic");
10527
10528 CmdArgs.push_back("--enable-auto-image-base");
10529
10530 CmdArgs.push_back("--entry");
10531 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10532 } else {
10533 EntryPoint.append("mainCRTStartup");
10534
10535 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10536 : "-Bdynamic");
10537
Douglas Katzman78b37b02015-11-17 20:28:07 +000010538 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010539 CmdArgs.push_back("--entry");
10540 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10541 }
10542
10543 // FIXME: handle subsystem
10544 }
10545
10546 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010547 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010548
10549 CmdArgs.push_back("-o");
10550 CmdArgs.push_back(Output.getFilename());
10551
10552 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10553 SmallString<261> ImpLib(Output.getFilename());
10554 llvm::sys::path::replace_extension(ImpLib, ".lib");
10555
10556 CmdArgs.push_back("--out-implib");
10557 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10558 }
10559
Douglas Katzman78b37b02015-11-17 20:28:07 +000010560 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010561 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10562 const char *CRTBegin;
10563
10564 CRTBegin =
10565 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10566 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10567 }
10568
10569 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010570 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010571 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10572
10573 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10574 !Args.hasArg(options::OPT_nodefaultlibs)) {
10575 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10576 !Args.hasArg(options::OPT_static);
10577 if (StaticCXX)
10578 CmdArgs.push_back("-Bstatic");
10579 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10580 if (StaticCXX)
10581 CmdArgs.push_back("-Bdynamic");
10582 }
10583
10584 if (!Args.hasArg(options::OPT_nostdlib)) {
10585 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10586 // TODO handle /MT[d] /MD[d]
10587 CmdArgs.push_back("-lmsvcrt");
10588 AddRunTimeLibs(TC, D, CmdArgs, Args);
10589 }
10590 }
10591
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010592 if (TC.getSanitizerArgs().needsAsanRt()) {
10593 // TODO handle /MT[d] /MD[d]
10594 if (Args.hasArg(options::OPT_shared)) {
10595 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10596 } else {
10597 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10598 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010599 // Make sure the dynamic runtime thunk is not optimized out at link time
10600 // to ensure proper SEH handling.
10601 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10602 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10603 ? "___asan_seh_interceptor"
10604 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010605 }
10606 }
10607
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010608 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010609
Justin Bognerd3371d82015-07-17 03:35:54 +000010610 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010611}
Douglas Katzman84a75642015-06-19 14:55:19 +000010612
Douglas Katzman95354292015-06-23 20:42:09 +000010613void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10614 const InputInfo &Output,
10615 const InputInfoList &Inputs,
10616 const ArgList &Args,
10617 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010618 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010619 assert(Inputs.size() == 1);
10620 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010621 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10622 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010623
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010624 if (JA.getKind() == Action::PreprocessJobClass) {
10625 Args.ClaimAllArgs();
10626 CmdArgs.push_back("-E");
10627 } else {
10628 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10629 CmdArgs.push_back("-S");
10630 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10631 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010632 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010633
Douglas Katzmanf6071112015-08-03 14:34:22 +000010634 // Append all -I, -iquote, -isystem paths, defines/undefines,
10635 // 'f' flags, optimize flags, and warning options.
10636 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010637 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010638 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010639 options::OPT_f_Group, options::OPT_f_clang_Group,
10640 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010641 options::OPT_O_Group, options::OPT_W_Group,
10642 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010643
10644 // If we're producing a dependency file, and assembly is the final action,
10645 // then the name of the target in the dependency file should be the '.o'
10646 // file, not the '.s' file produced by this step. For example, instead of
10647 // /tmp/mumble.s: mumble.c .../someheader.h
10648 // the filename on the lefthand side should be "mumble.o"
10649 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10650 C.getActions().size() == 1 &&
10651 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10652 Arg *A = Args.getLastArg(options::OPT_o);
10653 if (A) {
10654 CmdArgs.push_back("-MT");
10655 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10656 }
10657 }
10658
Douglas Katzman84a75642015-06-19 14:55:19 +000010659 CmdArgs.push_back(II.getFilename());
10660 CmdArgs.push_back("-o");
10661 CmdArgs.push_back(Output.getFilename());
10662
10663 std::string Exec =
10664 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010665 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10666 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010667}
10668
Douglas Katzman95354292015-06-23 20:42:09 +000010669void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10670 const InputInfo &Output,
10671 const InputInfoList &Inputs,
10672 const ArgList &Args,
10673 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010674 ArgStringList CmdArgs;
10675
10676 assert(Inputs.size() == 1);
10677 const InputInfo &II = Inputs[0];
10678 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10679 assert(Output.getType() == types::TY_Object);
10680
10681 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010682 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10683 if (CPUArg)
10684 CmdArgs.push_back(
10685 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010686 CmdArgs.push_back("-noSPrefixing");
10687 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010688 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10689 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10690 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010691 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010692 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010693 }
10694 CmdArgs.push_back("-elf"); // Output format.
10695 CmdArgs.push_back(II.getFilename());
10696 CmdArgs.push_back(
10697 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10698
10699 std::string Exec =
10700 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010701 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10702 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010703}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010704
10705void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10706 const InputInfo &Output,
10707 const InputInfoList &Inputs,
10708 const ArgList &Args,
10709 const char *LinkingOutput) const {
10710 const auto &TC =
10711 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10712 const llvm::Triple &T = TC.getTriple();
10713 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010714 bool UseStartfiles =
10715 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010716 bool UseDefaultLibs =
10717 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010718
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010719 if (T.getArch() == llvm::Triple::sparc)
10720 CmdArgs.push_back("-EB");
10721 else // SHAVE assumes little-endian, and sparcel is expressly so.
10722 CmdArgs.push_back("-EL");
10723
10724 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10725 // but we never pass through a --sysroot option and various other bits.
10726 // For example, there are no sanitizers (yet) nor gold linker.
10727
10728 // Eat some arguments that may be present but have no effect.
10729 Args.ClaimAllArgs(options::OPT_g_Group);
10730 Args.ClaimAllArgs(options::OPT_w);
10731 Args.ClaimAllArgs(options::OPT_static_libgcc);
10732
10733 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10734 CmdArgs.push_back("-s");
10735
10736 CmdArgs.push_back("-o");
10737 CmdArgs.push_back(Output.getFilename());
10738
10739 if (UseStartfiles) {
10740 // If you want startfiles, it means you want the builtin crti and crtbegin,
10741 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010742 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10743 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010744 }
10745
10746 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10747 options::OPT_e, options::OPT_s, options::OPT_t,
10748 options::OPT_Z_Flag, options::OPT_r});
10749
Douglas Katzman674a3122015-11-18 16:24:46 +000010750 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010751
10752 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10753
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010754 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010755 if (C.getDriver().CCCIsCXX())
10756 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010757 if (T.getOS() == llvm::Triple::RTEMS) {
10758 CmdArgs.push_back("--start-group");
10759 CmdArgs.push_back("-lc");
10760 // You must provide your own "-L" option to enable finding these.
10761 CmdArgs.push_back("-lrtemscpu");
10762 CmdArgs.push_back("-lrtemsbsp");
10763 CmdArgs.push_back("--end-group");
10764 } else {
10765 CmdArgs.push_back("-lc");
10766 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010767 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010768 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010769 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010770 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10771 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010772 }
10773
10774 std::string Exec =
10775 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10776 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10777 CmdArgs, Inputs));
10778}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010779
10780void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10781 const InputInfo &Output,
10782 const InputInfoList &Inputs,
10783 const ArgList &Args,
10784 const char *LinkingOutput) const {
10785 claimNoWarnArgs(Args);
10786 ArgStringList CmdArgs;
10787
10788 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10789
10790 CmdArgs.push_back("-o");
10791 CmdArgs.push_back(Output.getFilename());
10792
10793 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10794 const InputInfo &Input = Inputs[0];
10795 assert(Input.isFilename() && "Invalid input.");
10796 CmdArgs.push_back(Input.getFilename());
10797
10798 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000010799 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010800 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10801}
10802
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010803static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10804 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10805 if (SanArgs.needsUbsanRt()) {
10806 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10807 }
10808 if (SanArgs.needsAsanRt()) {
10809 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10810 }
10811}
10812
10813static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10814 const JobAction &JA, const InputInfo &Output,
10815 const InputInfoList &Inputs,
10816 const ArgList &Args,
10817 const char *LinkingOutput) {
10818 const toolchains::FreeBSD &ToolChain =
10819 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10820 const Driver &D = ToolChain.getDriver();
10821 ArgStringList CmdArgs;
10822
10823 // Silence warning for "clang -g foo.o -o foo"
10824 Args.ClaimAllArgs(options::OPT_g_Group);
10825 // and "clang -emit-llvm foo.o -o foo"
10826 Args.ClaimAllArgs(options::OPT_emit_llvm);
10827 // and for "clang -w foo.o -o foo". Other warning options are already
10828 // handled somewhere else.
10829 Args.ClaimAllArgs(options::OPT_w);
10830
10831 if (!D.SysRoot.empty())
10832 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10833
10834 if (Args.hasArg(options::OPT_pie))
10835 CmdArgs.push_back("-pie");
10836
10837 if (Args.hasArg(options::OPT_rdynamic))
10838 CmdArgs.push_back("-export-dynamic");
10839 if (Args.hasArg(options::OPT_shared))
10840 CmdArgs.push_back("--oformat=so");
10841
10842 if (Output.isFilename()) {
10843 CmdArgs.push_back("-o");
10844 CmdArgs.push_back(Output.getFilename());
10845 } else {
10846 assert(Output.isNothing() && "Invalid output.");
10847 }
10848
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010849 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10850
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010851 Args.AddAllArgs(CmdArgs, options::OPT_L);
10852 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10853 Args.AddAllArgs(CmdArgs, options::OPT_e);
10854 Args.AddAllArgs(CmdArgs, options::OPT_s);
10855 Args.AddAllArgs(CmdArgs, options::OPT_t);
10856 Args.AddAllArgs(CmdArgs, options::OPT_r);
10857
10858 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10859 CmdArgs.push_back("--no-demangle");
10860
10861 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10862
10863 if (Args.hasArg(options::OPT_pthread)) {
10864 CmdArgs.push_back("-lpthread");
10865 }
10866
Paul Robinson9d613612016-05-16 17:22:25 +000010867 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010868
10869 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10870}
10871
10872static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10873 const JobAction &JA, const InputInfo &Output,
10874 const InputInfoList &Inputs,
10875 const ArgList &Args,
10876 const char *LinkingOutput) {
10877 const toolchains::FreeBSD &ToolChain =
10878 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10879 const Driver &D = ToolChain.getDriver();
10880 ArgStringList CmdArgs;
10881
10882 // Silence warning for "clang -g foo.o -o foo"
10883 Args.ClaimAllArgs(options::OPT_g_Group);
10884 // and "clang -emit-llvm foo.o -o foo"
10885 Args.ClaimAllArgs(options::OPT_emit_llvm);
10886 // and for "clang -w foo.o -o foo". Other warning options are already
10887 // handled somewhere else.
10888 Args.ClaimAllArgs(options::OPT_w);
10889
10890 if (!D.SysRoot.empty())
10891 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10892
10893 if (Args.hasArg(options::OPT_pie))
10894 CmdArgs.push_back("-pie");
10895
10896 if (Args.hasArg(options::OPT_static)) {
10897 CmdArgs.push_back("-Bstatic");
10898 } else {
10899 if (Args.hasArg(options::OPT_rdynamic))
10900 CmdArgs.push_back("-export-dynamic");
10901 CmdArgs.push_back("--eh-frame-hdr");
10902 if (Args.hasArg(options::OPT_shared)) {
10903 CmdArgs.push_back("-Bshareable");
10904 } else {
10905 CmdArgs.push_back("-dynamic-linker");
10906 CmdArgs.push_back("/libexec/ld-elf.so.1");
10907 }
10908 CmdArgs.push_back("--enable-new-dtags");
10909 }
10910
10911 if (Output.isFilename()) {
10912 CmdArgs.push_back("-o");
10913 CmdArgs.push_back(Output.getFilename());
10914 } else {
10915 assert(Output.isNothing() && "Invalid output.");
10916 }
10917
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010918 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10919
Douglas Katzman78b37b02015-11-17 20:28:07 +000010920 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010921 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010922 if (!Args.hasArg(options::OPT_shared)) {
10923 if (Args.hasArg(options::OPT_pg))
10924 crt1 = "gcrt1.o";
10925 else if (Args.hasArg(options::OPT_pie))
10926 crt1 = "Scrt1.o";
10927 else
10928 crt1 = "crt1.o";
10929 }
10930 if (crt1)
10931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10932
10933 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10934
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010935 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010936 if (Args.hasArg(options::OPT_static))
10937 crtbegin = "crtbeginT.o";
10938 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10939 crtbegin = "crtbeginS.o";
10940 else
10941 crtbegin = "crtbegin.o";
10942
10943 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10944 }
10945
10946 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010947 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010948 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10949 Args.AddAllArgs(CmdArgs, options::OPT_e);
10950 Args.AddAllArgs(CmdArgs, options::OPT_s);
10951 Args.AddAllArgs(CmdArgs, options::OPT_t);
10952 Args.AddAllArgs(CmdArgs, options::OPT_r);
10953
10954 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10955 CmdArgs.push_back("--no-demangle");
10956
10957 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10958
Douglas Katzman78b37b02015-11-17 20:28:07 +000010959 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010960 // For PS4, we always want to pass libm, libstdc++ and libkernel
10961 // libraries for both C and C++ compilations.
10962 CmdArgs.push_back("-lkernel");
10963 if (D.CCCIsCXX()) {
10964 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10965 if (Args.hasArg(options::OPT_pg))
10966 CmdArgs.push_back("-lm_p");
10967 else
10968 CmdArgs.push_back("-lm");
10969 }
10970 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10971 // the default system libraries. Just mimic this for now.
10972 if (Args.hasArg(options::OPT_pg))
10973 CmdArgs.push_back("-lgcc_p");
10974 else
10975 CmdArgs.push_back("-lcompiler_rt");
10976 if (Args.hasArg(options::OPT_static)) {
10977 CmdArgs.push_back("-lstdc++");
10978 } else if (Args.hasArg(options::OPT_pg)) {
10979 CmdArgs.push_back("-lgcc_eh_p");
10980 } else {
10981 CmdArgs.push_back("--as-needed");
10982 CmdArgs.push_back("-lstdc++");
10983 CmdArgs.push_back("--no-as-needed");
10984 }
10985
10986 if (Args.hasArg(options::OPT_pthread)) {
10987 if (Args.hasArg(options::OPT_pg))
10988 CmdArgs.push_back("-lpthread_p");
10989 else
10990 CmdArgs.push_back("-lpthread");
10991 }
10992
10993 if (Args.hasArg(options::OPT_pg)) {
10994 if (Args.hasArg(options::OPT_shared))
10995 CmdArgs.push_back("-lc");
10996 else {
10997 if (Args.hasArg(options::OPT_static)) {
10998 CmdArgs.push_back("--start-group");
10999 CmdArgs.push_back("-lc_p");
11000 CmdArgs.push_back("-lpthread_p");
11001 CmdArgs.push_back("--end-group");
11002 } else {
11003 CmdArgs.push_back("-lc_p");
11004 }
11005 }
11006 CmdArgs.push_back("-lgcc_p");
11007 } else {
11008 if (Args.hasArg(options::OPT_static)) {
11009 CmdArgs.push_back("--start-group");
11010 CmdArgs.push_back("-lc");
11011 CmdArgs.push_back("-lpthread");
11012 CmdArgs.push_back("--end-group");
11013 } else {
11014 CmdArgs.push_back("-lc");
11015 }
11016 CmdArgs.push_back("-lcompiler_rt");
11017 }
11018
11019 if (Args.hasArg(options::OPT_static)) {
11020 CmdArgs.push_back("-lstdc++");
11021 } else if (Args.hasArg(options::OPT_pg)) {
11022 CmdArgs.push_back("-lgcc_eh_p");
11023 } else {
11024 CmdArgs.push_back("--as-needed");
11025 CmdArgs.push_back("-lstdc++");
11026 CmdArgs.push_back("--no-as-needed");
11027 }
11028 }
11029
Douglas Katzman78b37b02015-11-17 20:28:07 +000011030 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011031 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11032 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
11033 else
11034 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
11035 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
11036 }
11037
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011038 const char *Exec =
11039#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000011040 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011041#else
Paul Robinson9d613612016-05-16 17:22:25 +000011042 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011043#endif
11044
11045 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
11046}
11047
11048void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
11049 const InputInfo &Output,
11050 const InputInfoList &Inputs,
11051 const ArgList &Args,
11052 const char *LinkingOutput) const {
11053 const toolchains::FreeBSD &ToolChain =
11054 static_cast<const toolchains::FreeBSD &>(getToolChain());
11055 const Driver &D = ToolChain.getDriver();
11056 bool PS4Linker;
11057 StringRef LinkerOptName;
11058 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
11059 LinkerOptName = A->getValue();
11060 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
11061 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
11062 }
11063
11064 if (LinkerOptName == "gold")
11065 PS4Linker = false;
11066 else if (LinkerOptName == "ps4")
11067 PS4Linker = true;
11068 else
11069 PS4Linker = !Args.hasArg(options::OPT_shared);
11070
11071 if (PS4Linker)
11072 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11073 else
11074 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11075}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011076
11077void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
11078 const InputInfo &Output,
11079 const InputInfoList &Inputs,
11080 const ArgList &Args,
11081 const char *LinkingOutput) const {
11082 const auto &TC =
11083 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011084 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011085
11086 std::vector<std::string> gpu_archs =
11087 Args.getAllArgValues(options::OPT_march_EQ);
11088 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
11089 const std::string& gpu_arch = gpu_archs[0];
11090
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011091 ArgStringList CmdArgs;
11092 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000011093 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11094 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000011095 // ptxas does not accept -g option if optimization is enabled, so
11096 // we ignore the compiler's -O* options if we want debug info.
11097 CmdArgs.push_back("-g");
11098 CmdArgs.push_back("--dont-merge-basicblocks");
11099 CmdArgs.push_back("--return-at-end");
11100 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11101 // Map the -O we received to -O{0,1,2,3}.
11102 //
11103 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11104 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011105
Justin Lebar2836dcd2016-01-19 19:52:21 +000011106 // -O3 seems like the least-bad option when -Osomething is specified to
11107 // clang but it isn't handled below.
11108 StringRef OOpt = "3";
11109 if (A->getOption().matches(options::OPT_O4) ||
11110 A->getOption().matches(options::OPT_Ofast))
11111 OOpt = "3";
11112 else if (A->getOption().matches(options::OPT_O0))
11113 OOpt = "0";
11114 else if (A->getOption().matches(options::OPT_O)) {
11115 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11116 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11117 .Case("1", "1")
11118 .Case("2", "2")
11119 .Case("3", "3")
11120 .Case("s", "2")
11121 .Case("z", "2")
11122 .Default("2");
11123 }
11124 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11125 } else {
11126 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11127 // to no optimizations, but ptxas's default is -O3.
11128 CmdArgs.push_back("-O0");
11129 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011130
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011131 CmdArgs.push_back("--gpu-name");
11132 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11133 CmdArgs.push_back("--output-file");
11134 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11135 for (const auto& II : Inputs)
11136 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11137
11138 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11139 CmdArgs.push_back(Args.MakeArgString(A));
11140
11141 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11142 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11143}
11144
11145// All inputs to this linker must be from CudaDeviceActions, as we need to look
11146// at the Inputs' Actions in order to figure out which GPU architecture they
11147// correspond to.
11148void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11149 const InputInfo &Output,
11150 const InputInfoList &Inputs,
11151 const ArgList &Args,
11152 const char *LinkingOutput) const {
11153 const auto &TC =
11154 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011155 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011156
11157 ArgStringList CmdArgs;
11158 CmdArgs.push_back("--cuda");
11159 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11160 CmdArgs.push_back(Args.MakeArgString("--create"));
11161 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11162
11163 for (const auto& II : Inputs) {
11164 auto* A = cast<const CudaDeviceAction>(II.getAction());
11165 // We need to pass an Arch of the form "sm_XX" for cubin files and
11166 // "compute_XX" for ptx.
11167 const char *Arch = (II.getType() == types::TY_PP_Asm)
11168 ? A->getComputeArchName()
11169 : A->getGpuArchName();
11170 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11171 Arch + ",file=" + II.getFilename()));
11172 }
11173
11174 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11175 CmdArgs.push_back(Args.MakeArgString(A));
11176
11177 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11178 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11179}