blob: 6172baac43a89a8a6922a6d10a419c14ec1acf4a [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;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001820
1821 // If an explicit debugger tuning argument appeared, pass it along.
1822 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1823 options::OPT_ggdbN_Group)) {
1824 if (A->getOption().matches(options::OPT_glldb))
1825 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1826 else if (A->getOption().matches(options::OPT_gsce))
1827 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1828 else
1829 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1830 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001831}
1832
Sanjay Patel2987c292015-06-11 14:53:41 +00001833/// This is a helper function for validating the optional refinement step
1834/// parameter in reciprocal argument strings. Return false if there is an error
1835/// parsing the refinement step. Otherwise, return true and set the Position
1836/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001837static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001838 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001839 const char RefinementStepToken = ':';
1840 Position = In.find(RefinementStepToken);
1841 if (Position != StringRef::npos) {
1842 StringRef Option = A.getOption().getName();
1843 StringRef RefStep = In.substr(Position + 1);
1844 // Allow exactly one numeric character for the additional refinement
1845 // step parameter. This is reasonable for all currently-supported
1846 // operations and architectures because we would expect that a larger value
1847 // of refinement steps would cause the estimate "optimization" to
1848 // under-perform the native operation. Also, if the estimate does not
1849 // converge quickly, it probably will not ever converge, so further
1850 // refinement steps will not produce a better answer.
1851 if (RefStep.size() != 1) {
1852 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1853 return false;
1854 }
1855 char RefStepChar = RefStep[0];
1856 if (RefStepChar < '0' || RefStepChar > '9') {
1857 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1858 return false;
1859 }
1860 }
1861 return true;
1862}
1863
1864/// The -mrecip flag requires processing of many optional parameters.
1865static void ParseMRecip(const Driver &D, const ArgList &Args,
1866 ArgStringList &OutStrings) {
1867 StringRef DisabledPrefixIn = "!";
1868 StringRef DisabledPrefixOut = "!";
1869 StringRef EnabledPrefixOut = "";
1870 StringRef Out = "-mrecip=";
1871
1872 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1873 if (!A)
1874 return;
1875
1876 unsigned NumOptions = A->getNumValues();
1877 if (NumOptions == 0) {
1878 // No option is the same as "all".
1879 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1880 return;
1881 }
1882
1883 // Pass through "all", "none", or "default" with an optional refinement step.
1884 if (NumOptions == 1) {
1885 StringRef Val = A->getValue(0);
1886 size_t RefStepLoc;
1887 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1888 return;
1889 StringRef ValBase = Val.slice(0, RefStepLoc);
1890 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1891 OutStrings.push_back(Args.MakeArgString(Out + Val));
1892 return;
1893 }
1894 }
1895
1896 // Each reciprocal type may be enabled or disabled individually.
1897 // Check each input value for validity, concatenate them all back together,
1898 // and pass through.
1899
1900 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 OptionStrings.insert(std::make_pair("divd", false));
1902 OptionStrings.insert(std::make_pair("divf", false));
1903 OptionStrings.insert(std::make_pair("vec-divd", false));
1904 OptionStrings.insert(std::make_pair("vec-divf", false));
1905 OptionStrings.insert(std::make_pair("sqrtd", false));
1906 OptionStrings.insert(std::make_pair("sqrtf", false));
1907 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1908 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001909
1910 for (unsigned i = 0; i != NumOptions; ++i) {
1911 StringRef Val = A->getValue(i);
1912
1913 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1914 // Ignore the disablement token for string matching.
1915 if (IsDisabled)
1916 Val = Val.substr(1);
1917
1918 size_t RefStep;
1919 if (!getRefinementStep(Val, D, *A, RefStep))
1920 return;
1921
1922 StringRef ValBase = Val.slice(0, RefStep);
1923 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1924 if (OptionIter == OptionStrings.end()) {
1925 // Try again specifying float suffix.
1926 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1927 if (OptionIter == OptionStrings.end()) {
1928 // The input name did not match any known option string.
1929 D.Diag(diag::err_drv_unknown_argument) << Val;
1930 return;
1931 }
1932 // The option was specified without a float or double suffix.
1933 // Make sure that the double entry was not already specified.
1934 // The float entry will be checked below.
1935 if (OptionStrings[ValBase.str() + 'd']) {
1936 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1937 return;
1938 }
1939 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001940
Sanjay Patel2987c292015-06-11 14:53:41 +00001941 if (OptionIter->second == true) {
1942 // Duplicate option specified.
1943 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1944 return;
1945 }
1946
1947 // Mark the matched option as found. Do not allow duplicate specifiers.
1948 OptionIter->second = true;
1949
1950 // If the precision was not specified, also mark the double entry as found.
1951 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1952 OptionStrings[ValBase.str() + 'd'] = true;
1953
1954 // Build the output string.
1955 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1956 Out = Args.MakeArgString(Out + Prefix + Val);
1957 if (i != NumOptions - 1)
1958 Out = Args.MakeArgString(Out + ",");
1959 }
1960
1961 OutStrings.push_back(Args.MakeArgString(Out));
1962}
1963
Eric Christopherc54920a2015-03-23 19:26:05 +00001964static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001965 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001966 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001967 // If -march=native, autodetect the feature list.
1968 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1969 if (StringRef(A->getValue()) == "native") {
1970 llvm::StringMap<bool> HostFeatures;
1971 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1972 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 Features.push_back(
1974 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001975 }
1976 }
1977
Jim Grosbach82eee262013-11-16 00:53:35 +00001978 if (Triple.getArchName() == "x86_64h") {
1979 // x86_64h implies quite a few of the more modern subtarget features
1980 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1981 Features.push_back("-rdrnd");
1982 Features.push_back("-aes");
1983 Features.push_back("-pclmul");
1984 Features.push_back("-rtm");
1985 Features.push_back("-hle");
1986 Features.push_back("-fsgsbase");
1987 }
1988
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001990 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001991 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001992 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001993 Features.push_back("+sse4.2");
1994 Features.push_back("+popcnt");
1995 } else
1996 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001997 }
1998
Eric Christopherc54920a2015-03-23 19:26:05 +00001999 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002000 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2001 StringRef Arch = A->getValue();
2002 bool ArchUsed = false;
2003 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002004 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002005 if (Arch == "AVX" || Arch == "AVX2") {
2006 ArchUsed = true;
2007 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2008 }
2009 }
2010 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002011 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002012 if (Arch == "IA32") {
2013 ArchUsed = true;
2014 } else if (Arch == "SSE" || Arch == "SSE2") {
2015 ArchUsed = true;
2016 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2017 }
2018 }
2019 if (!ArchUsed)
2020 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2021 }
2022
Jim Grosbach82eee262013-11-16 00:53:35 +00002023 // Now add any that the user explicitly requested on the command line,
2024 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002025 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002026}
2027
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002028void Clang::AddX86TargetArgs(const ArgList &Args,
2029 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002031 Args.hasArg(options::OPT_mkernel) ||
2032 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002033 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002034
Bob Wilson2616e2e2013-02-10 16:01:41 +00002035 // Default to avoid implicit floating-point for kernel/kext code, but allow
2036 // that to be overridden with -mno-soft-float.
2037 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2038 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002039 if (Arg *A = Args.getLastArg(
2040 options::OPT_msoft_float, options::OPT_mno_soft_float,
2041 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002042 const Option &O = A->getOption();
2043 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2044 O.matches(options::OPT_msoft_float));
2045 }
2046 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002047 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002048
2049 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2050 StringRef Value = A->getValue();
2051 if (Value == "intel" || Value == "att") {
2052 CmdArgs.push_back("-mllvm");
2053 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2054 } else {
2055 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2056 << A->getOption().getName() << Value;
2057 }
2058 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002059}
2060
Tony Linthicum76329bf2011-12-12 21:14:55 +00002061void Clang::AddHexagonTargetArgs(const ArgList &Args,
2062 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002063 CmdArgs.push_back("-mqdsp6-compat");
2064 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002065
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002066 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2067 std::string N = llvm::utostr(G.getValue());
2068 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002069 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002070 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002071 }
2072
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002073 if (!Args.hasArg(options::OPT_fno_short_enums))
2074 CmdArgs.push_back("-fshort-enums");
2075 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 CmdArgs.push_back("-mllvm");
2077 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002078 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 CmdArgs.push_back("-mllvm");
2080 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002081}
2082
Dan Gohmane3d71e12016-01-07 01:00:21 +00002083void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2084 ArgStringList &CmdArgs) const {
2085 // Default to "hidden" visibility.
2086 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2087 options::OPT_fvisibility_ms_compat)) {
2088 CmdArgs.push_back("-fvisibility");
2089 CmdArgs.push_back("hidden");
2090 }
2091}
2092
Kevin Qin110db6f2014-07-18 07:03:22 +00002093// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002094static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002095 std::vector<const char *> &Features) {
2096 SmallVector<StringRef, 8> Split;
2097 text.split(Split, StringRef("+"), -1, false);
2098
Benjamin Kramer72e64312015-09-24 14:48:49 +00002099 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002100 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002101 .Case("fp", "+fp-armv8")
2102 .Case("simd", "+neon")
2103 .Case("crc", "+crc")
2104 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002105 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002106 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002107 .Case("nofp", "-fp-armv8")
2108 .Case("nosimd", "-neon")
2109 .Case("nocrc", "-crc")
2110 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002111 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002112 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002113 .Default(nullptr);
2114 if (result)
2115 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002116 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002117 D.Diag(diag::err_drv_no_neon_modifier);
2118 else
2119 return false;
2120 }
2121 return true;
2122}
2123
2124// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2125// decode CPU and feature.
2126static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2127 std::vector<const char *> &Features) {
2128 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2129 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002130 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002131 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002132 Features.push_back("+neon");
2133 Features.push_back("+crc");
2134 Features.push_back("+crypto");
2135 } else if (CPU == "generic") {
2136 Features.push_back("+neon");
2137 } else {
2138 return false;
2139 }
2140
2141 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2142 return false;
2143
2144 return true;
2145}
2146
2147static bool
2148getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2149 const ArgList &Args,
2150 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002151 std::string MarchLowerCase = March.lower();
2152 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002154 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002155 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002156 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002157 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002158 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2159 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002160 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002161 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002162 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002163
2164 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2165 return false;
2166
2167 return true;
2168}
2169
2170static bool
2171getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2172 const ArgList &Args,
2173 std::vector<const char *> &Features) {
2174 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002175 std::string McpuLowerCase = Mcpu.lower();
2176 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002177 return false;
2178
2179 return true;
2180}
2181
2182static bool
2183getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2184 const ArgList &Args,
2185 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002186 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002187 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002188 if (MtuneLowerCase == "native")
2189 MtuneLowerCase = llvm::sys::getHostCPUName();
2190 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002191 Features.push_back("+zcm");
2192 Features.push_back("+zcz");
2193 }
2194 return true;
2195}
2196
2197static bool
2198getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2199 const ArgList &Args,
2200 std::vector<const char *> &Features) {
2201 StringRef CPU;
2202 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002203 std::string McpuLowerCase = Mcpu.lower();
2204 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002205 return false;
2206
2207 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2208}
2209
Justin Bognerf9052562015-11-13 23:07:31 +00002210static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002211 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 Arg *A;
2213 bool success = true;
2214 // Enable NEON by default.
2215 Features.push_back("+neon");
2216 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2217 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2218 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2219 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002220 else if (Args.hasArg(options::OPT_arch))
2221 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2222 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002223
2224 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2225 success =
2226 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2227 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2228 success =
2229 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002230 else if (Args.hasArg(options::OPT_arch))
2231 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2232 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002233
2234 if (!success)
2235 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002236
2237 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2238 Features.push_back("-fp-armv8");
2239 Features.push_back("-crypto");
2240 Features.push_back("-neon");
2241 }
Bradley Smith418c5932014-05-02 15:17:51 +00002242
2243 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002244 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002245 if (A->getOption().matches(options::OPT_mcrc))
2246 Features.push_back("+crc");
2247 else
2248 Features.push_back("-crc");
2249 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002250
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002251 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2252 options::OPT_munaligned_access))
2253 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2254 Features.push_back("+strict-align");
2255
Justin Bognerf9052562015-11-13 23:07:31 +00002256 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002257 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002258}
2259
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002260static void getHexagonTargetFeatures(const ArgList &Args,
2261 std::vector<const char *> &Features) {
2262 bool HasHVX = false, HasHVXD = false;
2263
Eric Christopher49062a52015-12-22 03:12:34 +00002264 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2265 // doing dependent option handling here rather than in initFeatureMap or a
2266 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002267 for (auto &A : Args) {
2268 auto &Opt = A->getOption();
2269 if (Opt.matches(options::OPT_mhexagon_hvx))
2270 HasHVX = true;
2271 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2272 HasHVXD = HasHVX = false;
2273 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2274 HasHVXD = HasHVX = true;
2275 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2276 HasHVXD = false;
2277 else
2278 continue;
2279 A->claim();
2280 }
2281
2282 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2283 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2284}
2285
Dan Gohmanc2853072015-09-03 22:51:53 +00002286static void getWebAssemblyTargetFeatures(const ArgList &Args,
2287 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002288 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002289}
2290
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002291static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002292 const ArgList &Args, ArgStringList &CmdArgs,
2293 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002294 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002295 std::vector<const char *> Features;
2296 switch (Triple.getArch()) {
2297 default:
2298 break;
2299 case llvm::Triple::mips:
2300 case llvm::Triple::mipsel:
2301 case llvm::Triple::mips64:
2302 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002303 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002304 break;
2305
2306 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002307 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002308 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002309 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002310 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002311 break;
2312
2313 case llvm::Triple::ppc:
2314 case llvm::Triple::ppc64:
2315 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002316 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002317 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002318 case llvm::Triple::systemz:
2319 getSystemZTargetFeatures(Args, Features);
2320 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002321 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002322 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002323 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002324 break;
2325 case llvm::Triple::x86:
2326 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002327 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002328 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002329 case llvm::Triple::hexagon:
2330 getHexagonTargetFeatures(Args, Features);
2331 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002332 case llvm::Triple::wasm32:
2333 case llvm::Triple::wasm64:
2334 getWebAssemblyTargetFeatures(Args, Features);
2335 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002336 }
Rafael Espindola43964802013-08-21 17:34:32 +00002337
2338 // Find the last of each feature.
2339 llvm::StringMap<unsigned> LastOpt;
2340 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2341 const char *Name = Features[I];
2342 assert(Name[0] == '-' || Name[0] == '+');
2343 LastOpt[Name + 1] = I;
2344 }
2345
2346 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2347 // If this feature was overridden, ignore it.
2348 const char *Name = Features[I];
2349 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2350 assert(LastI != LastOpt.end());
2351 unsigned Last = LastI->second;
2352 if (Last != I)
2353 continue;
2354
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002355 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002356 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002357 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002358}
2359
David Majnemerae394812014-12-09 00:12:30 +00002360static bool
2361shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2362 const llvm::Triple &Triple) {
2363 // We use the zero-cost exception tables for Objective-C if the non-fragile
2364 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2365 // later.
2366 if (runtime.isNonFragile())
2367 return true;
2368
2369 if (!Triple.isMacOSX())
2370 return false;
2371
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002372 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002373 (Triple.getArch() == llvm::Triple::x86_64 ||
2374 Triple.getArch() == llvm::Triple::arm));
2375}
2376
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002377/// Adds exception related arguments to the driver command arguments. There's a
2378/// master flag, -fexceptions and also language specific flags to enable/disable
2379/// C++ and Objective-C exceptions. This makes it possible to for example
2380/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002381static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002382 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002383 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002384 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002385 const Driver &D = TC.getDriver();
2386 const llvm::Triple &Triple = TC.getTriple();
2387
Chad Rosier4fab82c2012-03-26 22:04:46 +00002388 if (KernelOrKext) {
2389 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2390 // arguments now to avoid warnings about unused arguments.
2391 Args.ClaimAllArgs(options::OPT_fexceptions);
2392 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2393 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2395 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2396 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002397 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002398 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002399
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002400 // See if the user explicitly enabled exceptions.
2401 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2402 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002403
David Majnemerae394812014-12-09 00:12:30 +00002404 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2405 // is not necessarily sensible, but follows GCC.
2406 if (types::isObjC(InputType) &&
2407 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002408 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002409 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002410
David Majnemerae394812014-12-09 00:12:30 +00002411 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002412 }
2413
2414 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002415 // Disable C++ EH by default on XCore, PS4, and MSVC.
2416 // FIXME: Remove MSVC from this list once things work.
2417 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2418 !Triple.isPS4CPU() &&
2419 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002420 Arg *ExceptionArg = Args.getLastArg(
2421 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2422 options::OPT_fexceptions, options::OPT_fno_exceptions);
2423 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002424 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002425 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2426 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002427
2428 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002429 if (Triple.isPS4CPU()) {
2430 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2431 assert(ExceptionArg &&
2432 "On the PS4 exceptions should only be enabled if passing "
2433 "an argument");
2434 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2435 const Arg *RTTIArg = TC.getRTTIArg();
2436 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2437 D.Diag(diag::err_drv_argument_not_allowed_with)
2438 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2439 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2440 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2441 } else
2442 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2443
Anders Carlssone96ab552011-02-28 02:27:16 +00002444 CmdArgs.push_back("-fcxx-exceptions");
2445
David Majnemer8de68642014-12-05 08:11:58 +00002446 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002447 }
2448 }
2449
David Majnemer8de68642014-12-05 08:11:58 +00002450 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002451 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002452}
2453
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002454static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002455 bool Default = true;
2456 if (TC.getTriple().isOSDarwin()) {
2457 // The native darwin assembler doesn't support the linker_option directives,
2458 // so we disable them if we think the .s file will be passed to it.
2459 Default = TC.useIntegratedAs();
2460 }
2461 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2462 Default);
2463}
2464
Ted Kremenek62093662013-03-12 17:02:12 +00002465static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2466 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 bool UseDwarfDirectory =
2468 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2469 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002470 return !UseDwarfDirectory;
2471}
2472
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002473/// \brief Check whether the given input tree contains any compilation actions.
2474static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002475 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002476 return true;
2477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002478 for (const auto &Act : *A)
2479 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002480 return true;
2481
2482 return false;
2483}
2484
2485/// \brief Check if -relax-all should be passed to the internal assembler.
2486/// This is done by default when compiling non-assembler source with -O0.
2487static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2488 bool RelaxDefault = true;
2489
2490 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2491 RelaxDefault = A->getOption().matches(options::OPT_O0);
2492
2493 if (RelaxDefault) {
2494 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002495 for (const auto &Act : C.getActions()) {
2496 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002497 RelaxDefault = true;
2498 break;
2499 }
2500 }
2501 }
2502
2503 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002504 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002505}
2506
Paul Robinson0334a042015-12-19 19:41:48 +00002507// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2508// to the corresponding DebugInfoKind.
2509static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2510 assert(A.getOption().matches(options::OPT_gN_Group) &&
2511 "Not a -g option that specifies a debug-info level");
2512 if (A.getOption().matches(options::OPT_g0) ||
2513 A.getOption().matches(options::OPT_ggdb0))
2514 return CodeGenOptions::NoDebugInfo;
2515 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2516 A.getOption().matches(options::OPT_ggdb1))
2517 return CodeGenOptions::DebugLineTablesOnly;
2518 return CodeGenOptions::LimitedDebugInfo;
2519}
2520
Douglas Katzman3459ce22015-10-08 04:24:12 +00002521// Extract the integer N from a string spelled "-dwarf-N", returning 0
2522// on mismatch. The StringRef input (rather than an Arg) allows
2523// for use by the "-Xassembler" option parser.
2524static unsigned DwarfVersionNum(StringRef ArgValue) {
2525 return llvm::StringSwitch<unsigned>(ArgValue)
2526 .Case("-gdwarf-2", 2)
2527 .Case("-gdwarf-3", 3)
2528 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002529 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002530 .Default(0);
2531}
2532
2533static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2534 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002535 unsigned DwarfVersion,
2536 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002537 switch (DebugInfoKind) {
2538 case CodeGenOptions::DebugLineTablesOnly:
2539 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2540 break;
2541 case CodeGenOptions::LimitedDebugInfo:
2542 CmdArgs.push_back("-debug-info-kind=limited");
2543 break;
2544 case CodeGenOptions::FullDebugInfo:
2545 CmdArgs.push_back("-debug-info-kind=standalone");
2546 break;
2547 default:
2548 break;
2549 }
2550 if (DwarfVersion > 0)
2551 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002552 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002553 switch (DebuggerTuning) {
2554 case llvm::DebuggerKind::GDB:
2555 CmdArgs.push_back("-debugger-tuning=gdb");
2556 break;
2557 case llvm::DebuggerKind::LLDB:
2558 CmdArgs.push_back("-debugger-tuning=lldb");
2559 break;
2560 case llvm::DebuggerKind::SCE:
2561 CmdArgs.push_back("-debugger-tuning=sce");
2562 break;
2563 default:
2564 break;
2565 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002566}
2567
David Blaikie9260ed62013-07-25 21:19:01 +00002568static void CollectArgsForIntegratedAssembler(Compilation &C,
2569 const ArgList &Args,
2570 ArgStringList &CmdArgs,
2571 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002572 if (UseRelaxAll(C, Args))
2573 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002574
David Majnemer2b9349d2015-12-21 22:09:34 +00002575 // Only default to -mincremental-linker-compatible if we think we are
2576 // targeting the MSVC linker.
2577 bool DefaultIncrementalLinkerCompatible =
2578 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2579 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2580 options::OPT_mno_incremental_linker_compatible,
2581 DefaultIncrementalLinkerCompatible))
2582 CmdArgs.push_back("-mincremental-linker-compatible");
2583
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002584 // When passing -I arguments to the assembler we sometimes need to
2585 // unconditionally take the next argument. For example, when parsing
2586 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2587 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2588 // arg after parsing the '-I' arg.
2589 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002591 // When using an integrated assembler, translate -Wa, and -Xassembler
2592 // options.
2593 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002594 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002595 for (const Arg *A :
2596 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2597 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002598
Benjamin Kramer72e64312015-09-24 14:48:49 +00002599 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002600 if (TakeNextArg) {
2601 CmdArgs.push_back(Value.data());
2602 TakeNextArg = false;
2603 continue;
2604 }
David Blaikie9260ed62013-07-25 21:19:01 +00002605
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002606 switch (C.getDefaultToolChain().getArch()) {
2607 default:
2608 break;
2609 case llvm::Triple::mips:
2610 case llvm::Triple::mipsel:
2611 case llvm::Triple::mips64:
2612 case llvm::Triple::mips64el:
2613 if (Value == "--trap") {
2614 CmdArgs.push_back("-target-feature");
2615 CmdArgs.push_back("+use-tcc-in-div");
2616 continue;
2617 }
2618 if (Value == "--break") {
2619 CmdArgs.push_back("-target-feature");
2620 CmdArgs.push_back("-use-tcc-in-div");
2621 continue;
2622 }
2623 if (Value.startswith("-msoft-float")) {
2624 CmdArgs.push_back("-target-feature");
2625 CmdArgs.push_back("+soft-float");
2626 continue;
2627 }
2628 if (Value.startswith("-mhard-float")) {
2629 CmdArgs.push_back("-target-feature");
2630 CmdArgs.push_back("-soft-float");
2631 continue;
2632 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002633
2634 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2635 .Case("-mips1", "+mips1")
2636 .Case("-mips2", "+mips2")
2637 .Case("-mips3", "+mips3")
2638 .Case("-mips4", "+mips4")
2639 .Case("-mips5", "+mips5")
2640 .Case("-mips32", "+mips32")
2641 .Case("-mips32r2", "+mips32r2")
2642 .Case("-mips32r3", "+mips32r3")
2643 .Case("-mips32r5", "+mips32r5")
2644 .Case("-mips32r6", "+mips32r6")
2645 .Case("-mips64", "+mips64")
2646 .Case("-mips64r2", "+mips64r2")
2647 .Case("-mips64r3", "+mips64r3")
2648 .Case("-mips64r5", "+mips64r5")
2649 .Case("-mips64r6", "+mips64r6")
2650 .Default(nullptr);
2651 if (MipsTargetFeature)
2652 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002653 }
2654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002655 if (Value == "-force_cpusubtype_ALL") {
2656 // Do nothing, this is the default and we don't support anything else.
2657 } else if (Value == "-L") {
2658 CmdArgs.push_back("-msave-temp-labels");
2659 } else if (Value == "--fatal-warnings") {
2660 CmdArgs.push_back("-massembler-fatal-warnings");
2661 } else if (Value == "--noexecstack") {
2662 CmdArgs.push_back("-mnoexecstack");
2663 } else if (Value == "-compress-debug-sections" ||
2664 Value == "--compress-debug-sections") {
2665 CompressDebugSections = true;
2666 } else if (Value == "-nocompress-debug-sections" ||
2667 Value == "--nocompress-debug-sections") {
2668 CompressDebugSections = false;
2669 } else if (Value.startswith("-I")) {
2670 CmdArgs.push_back(Value.data());
2671 // We need to consume the next argument if the current arg is a plain
2672 // -I. The next arg will be the include directory.
2673 if (Value == "-I")
2674 TakeNextArg = true;
2675 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002676 // "-gdwarf-N" options are not cc1as options.
2677 unsigned DwarfVersion = DwarfVersionNum(Value);
2678 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2679 CmdArgs.push_back(Value.data());
2680 } else {
2681 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002682 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2683 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002684 }
Renato Golin7c542b42015-07-27 23:44:45 +00002685 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2686 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2687 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002688 } else {
2689 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002690 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002691 }
2692 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 }
2694 if (CompressDebugSections) {
2695 if (llvm::zlib::isAvailable())
2696 CmdArgs.push_back("-compress-debug-sections");
2697 else
2698 D.Diag(diag::warn_debug_compression_unavailable);
2699 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002700 if (MipsTargetFeature != nullptr) {
2701 CmdArgs.push_back("-target-feature");
2702 CmdArgs.push_back(MipsTargetFeature);
2703 }
David Blaikie9260ed62013-07-25 21:19:01 +00002704}
2705
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002706// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002707// FIXME: Make sure we can also emit shared objects if they're requested
2708// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002709static void addClangRT(const ToolChain &TC, const ArgList &Args,
2710 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002711 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002712}
2713
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002714namespace {
2715enum OpenMPRuntimeKind {
2716 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2717 /// without knowing what runtime to target.
2718 OMPRT_Unknown,
2719
2720 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2721 /// the default for Clang.
2722 OMPRT_OMP,
2723
2724 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2725 /// this runtime but can swallow the pragmas, and find and link against the
2726 /// runtime library itself.
2727 OMPRT_GOMP,
2728
Chandler Carruthc6625c62015-05-28 21:10:31 +00002729 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002730 /// OpenMP runtime. We support this mode for users with existing dependencies
2731 /// on this runtime library name.
2732 OMPRT_IOMP5
2733};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002734}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002735
2736/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002737static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2738 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002739 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2740
2741 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2742 if (A)
2743 RuntimeName = A->getValue();
2744
2745 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002746 .Case("libomp", OMPRT_OMP)
2747 .Case("libgomp", OMPRT_GOMP)
2748 .Case("libiomp5", OMPRT_IOMP5)
2749 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002750
2751 if (RT == OMPRT_Unknown) {
2752 if (A)
2753 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002754 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002755 else
2756 // FIXME: We could use a nicer diagnostic here.
2757 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2758 }
2759
2760 return RT;
2761}
2762
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002763static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2764 const ArgList &Args) {
2765 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2766 options::OPT_fno_openmp, false))
2767 return;
2768
2769 switch (getOpenMPRuntime(TC, Args)) {
2770 case OMPRT_OMP:
2771 CmdArgs.push_back("-lomp");
2772 break;
2773 case OMPRT_GOMP:
2774 CmdArgs.push_back("-lgomp");
2775 break;
2776 case OMPRT_IOMP5:
2777 CmdArgs.push_back("-liomp5");
2778 break;
2779 case OMPRT_Unknown:
2780 // Already diagnosed.
2781 break;
2782 }
2783}
2784
Alexey Samsonov52550342014-09-15 19:58:40 +00002785static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2786 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002787 bool IsShared, bool IsWhole) {
2788 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002789 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002790 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002791 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002792 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002793}
2794
Alexey Samsonov52550342014-09-15 19:58:40 +00002795// Tries to use a file with the list of dynamic symbols that need to be exported
2796// from the runtime library. Returns true if the file was found.
2797static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2798 ArgStringList &CmdArgs,
2799 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002800 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002801 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2802 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002803 return true;
2804 }
2805 return false;
2806}
2807
2808static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2809 ArgStringList &CmdArgs) {
2810 // Force linking against the system libraries sanitizers depends on
2811 // (see PR15823 why this is necessary).
2812 CmdArgs.push_back("--no-as-needed");
2813 CmdArgs.push_back("-lpthread");
2814 CmdArgs.push_back("-lrt");
2815 CmdArgs.push_back("-lm");
2816 // There's no libdl on FreeBSD.
2817 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2818 CmdArgs.push_back("-ldl");
2819}
2820
2821static void
2822collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2823 SmallVectorImpl<StringRef> &SharedRuntimes,
2824 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002825 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2826 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2827 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002828 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2829 // Collect shared runtimes.
2830 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2831 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002832 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002833 // The stats_client library is also statically linked into DSOs.
2834 if (SanArgs.needsStatsRt())
2835 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002836
Alexey Samsonov52550342014-09-15 19:58:40 +00002837 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002838 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002839 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002840 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002841 }
2842 if (SanArgs.needsAsanRt()) {
2843 if (SanArgs.needsSharedAsanRt()) {
2844 HelperStaticRuntimes.push_back("asan-preinit");
2845 } else {
2846 StaticRuntimes.push_back("asan");
2847 if (SanArgs.linkCXXRuntimes())
2848 StaticRuntimes.push_back("asan_cxx");
2849 }
2850 }
2851 if (SanArgs.needsDfsanRt())
2852 StaticRuntimes.push_back("dfsan");
2853 if (SanArgs.needsLsanRt())
2854 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002855 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002856 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002857 if (SanArgs.linkCXXRuntimes())
2858 StaticRuntimes.push_back("msan_cxx");
2859 }
2860 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002861 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002862 if (SanArgs.linkCXXRuntimes())
2863 StaticRuntimes.push_back("tsan_cxx");
2864 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002865 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002866 StaticRuntimes.push_back("ubsan_standalone");
2867 if (SanArgs.linkCXXRuntimes())
2868 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002869 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002870 if (SanArgs.needsSafeStackRt())
2871 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002872 if (SanArgs.needsCfiRt())
2873 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002874 if (SanArgs.needsCfiDiagRt())
2875 StaticRuntimes.push_back("cfi_diag");
Peter Collingbournedc134532016-01-16 00:31:22 +00002876 if (SanArgs.needsStatsRt()) {
2877 NonWholeStaticRuntimes.push_back("stats");
2878 RequiredSymbols.push_back("__sanitizer_stats_register");
2879 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002880}
2881
Alexey Samsonov52550342014-09-15 19:58:40 +00002882// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2883// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2884static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002885 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002886 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002887 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002888 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002889 NonWholeStaticRuntimes, HelperStaticRuntimes,
2890 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002891 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002892 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002894 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002895 bool AddExportDynamic = false;
2896 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002897 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002898 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2899 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002900 for (auto RT : NonWholeStaticRuntimes) {
2901 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2902 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2903 }
2904 for (auto S : RequiredSymbols) {
2905 CmdArgs.push_back("-u");
2906 CmdArgs.push_back(Args.MakeArgString(S));
2907 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002908 // If there is a static runtime with no dynamic list, force all the symbols
2909 // to be dynamic to be sure we export sanitizer interface functions.
2910 if (AddExportDynamic)
2911 CmdArgs.push_back("-export-dynamic");
2912 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002913}
2914
Reid Kleckner86ea7702015-02-04 23:45:07 +00002915static bool areOptimizationsEnabled(const ArgList &Args) {
2916 // Find the last -O arg and see if it is non-zero.
2917 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2918 return !A->getOption().matches(options::OPT_O0);
2919 // Defaults to -O0.
2920 return false;
2921}
2922
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002923static bool shouldUseFramePointerForTarget(const ArgList &Args,
2924 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002925 switch (Triple.getArch()) {
2926 case llvm::Triple::xcore:
2927 case llvm::Triple::wasm32:
2928 case llvm::Triple::wasm64:
2929 // XCore never wants frame pointers, regardless of OS.
2930 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002931 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002932 default:
2933 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002934 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002935
2936 if (Triple.isOSLinux()) {
2937 switch (Triple.getArch()) {
2938 // Don't use a frame pointer on linux if optimizing for certain targets.
2939 case llvm::Triple::mips64:
2940 case llvm::Triple::mips64el:
2941 case llvm::Triple::mips:
2942 case llvm::Triple::mipsel:
2943 case llvm::Triple::systemz:
2944 case llvm::Triple::x86:
2945 case llvm::Triple::x86_64:
2946 return !areOptimizationsEnabled(Args);
2947 default:
2948 return true;
2949 }
2950 }
2951
2952 if (Triple.isOSWindows()) {
2953 switch (Triple.getArch()) {
2954 case llvm::Triple::x86:
2955 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002956 case llvm::Triple::arm:
2957 case llvm::Triple::thumb:
2958 // Windows on ARM builds with FPO disabled to aid fast stack walking
2959 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002960 default:
2961 // All other supported Windows ISAs use xdata unwind information, so frame
2962 // pointers are not generally useful.
2963 return false;
2964 }
2965 }
2966
2967 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002968}
2969
Rafael Espindola224dd632011-12-14 21:02:23 +00002970static bool shouldUseFramePointer(const ArgList &Args,
2971 const llvm::Triple &Triple) {
2972 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2973 options::OPT_fomit_frame_pointer))
2974 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002975 if (Args.hasArg(options::OPT_pg))
2976 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002977
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002978 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002979}
2980
Eric Christopherb7d97e92013-04-03 01:58:53 +00002981static bool shouldUseLeafFramePointer(const ArgList &Args,
2982 const llvm::Triple &Triple) {
2983 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2984 options::OPT_momit_leaf_frame_pointer))
2985 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002986 if (Args.hasArg(options::OPT_pg))
2987 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002988
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002989 if (Triple.isPS4CPU())
2990 return false;
2991
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002992 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002993}
2994
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002995/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002996static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002997 SmallString<128> cwd;
2998 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002999 CmdArgs.push_back("-fdebug-compilation-dir");
3000 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003001 }
3002}
3003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003004static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003005 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3006 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3007 SmallString<128> T(FinalOutput->getValue());
3008 llvm::sys::path::replace_extension(T, "dwo");
3009 return Args.MakeArgString(T);
3010 } else {
3011 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003012 SmallString<128> T(
3013 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003014 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003015 llvm::sys::path::replace_extension(F, "dwo");
3016 T += F;
3017 return Args.MakeArgString(F);
3018 }
3019}
3020
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003021static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3022 const JobAction &JA, const ArgList &Args,
3023 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003024 ArgStringList ExtractArgs;
3025 ExtractArgs.push_back("--extract-dwo");
3026
3027 ArgStringList StripArgs;
3028 StripArgs.push_back("--strip-dwo");
3029
3030 // Grabbing the output of the earlier compile step.
3031 StripArgs.push_back(Output.getFilename());
3032 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003033 ExtractArgs.push_back(OutFile);
3034
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003035 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003036 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003037
3038 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003039 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003040
3041 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003042 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003043}
3044
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003045/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003046/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3047static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003048 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003049 if (A->getOption().matches(options::OPT_O4) ||
3050 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003051 return true;
3052
3053 if (A->getOption().matches(options::OPT_O0))
3054 return false;
3055
3056 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3057
Rafael Espindola91780de2013-08-26 14:05:41 +00003058 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003059 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003060 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003061 return true;
3062
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003063 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003064 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003065 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003066
3067 unsigned OptLevel = 0;
3068 if (S.getAsInteger(10, OptLevel))
3069 return false;
3070
3071 return OptLevel > 1;
3072 }
3073
3074 return false;
3075}
3076
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003077/// Add -x lang to \p CmdArgs for \p Input.
3078static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3079 ArgStringList &CmdArgs) {
3080 // When using -verify-pch, we don't want to provide the type
3081 // 'precompiled-header' if it was inferred from the file extension
3082 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3083 return;
3084
3085 CmdArgs.push_back("-x");
3086 if (Args.hasArg(options::OPT_rewrite_objc))
3087 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3088 else
3089 CmdArgs.push_back(types::getTypeName(Input.getType()));
3090}
3091
David Majnemerc371ff02015-03-22 08:39:22 +00003092static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003093 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003094 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003095
3096 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003097 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003098
3099 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003100 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003101 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003102 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003103}
3104
Rafael Espindola577637a2015-01-03 00:06:04 +00003105// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003106// options that build systems might add but are unused when assembling or only
3107// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003108static void claimNoWarnArgs(const ArgList &Args) {
3109 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003110 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003111 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003112 Args.ClaimAllArgs(options::OPT_flto);
3113 Args.ClaimAllArgs(options::OPT_fno_lto);
3114}
3115
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003116static void appendUserToPath(SmallVectorImpl<char> &Result) {
3117#ifdef LLVM_ON_UNIX
3118 const char *Username = getenv("LOGNAME");
3119#else
3120 const char *Username = getenv("USERNAME");
3121#endif
3122 if (Username) {
3123 // Validate that LoginName can be used in a path, and get its length.
3124 size_t Len = 0;
3125 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003126 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003127 Username = nullptr;
3128 break;
3129 }
3130 }
3131
3132 if (Username && Len > 0) {
3133 Result.append(Username, Username + Len);
3134 return;
3135 }
3136 }
3137
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003138// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003139#ifdef LLVM_ON_UNIX
3140 std::string UID = llvm::utostr(getuid());
3141#else
3142 // FIXME: Windows seems to have an 'SID' that might work.
3143 std::string UID = "9999";
3144#endif
3145 Result.append(UID.begin(), UID.end());
3146}
3147
David Majnemere11d3732015-06-08 00:22:46 +00003148VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3149 const llvm::Triple &Triple,
3150 const llvm::opt::ArgList &Args,
3151 bool IsWindowsMSVC) {
3152 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3153 IsWindowsMSVC) ||
3154 Args.hasArg(options::OPT_fmsc_version) ||
3155 Args.hasArg(options::OPT_fms_compatibility_version)) {
3156 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3157 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003158 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003159
3160 if (MSCVersion && MSCompatibilityVersion) {
3161 if (D)
3162 D->Diag(diag::err_drv_argument_not_allowed_with)
3163 << MSCVersion->getAsString(Args)
3164 << MSCompatibilityVersion->getAsString(Args);
3165 return VersionTuple();
3166 }
3167
3168 if (MSCompatibilityVersion) {
3169 VersionTuple MSVT;
3170 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3171 D->Diag(diag::err_drv_invalid_value)
3172 << MSCompatibilityVersion->getAsString(Args)
3173 << MSCompatibilityVersion->getValue();
3174 return MSVT;
3175 }
3176
3177 if (MSCVersion) {
3178 unsigned Version = 0;
3179 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3180 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3181 << MSCVersion->getValue();
3182 return getMSCompatibilityVersion(Version);
3183 }
3184
3185 unsigned Major, Minor, Micro;
3186 Triple.getEnvironmentVersion(Major, Minor, Micro);
3187 if (Major || Minor || Micro)
3188 return VersionTuple(Major, Minor, Micro);
3189
3190 return VersionTuple(18);
3191 }
3192 return VersionTuple();
3193}
3194
Diego Novilloa0545962015-07-10 18:00:07 +00003195static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3196 const InputInfo &Output, const ArgList &Args,
3197 ArgStringList &CmdArgs) {
3198 auto *ProfileGenerateArg = Args.getLastArg(
3199 options::OPT_fprofile_instr_generate,
3200 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003201 options::OPT_fprofile_generate_EQ,
3202 options::OPT_fno_profile_instr_generate);
3203 if (ProfileGenerateArg &&
3204 ProfileGenerateArg->getOption().matches(
3205 options::OPT_fno_profile_instr_generate))
3206 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003207
3208 auto *ProfileUseArg = Args.getLastArg(
3209 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003210 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3211 options::OPT_fno_profile_instr_use);
3212 if (ProfileUseArg &&
3213 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3214 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003215
3216 if (ProfileGenerateArg && ProfileUseArg)
3217 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003218 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003219
Diego Novillo758f3f52015-08-05 21:49:51 +00003220 if (ProfileGenerateArg) {
3221 if (ProfileGenerateArg->getOption().matches(
3222 options::OPT_fprofile_instr_generate_EQ))
3223 ProfileGenerateArg->render(Args, CmdArgs);
3224 else if (ProfileGenerateArg->getOption().matches(
3225 options::OPT_fprofile_generate_EQ)) {
3226 SmallString<128> Path(ProfileGenerateArg->getValue());
3227 llvm::sys::path::append(Path, "default.profraw");
3228 CmdArgs.push_back(
3229 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3230 } else
3231 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3232 }
Diego Novilloa0545962015-07-10 18:00:07 +00003233
Diego Novillo758f3f52015-08-05 21:49:51 +00003234 if (ProfileUseArg) {
3235 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3236 ProfileUseArg->render(Args, CmdArgs);
3237 else if ((ProfileUseArg->getOption().matches(
3238 options::OPT_fprofile_use_EQ) ||
3239 ProfileUseArg->getOption().matches(
3240 options::OPT_fprofile_instr_use))) {
3241 SmallString<128> Path(
3242 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3243 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3244 llvm::sys::path::append(Path, "default.profdata");
3245 CmdArgs.push_back(
3246 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3247 }
Diego Novilloa0545962015-07-10 18:00:07 +00003248 }
3249
3250 if (Args.hasArg(options::OPT_ftest_coverage) ||
3251 Args.hasArg(options::OPT_coverage))
3252 CmdArgs.push_back("-femit-coverage-notes");
3253 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3254 false) ||
3255 Args.hasArg(options::OPT_coverage))
3256 CmdArgs.push_back("-femit-coverage-data");
3257
Diego Novilloc4b94da2015-08-05 23:27:40 +00003258 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3259 options::OPT_fno_coverage_mapping, false) &&
3260 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003261 D.Diag(diag::err_drv_argument_only_allowed_with)
3262 << "-fcoverage-mapping"
3263 << "-fprofile-instr-generate";
3264
Diego Novilloc4b94da2015-08-05 23:27:40 +00003265 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3266 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003267 CmdArgs.push_back("-fcoverage-mapping");
3268
3269 if (C.getArgs().hasArg(options::OPT_c) ||
3270 C.getArgs().hasArg(options::OPT_S)) {
3271 if (Output.isFilename()) {
3272 CmdArgs.push_back("-coverage-file");
3273 SmallString<128> CoverageFilename;
3274 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3275 CoverageFilename = FinalOutput->getValue();
3276 } else {
3277 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3278 }
3279 if (llvm::sys::path::is_relative(CoverageFilename)) {
3280 SmallString<128> Pwd;
3281 if (!llvm::sys::fs::current_path(Pwd)) {
3282 llvm::sys::path::append(Pwd, CoverageFilename);
3283 CoverageFilename.swap(Pwd);
3284 }
3285 }
3286 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3287 }
3288 }
3289}
3290
Paul Robinsond083b9a2015-12-16 17:25:27 +00003291static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3292 ArgStringList &CmdArgs) {
3293 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3294 false) ||
3295 Args.hasFlag(options::OPT_fprofile_generate,
3296 options::OPT_fno_profile_instr_generate, false) ||
3297 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3298 options::OPT_fno_profile_instr_generate, false) ||
3299 Args.hasFlag(options::OPT_fprofile_instr_generate,
3300 options::OPT_fno_profile_instr_generate, false) ||
3301 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3302 options::OPT_fno_profile_instr_generate, false) ||
3303 Args.hasArg(options::OPT_fcreate_profile) ||
3304 Args.hasArg(options::OPT_coverage)))
3305 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3306}
3307
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003308/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3309/// smooshes them together with platform defaults, to decide whether
3310/// this compile should be using PIC mode or not. Returns a tuple of
3311/// (RelocationModel, PICLevel, IsPIE).
3312static std::tuple<llvm::Reloc::Model, unsigned, bool>
3313ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3314 const ArgList &Args) {
3315 // FIXME: why does this code...and so much everywhere else, use both
3316 // ToolChain.getTriple() and Triple?
3317 bool PIE = ToolChain.isPIEDefault();
3318 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003319 // The Darwin/MachO default to use PIC does not apply when using -static.
3320 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3321 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003322 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003323 bool IsPICLevelTwo = PIC;
3324
3325 bool KernelOrKext =
3326 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3327
3328 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003329 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003330 switch (ToolChain.getArch()) {
3331 case llvm::Triple::arm:
3332 case llvm::Triple::armeb:
3333 case llvm::Triple::thumb:
3334 case llvm::Triple::thumbeb:
3335 case llvm::Triple::aarch64:
3336 case llvm::Triple::mips:
3337 case llvm::Triple::mipsel:
3338 case llvm::Triple::mips64:
3339 case llvm::Triple::mips64el:
3340 PIC = true; // "-fpic"
3341 break;
3342
3343 case llvm::Triple::x86:
3344 case llvm::Triple::x86_64:
3345 PIC = true; // "-fPIC"
3346 IsPICLevelTwo = true;
3347 break;
3348
3349 default:
3350 break;
3351 }
3352 }
3353
3354 // OpenBSD-specific defaults for PIE
3355 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3356 switch (ToolChain.getArch()) {
3357 case llvm::Triple::mips64:
3358 case llvm::Triple::mips64el:
3359 case llvm::Triple::sparcel:
3360 case llvm::Triple::x86:
3361 case llvm::Triple::x86_64:
3362 IsPICLevelTwo = false; // "-fpie"
3363 break;
3364
3365 case llvm::Triple::ppc:
3366 case llvm::Triple::sparc:
3367 case llvm::Triple::sparcv9:
3368 IsPICLevelTwo = true; // "-fPIE"
3369 break;
3370
3371 default:
3372 break;
3373 }
3374 }
3375
3376 // The last argument relating to either PIC or PIE wins, and no
3377 // other argument is used. If the last argument is any flavor of the
3378 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3379 // option implicitly enables PIC at the same level.
3380 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3381 options::OPT_fpic, options::OPT_fno_pic,
3382 options::OPT_fPIE, options::OPT_fno_PIE,
3383 options::OPT_fpie, options::OPT_fno_pie);
3384 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3385 // is forced, then neither PIC nor PIE flags will have no effect.
3386 if (!ToolChain.isPICDefaultForced()) {
3387 if (LastPICArg) {
3388 Option O = LastPICArg->getOption();
3389 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3390 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3391 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3392 PIC =
3393 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3394 IsPICLevelTwo =
3395 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3396 } else {
3397 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003398 if (Triple.isPS4CPU()) {
3399 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3400 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3401 if (Model != "kernel") {
3402 PIC = true;
3403 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3404 << LastPICArg->getSpelling();
3405 }
3406 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003407 }
3408 }
3409 }
3410
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003411 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3412 // PIC level would've been set to level 1, force it back to level 2 PIC
3413 // instead.
3414 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003415 IsPICLevelTwo |= ToolChain.isPICDefault();
3416
James Y Knightc4015d32015-08-21 04:14:55 +00003417 // This kernel flags are a trump-card: they will disable PIC/PIE
3418 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003419 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3420 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003421 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003422
3423 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3424 // This is a very special mode. It trumps the other modes, almost no one
3425 // uses it, and it isn't even valid on any OS but Darwin.
3426 if (!ToolChain.getTriple().isOSDarwin())
3427 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3428 << A->getSpelling() << ToolChain.getTriple().str();
3429
3430 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3431
3432 // Only a forced PIC mode can cause the actual compile to have PIC defines
3433 // etc., no flags are sufficient. This behavior was selected to closely
3434 // match that of llvm-gcc and Apple GCC before that.
3435 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3436
3437 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3438 }
3439
3440 if (PIC)
3441 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3442
3443 return std::make_tuple(llvm::Reloc::Static, 0, false);
3444}
3445
3446static const char *RelocationModelName(llvm::Reloc::Model Model) {
3447 switch (Model) {
3448 case llvm::Reloc::Default:
3449 return nullptr;
3450 case llvm::Reloc::Static:
3451 return "static";
3452 case llvm::Reloc::PIC_:
3453 return "pic";
3454 case llvm::Reloc::DynamicNoPIC:
3455 return "dynamic-no-pic";
3456 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003457 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003458}
3459
3460static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3461 ArgStringList &CmdArgs) {
3462 llvm::Reloc::Model RelocationModel;
3463 unsigned PICLevel;
3464 bool IsPIE;
3465 std::tie(RelocationModel, PICLevel, IsPIE) =
3466 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3467
3468 if (RelocationModel != llvm::Reloc::Static)
3469 CmdArgs.push_back("-KPIC");
3470}
3471
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003472void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003473 const InputInfo &Output, const InputInfoList &Inputs,
3474 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003475 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3476 const llvm::Triple Triple(TripleStr);
3477
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003478 bool KernelOrKext =
3479 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003480 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003481 ArgStringList CmdArgs;
3482
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003483 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003484 bool IsWindowsCygnus =
3485 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003486 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003487 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003488
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003489 // Check number of inputs for sanity. We need at least one input.
3490 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003491 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003492 // CUDA compilation may have multiple inputs (source file + results of
3493 // device-side compilations). All other jobs are expected to have exactly one
3494 // input.
3495 bool IsCuda = types::isCuda(Input.getType());
3496 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003497
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003498 // Invoke ourselves in -cc1 mode.
3499 //
3500 // FIXME: Implement custom jobs for internal actions.
3501 CmdArgs.push_back("-cc1");
3502
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003503 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003504 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003505 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003506
Artem Belevichfa11ab52015-11-17 22:28:46 +00003507 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003508 if (IsCuda) {
3509 // FIXME: We need a (better) way to pass information about
3510 // particular compilation pass we're constructing here. For now we
3511 // can check which toolchain we're using and pick the other one to
3512 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003513 if (&getToolChain() == C.getCudaDeviceToolChain())
3514 AuxToolChain = C.getCudaHostToolChain();
3515 else if (&getToolChain() == C.getCudaHostToolChain())
3516 AuxToolChain = C.getCudaDeviceToolChain();
3517 else
3518 llvm_unreachable("Can't figure out CUDA compilation mode.");
3519 assert(AuxToolChain != nullptr && "No aux toolchain.");
3520 CmdArgs.push_back("-aux-triple");
3521 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003522 CmdArgs.push_back("-fcuda-target-overloads");
3523 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003524 }
3525
James Y Knight2db38f32015-08-15 03:45:25 +00003526 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3527 Triple.getArch() == llvm::Triple::thumb)) {
3528 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003529 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003530 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003531 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003532 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003533 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003534 }
3535
Tim Northover336f1892014-03-29 13:16:12 +00003536 // Push all default warning arguments that are specific to
3537 // the given target. These come before user provided warning options
3538 // are provided.
3539 getToolChain().addClangWarningOptions(CmdArgs);
3540
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003541 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003542 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003543
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003544 if (isa<AnalyzeJobAction>(JA)) {
3545 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3546 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003547 } else if (isa<MigrateJobAction>(JA)) {
3548 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003549 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003550 if (Output.getType() == types::TY_Dependencies)
3551 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003552 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003553 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003554 if (Args.hasArg(options::OPT_rewrite_objc) &&
3555 !Args.hasArg(options::OPT_g_Group))
3556 CmdArgs.push_back("-P");
3557 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003558 } else if (isa<AssembleJobAction>(JA)) {
3559 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003560
David Blaikie9260ed62013-07-25 21:19:01 +00003561 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003562
3563 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003565 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003566 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003567 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003568
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003569 if (JA.getType() == types::TY_Nothing)
3570 CmdArgs.push_back("-fsyntax-only");
3571 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003572 CmdArgs.push_back("-emit-pch");
3573 else
3574 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003575 } else if (isa<VerifyPCHJobAction>(JA)) {
3576 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003577 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003578 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3579 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003580 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003581 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003582 } else if (JA.getType() == types::TY_LLVM_IR ||
3583 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003585 } else if (JA.getType() == types::TY_LLVM_BC ||
3586 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 CmdArgs.push_back("-emit-llvm-bc");
3588 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003589 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003590 } else if (JA.getType() == types::TY_AST) {
3591 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003592 } else if (JA.getType() == types::TY_ModuleFile) {
3593 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003594 } else if (JA.getType() == types::TY_RewrittenObjC) {
3595 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003596 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003597 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3598 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003599 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003600 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003601 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003602 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003603
3604 // Preserve use-list order by default when emitting bitcode, so that
3605 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3606 // same result as running passes here. For LTO, we don't need to preserve
3607 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003608 if (JA.getType() == types::TY_LLVM_BC)
3609 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003610
3611 if (D.isUsingLTO())
3612 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003613 }
3614
Teresa Johnsonaff22322015-12-07 19:21:34 +00003615 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3616 if (!types::isLLVMIR(Input.getType()))
3617 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3618 << "-x ir";
3619 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3620 }
3621
Justin Bognera88f0122014-06-20 22:59:50 +00003622 // We normally speed up the clang process a bit by skipping destructors at
3623 // exit, but when we're generating diagnostics we can rely on some of the
3624 // cleanup.
3625 if (!C.isForDiagnostics())
3626 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003628// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003629#ifdef NDEBUG
3630 CmdArgs.push_back("-disable-llvm-verifier");
3631#endif
3632
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003633 // Set the main file name, so that debug info works even with
3634 // -save-temps.
3635 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003636 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003637
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003638 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003639 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003640 if (Args.hasArg(options::OPT_static))
3641 CmdArgs.push_back("-static-define");
3642
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003643 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003644 // Enable region store model by default.
3645 CmdArgs.push_back("-analyzer-store=region");
3646
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003647 // Treat blocks as analysis entry points.
3648 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3649
Ted Kremenek49c79792011-03-24 00:28:47 +00003650 CmdArgs.push_back("-analyzer-eagerly-assume");
3651
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003652 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003653 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003654 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003655
Devin Coughlin65c77082016-01-21 20:09:49 +00003656 if (!IsWindowsMSVC) {
3657 CmdArgs.push_back("-analyzer-checker=unix");
3658 } else {
3659 // Enable "unix" checkers that also work on Windows.
3660 CmdArgs.push_back("-analyzer-checker=unix.API");
3661 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3662 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3663 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3664 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3665 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3666 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003667
Sean Evesonb38c32b2016-01-06 10:03:58 +00003668 // Disable some unix checkers for PS4.
3669 if (IsPS4CPU) {
3670 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3671 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3672 }
3673
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003674 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003675 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003677 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003678
Artem Belevichba558952015-05-06 18:20:23 +00003679 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003680 CmdArgs.push_back("-analyzer-checker=cplusplus");
3681
Sean Evesonb38c32b2016-01-06 10:03:58 +00003682 if (!IsPS4CPU) {
3683 CmdArgs.push_back(
3684 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3685 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3686 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3687 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3690 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003691
3692 // Default nullability checks.
3693 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3694 CmdArgs.push_back(
3695 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003696 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003697
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003698 // Set the output format. The default is plist, for (lame) historical
3699 // reasons.
3700 CmdArgs.push_back("-analyzer-output");
3701 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003702 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003703 else
3704 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003705
Ted Kremenekfe449a22010-03-22 22:32:05 +00003706 // Disable the presentation of standard compiler warnings when
3707 // using --analyze. We only want to show static analyzer diagnostics
3708 // or frontend errors.
3709 CmdArgs.push_back("-w");
3710
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711 // Add -Xanalyzer arguments when running as analyzer.
3712 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003713 }
3714
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003715 CheckCodeGenerationOptions(D, Args);
3716
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003717 llvm::Reloc::Model RelocationModel;
3718 unsigned PICLevel;
3719 bool IsPIE;
3720 std::tie(RelocationModel, PICLevel, IsPIE) =
3721 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003722
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003723 const char *RMName = RelocationModelName(RelocationModel);
3724 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003725 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003726 CmdArgs.push_back(RMName);
3727 }
3728 if (PICLevel > 0) {
3729 CmdArgs.push_back("-pic-level");
3730 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3731 if (IsPIE) {
3732 CmdArgs.push_back("-pie-level");
3733 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003734 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003735 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003736
Renato Golin4854d802015-11-09 12:40:41 +00003737 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3738 CmdArgs.push_back("-meabi");
3739 CmdArgs.push_back(A->getValue());
3740 }
3741
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003742 CmdArgs.push_back("-mthread-model");
3743 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3744 CmdArgs.push_back(A->getValue());
3745 else
3746 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3747
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003748 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3749
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003750 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3751 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003752 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003753
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003754 // LLVM Code Generator Options.
3755
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003756 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3757 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003758 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3759 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003760 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003761 CmdArgs.push_back(A->getValue());
3762 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003763 }
3764 }
3765
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003766 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3767 StringRef v = A->getValue();
3768 CmdArgs.push_back("-mllvm");
3769 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3770 A->claim();
3771 }
3772
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003773 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3774 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003775 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003776 }
3777
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003778 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3779 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003780 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003781 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003782 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003783 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3784 CmdArgs.push_back("-fpcc-struct-return");
3785 } else {
3786 assert(A->getOption().matches(options::OPT_freg_struct_return));
3787 CmdArgs.push_back("-freg-struct-return");
3788 }
3789 }
3790
Roman Divacky65b88cd2011-03-01 17:40:53 +00003791 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3792 CmdArgs.push_back("-mrtd");
3793
Rafael Espindola224dd632011-12-14 21:02:23 +00003794 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003795 CmdArgs.push_back("-mdisable-fp-elim");
3796 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3797 options::OPT_fno_zero_initialized_in_bss))
3798 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003799
3800 bool OFastEnabled = isOptimizationLevelFast(Args);
3801 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3802 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003803 OptSpecifier StrictAliasingAliasOption =
3804 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003805 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3806 // doesn't do any TBAA.
3807 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003808 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003809 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003810 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003811 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3812 options::OPT_fno_struct_path_tbaa))
3813 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003814 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3815 false))
3816 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003817 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3818 options::OPT_fno_strict_vtable_pointers,
3819 false))
3820 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003821 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3822 options::OPT_fno_optimize_sibling_calls))
3823 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003824
Eric Christopher006208c2013-04-04 06:29:47 +00003825 // Handle segmented stacks.
3826 if (Args.hasArg(options::OPT_fsplit_stack))
3827 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003828
3829 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3830 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831 OptSpecifier FastMathAliasOption =
3832 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3833
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003834 // Handle various floating point optimization flags, mapping them to the
3835 // appropriate LLVM code generation flags. The pattern for all of these is to
3836 // default off the codegen optimizations, and if any flag enables them and no
3837 // flag disables them after the flag enabling them, enable the codegen
3838 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839 if (Arg *A = Args.getLastArg(
3840 options::OPT_ffast_math, FastMathAliasOption,
3841 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3842 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3843 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003844 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3845 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003846 A->getOption().getID() != options::OPT_fhonor_infinities)
3847 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003848 if (Arg *A = Args.getLastArg(
3849 options::OPT_ffast_math, FastMathAliasOption,
3850 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3851 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3852 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003853 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3854 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003855 A->getOption().getID() != options::OPT_fhonor_nans)
3856 CmdArgs.push_back("-menable-no-nans");
3857
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003858 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3859 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003860 if (Arg *A =
3861 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3862 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3863 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003864 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3865 // However, turning *off* -ffast_math merely restores the toolchain default
3866 // (which may be false).
3867 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3868 A->getOption().getID() == options::OPT_ffast_math ||
3869 A->getOption().getID() == options::OPT_Ofast)
3870 MathErrno = false;
3871 else if (A->getOption().getID() == options::OPT_fmath_errno)
3872 MathErrno = true;
3873 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003874 if (MathErrno)
3875 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003876
3877 // There are several flags which require disabling very specific
3878 // optimizations. Any of these being disabled forces us to turn off the
3879 // entire set of LLVM optimizations, so collect them through all the flag
3880 // madness.
3881 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003882 if (Arg *A = Args.getLastArg(
3883 options::OPT_ffast_math, FastMathAliasOption,
3884 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3885 options::OPT_fno_unsafe_math_optimizations,
3886 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003887 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3888 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003889 A->getOption().getID() != options::OPT_fno_associative_math)
3890 AssociativeMath = true;
3891 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003892 if (Arg *A = Args.getLastArg(
3893 options::OPT_ffast_math, FastMathAliasOption,
3894 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3895 options::OPT_fno_unsafe_math_optimizations,
3896 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003897 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3898 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003899 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3900 ReciprocalMath = true;
3901 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003902 if (Arg *A = Args.getLastArg(
3903 options::OPT_ffast_math, FastMathAliasOption,
3904 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3905 options::OPT_fno_unsafe_math_optimizations,
3906 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003907 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3908 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003909 A->getOption().getID() != options::OPT_fsigned_zeros)
3910 SignedZeros = false;
3911 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003912 if (Arg *A = Args.getLastArg(
3913 options::OPT_ffast_math, FastMathAliasOption,
3914 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3915 options::OPT_fno_unsafe_math_optimizations,
3916 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003917 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3918 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003919 A->getOption().getID() != options::OPT_ftrapping_math)
3920 TrappingMath = false;
3921 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3922 !TrappingMath)
3923 CmdArgs.push_back("-menable-unsafe-fp-math");
3924
Sanjay Patel76c9e092015-01-23 16:40:50 +00003925 if (!SignedZeros)
3926 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003927
Sanjay Patel359b1052015-04-09 15:03:23 +00003928 if (ReciprocalMath)
3929 CmdArgs.push_back("-freciprocal-math");
3930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003931 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003932 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003933 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003934 options::OPT_ffp_contract)) {
3935 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003936 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003937 if (Val == "fast" || Val == "on" || Val == "off") {
3938 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3939 } else {
3940 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003942 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003943 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3944 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003945 // If fast-math is set then set the fp-contract mode to fast.
3946 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3947 }
3948 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949
Sanjay Patel2987c292015-06-11 14:53:41 +00003950 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003951
Bob Wilson6a039162012-07-19 03:52:53 +00003952 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3953 // and if we find them, tell the frontend to provide the appropriate
3954 // preprocessor macros. This is distinct from enabling any optimizations as
3955 // these options induce language changes which must survive serialization
3956 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003957 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3958 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 if (!A->getOption().matches(options::OPT_fno_fast_math))
3960 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003961 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3962 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003963 if (A->getOption().matches(options::OPT_ffinite_math_only))
3964 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003965
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003966 // Decide whether to use verbose asm. Verbose assembly is the default on
3967 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003968 bool IsIntegratedAssemblerDefault =
3969 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003970 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003971 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003972 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003973 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003974
Rafael Espindolab8a12932015-05-22 20:44:03 +00003975 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3976 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003977 CmdArgs.push_back("-no-integrated-as");
3978
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003979 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3980 CmdArgs.push_back("-mdebug-pass");
3981 CmdArgs.push_back("Structure");
3982 }
3983 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3984 CmdArgs.push_back("-mdebug-pass");
3985 CmdArgs.push_back("Arguments");
3986 }
3987
Justin Lebar710a35f2016-01-25 22:36:35 +00003988 // Enable -mconstructor-aliases except on darwin, where we have to work around
3989 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3990 // aliases aren't supported.
3991 if (!getToolChain().getTriple().isOSDarwin() &&
3992 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003993 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003994
John McCall7ef5cb32011-03-18 02:56:14 +00003995 // Darwin's kernel doesn't support guard variables; just die if we
3996 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003997 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003998 CmdArgs.push_back("-fforbid-guard-variables");
3999
Akira Hatanaka02028482015-11-12 17:21:22 +00004000 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4001 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004002 CmdArgs.push_back("-mms-bitfields");
4003 }
John McCall8517abc2010-02-19 02:45:38 +00004004
Daniel Dunbar306945d2009-09-16 06:17:29 +00004005 // This is a coarse approximation of what llvm-gcc actually does, both
4006 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4007 // complicated ways.
4008 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004009 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4010 options::OPT_fno_asynchronous_unwind_tables,
4011 (getToolChain().IsUnwindTablesDefault() ||
4012 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4013 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004014 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4015 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004016 CmdArgs.push_back("-munwind-tables");
4017
Chandler Carruth05fb5852012-11-21 23:40:23 +00004018 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004019
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004020 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4021 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004022 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004023 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004024
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004025 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004026 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004027
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004028 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004029 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004030 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004031 }
4032
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004033 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004034 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004035 if (!CPU.empty()) {
4036 CmdArgs.push_back("-target-cpu");
4037 CmdArgs.push_back(Args.MakeArgString(CPU));
4038 }
4039
Rafael Espindolaeb265472013-08-21 21:59:03 +00004040 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4041 CmdArgs.push_back("-mfpmath");
4042 CmdArgs.push_back(A->getValue());
4043 }
4044
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004045 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004046 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004047
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004048 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004049 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004050 default:
4051 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004052
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004053 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004054 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004055 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004056 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004057 // Use the effective triple, which takes into account the deployment target.
4058 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004059 break;
4060
Tim Northover573cbee2014-05-24 12:52:07 +00004061 case llvm::Triple::aarch64:
4062 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004063 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004064 break;
4065
Eric Christopher0b26a612010-03-02 02:41:08 +00004066 case llvm::Triple::mips:
4067 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004068 case llvm::Triple::mips64:
4069 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004070 AddMIPSTargetArgs(Args, CmdArgs);
4071 break;
4072
Ulrich Weigand8afad612014-07-28 13:17:52 +00004073 case llvm::Triple::ppc:
4074 case llvm::Triple::ppc64:
4075 case llvm::Triple::ppc64le:
4076 AddPPCTargetArgs(Args, CmdArgs);
4077 break;
4078
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004079 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004080 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004081 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004082 AddSparcTargetArgs(Args, CmdArgs);
4083 break;
4084
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004085 case llvm::Triple::x86:
4086 case llvm::Triple::x86_64:
4087 AddX86TargetArgs(Args, CmdArgs);
4088 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004089
4090 case llvm::Triple::hexagon:
4091 AddHexagonTargetArgs(Args, CmdArgs);
4092 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004093
4094 case llvm::Triple::wasm32:
4095 case llvm::Triple::wasm64:
4096 AddWebAssemblyTargetArgs(Args, CmdArgs);
4097 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004098 }
4099
Douglas Katzman3459ce22015-10-08 04:24:12 +00004100 // The 'g' groups options involve a somewhat intricate sequence of decisions
4101 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004102 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004103 // * what level of debug info to generate
4104 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004105 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004106 // This avoids having to monkey around further in cc1 other than to disable
4107 // codeview if not running in a Windows environment. Perhaps even that
4108 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004109 unsigned DwarfVersion = 0;
4110 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4111 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004112 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4113 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004114 bool EmitCodeView = false;
4115
Hans Wennborg75958c42013-08-08 00:17:41 +00004116 // Add clang-cl arguments.
4117 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004118 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004119
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004120 // Pass the linker version in use.
4121 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4122 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004123 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004124 }
4125
Eric Christopherb7d97e92013-04-03 01:58:53 +00004126 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004127 CmdArgs.push_back("-momit-leaf-frame-pointer");
4128
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004129 // Explicitly error on some things we know we don't support and can't just
4130 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004131 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004132 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4133 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004134 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004135 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004136 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4137 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004138 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004139 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004140 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004141 }
4142
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004143 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004144 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004145 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004146 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004147 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4148 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004149 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004150 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004151 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004152
Chad Rosierbe10f982011-08-02 17:58:04 +00004153 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004154 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004155 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4156 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004157 }
4158
Rafael Espindola08a692a2010-03-07 04:46:18 +00004159 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004160 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004161 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004162 // If the last option explicitly specified a debug-info level, use it.
4163 if (A->getOption().matches(options::OPT_gN_Group)) {
4164 DebugInfoKind = DebugLevelToInfoKind(*A);
4165 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4166 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4167 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4168 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4169 A->getIndex() > SplitDwarfArg->getIndex())
4170 SplitDwarfArg = nullptr;
4171 } else
4172 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004173 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004174 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004175
Paul Robinson0334a042015-12-19 19:41:48 +00004176 // If a debugger tuning argument appeared, remember it.
4177 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4178 options::OPT_ggdbN_Group)) {
4179 if (A->getOption().matches(options::OPT_glldb))
4180 DebuggerTuning = llvm::DebuggerKind::LLDB;
4181 else if (A->getOption().matches(options::OPT_gsce))
4182 DebuggerTuning = llvm::DebuggerKind::SCE;
4183 else
4184 DebuggerTuning = llvm::DebuggerKind::GDB;
4185 }
4186
4187 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004188 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004189 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004190 DwarfVersion = DwarfVersionNum(A->getSpelling());
4191
Reid Kleckner124955a2015-08-05 18:51:13 +00004192 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4194 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4195 // DwarfVersion remains at 0 if no explicit choice was made.
4196 CmdArgs.push_back("-gcodeview");
4197 } else if (DwarfVersion == 0 &&
4198 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4199 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4200 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004201
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004202 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4203 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004204
4205 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004206 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004207 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004208 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004209
Eric Christopher138c32b2013-09-13 22:37:55 +00004210 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004211 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004212 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004213 CmdArgs.push_back("-dwarf-ext-refs");
4214 CmdArgs.push_back("-fmodule-format=obj");
4215 }
4216
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004217 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4218 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004219 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004220 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004221 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004222 CmdArgs.push_back("-backend-option");
4223 CmdArgs.push_back("-split-dwarf=Enable");
4224 }
4225
Douglas Katzman3459ce22015-10-08 04:24:12 +00004226 // After we've dealt with all combinations of things that could
4227 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4228 // figure out if we need to "upgrade" it to standalone debug info.
4229 // We parse these two '-f' options whether or not they will be used,
4230 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4231 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4232 options::OPT_fno_standalone_debug,
4233 getToolChain().GetDefaultStandaloneDebug());
4234 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4235 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004236 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4237 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004238
Eric Christopher138c32b2013-09-13 22:37:55 +00004239 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4240 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4241 CmdArgs.push_back("-backend-option");
4242 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4243 }
Eric Christophereec89c22013-06-18 00:03:50 +00004244
Eric Christopher0d403d22014-02-14 01:27:03 +00004245 // -gdwarf-aranges turns on the emission of the aranges section in the
4246 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004247 // Always enabled on the PS4.
4248 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004249 CmdArgs.push_back("-backend-option");
4250 CmdArgs.push_back("-generate-arange-section");
4251 }
4252
David Blaikief36d9ba2014-01-27 18:52:43 +00004253 if (Args.hasFlag(options::OPT_fdebug_types_section,
4254 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004255 CmdArgs.push_back("-backend-option");
4256 CmdArgs.push_back("-generate-type-units");
4257 }
Eric Christophereec89c22013-06-18 00:03:50 +00004258
Dan Gohmana5b804b2016-01-07 00:50:27 +00004259 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4260 // default.
4261 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4262 Triple.getArch() == llvm::Triple::wasm32 ||
4263 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004264
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004265 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004266 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004267 CmdArgs.push_back("-ffunction-sections");
4268 }
4269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004270 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4271 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004272 CmdArgs.push_back("-fdata-sections");
4273 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004274
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004275 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004276 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004277 CmdArgs.push_back("-fno-unique-section-names");
4278
Chris Lattner3c77a352010-06-22 00:03:40 +00004279 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4280
Diego Novilloa0545962015-07-10 18:00:07 +00004281 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004282
Paul Robinsond083b9a2015-12-16 17:25:27 +00004283 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4284 if (getToolChain().getTriple().isPS4CPU())
4285 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4286
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004287 // Pass options for controlling the default header search paths.
4288 if (Args.hasArg(options::OPT_nostdinc)) {
4289 CmdArgs.push_back("-nostdsysteminc");
4290 CmdArgs.push_back("-nobuiltininc");
4291 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004292 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004293 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004294 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4295 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4296 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004297
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004298 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004299 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004300 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004301
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004302 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4303
Ted Kremenekf7639e12012-03-06 20:06:33 +00004304 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004305 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004306 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004307 options::OPT_ccc_arcmt_modify,
4308 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004309 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004310 switch (A->getOption().getID()) {
4311 default:
4312 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004313 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004314 CmdArgs.push_back("-arcmt-check");
4315 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004316 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004317 CmdArgs.push_back("-arcmt-modify");
4318 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004319 case options::OPT_ccc_arcmt_migrate:
4320 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004321 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004322 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004323
4324 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4325 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004326 break;
John McCalld70fb982011-06-15 23:25:17 +00004327 }
4328 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004329 } else {
4330 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4331 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4332 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004333 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004334
Ted Kremenekf7639e12012-03-06 20:06:33 +00004335 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4336 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004337 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4338 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004339 }
4340 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004341 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004342
4343 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004344 options::OPT_objcmt_migrate_subscripting,
4345 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004346 // None specified, means enable them all.
4347 CmdArgs.push_back("-objcmt-migrate-literals");
4348 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004349 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004350 } else {
4351 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4352 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004353 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004354 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004355 } else {
4356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4357 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4358 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004372 }
4373
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004374 // Add preprocessing options like -I, -D, etc. if we are using the
4375 // preprocessor.
4376 //
4377 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004378 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004379 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4380 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004381
Rafael Espindolaa7431922011-07-21 23:40:37 +00004382 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4383 // that "The compiler can only warn and ignore the option if not recognized".
4384 // When building with ccache, it will pass -D options to clang even on
4385 // preprocessed inputs and configure concludes that -fPIC is not supported.
4386 Args.ClaimAllArgs(options::OPT_D);
4387
Alp Toker7874bdc2013-11-15 20:40:58 +00004388 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004389 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4390 if (A->getOption().matches(options::OPT_O4)) {
4391 CmdArgs.push_back("-O3");
4392 D.Diag(diag::warn_O4_is_O3);
4393 } else {
4394 A->render(Args, CmdArgs);
4395 }
4396 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004397
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004398 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004399 for (const Arg *A :
4400 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4401 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004402 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004403 }
4404
Rafael Espindola577637a2015-01-03 00:06:04 +00004405 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004406
Richard Smith3be1cb22014-08-07 00:24:21 +00004407 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004408 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004409 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4410 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004411 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004412 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004413
4414 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004415 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004416 //
4417 // If a std is supplied, only add -trigraphs if it follows the
4418 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004419 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004420 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4421 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004422 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004423 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004424 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004425 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004426 else
4427 Std->render(Args, CmdArgs);
4428
Nico Weber00721502014-12-23 22:32:37 +00004429 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004430 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004431 options::OPT_ftrigraphs,
4432 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004433 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004434 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004435 } else {
4436 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004437 //
4438 // FIXME: Clang doesn't correctly handle -std= when the input language
4439 // doesn't match. For the time being just ignore this for C++ inputs;
4440 // eventually we want to do all the standard defaulting here instead of
4441 // splitting it between the driver and clang -cc1.
4442 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004443 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4444 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004445 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004446 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004447
Nico Weber00721502014-12-23 22:32:37 +00004448 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4449 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004450 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004451
Richard Smith282b4492013-09-04 22:50:31 +00004452 // GCC's behavior for -Wwrite-strings is a bit strange:
4453 // * In C, this "warning flag" changes the types of string literals from
4454 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4455 // for the discarded qualifier.
4456 // * In C++, this is just a normal warning flag.
4457 //
4458 // Implementing this warning correctly in C is hard, so we follow GCC's
4459 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4460 // a non-const char* in C, rather than using this crude hack.
4461 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004462 // FIXME: This should behave just like a warning flag, and thus should also
4463 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4464 Arg *WriteStrings =
4465 Args.getLastArg(options::OPT_Wwrite_strings,
4466 options::OPT_Wno_write_strings, options::OPT_w);
4467 if (WriteStrings &&
4468 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004469 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004470 }
4471
Chandler Carruth61fbf622011-04-23 09:27:53 +00004472 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004473 // during C++ compilation, which it is by default. GCC keeps this define even
4474 // in the presence of '-w', match this behavior bug-for-bug.
4475 if (types::isCXX(InputType) &&
4476 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4477 true)) {
4478 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004479 }
4480
Chandler Carruthe0391482010-05-22 02:21:53 +00004481 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4482 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4483 if (Asm->getOption().matches(options::OPT_fasm))
4484 CmdArgs.push_back("-fgnu-keywords");
4485 else
4486 CmdArgs.push_back("-fno-gnu-keywords");
4487 }
4488
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004489 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4490 CmdArgs.push_back("-fno-dwarf-directory-asm");
4491
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004492 if (ShouldDisableAutolink(Args, getToolChain()))
4493 CmdArgs.push_back("-fno-autolink");
4494
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004495 // Add in -fdebug-compilation-dir if necessary.
4496 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004497
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004498 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4499 StringRef Map = A->getValue();
4500 if (Map.find('=') == StringRef::npos)
4501 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4502 else
4503 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4504 A->claim();
4505 }
4506
Richard Smith9a568822011-11-21 19:36:32 +00004507 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4508 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004509 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004510 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004511 }
4512
Richard Smith79c927b2013-11-06 19:31:51 +00004513 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4514 CmdArgs.push_back("-foperator-arrow-depth");
4515 CmdArgs.push_back(A->getValue());
4516 }
4517
Richard Smith9a568822011-11-21 19:36:32 +00004518 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4519 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004520 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004521 }
4522
Richard Smitha3d3bd22013-05-08 02:12:03 +00004523 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4524 CmdArgs.push_back("-fconstexpr-steps");
4525 CmdArgs.push_back(A->getValue());
4526 }
4527
Richard Smithb3a14522013-02-22 01:59:51 +00004528 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4529 CmdArgs.push_back("-fbracket-depth");
4530 CmdArgs.push_back(A->getValue());
4531 }
4532
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004533 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4534 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004535 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004536 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004537 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4538 } else
4539 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004540 }
4541
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004542 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004543 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004544
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004545 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4546 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004547 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004548 }
David Chisnall5778fce2009-08-31 16:41:57 +00004549
Chris Lattnere23003d2010-01-09 21:54:33 +00004550 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4551 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004552 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004553 }
4554
Chris Lattnerb35583d2010-04-07 20:49:23 +00004555 CmdArgs.push_back("-ferror-limit");
4556 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004557 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004558 else
4559 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004560
Chandler Carrutha77a7272010-05-06 04:55:18 +00004561 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4562 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004563 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004564 }
4565
4566 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4567 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004568 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004569 }
4570
Richard Smithf6f003a2011-12-16 19:06:07 +00004571 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4572 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004573 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004574 }
4575
Nick Lewycky24653262014-12-16 21:39:02 +00004576 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4577 CmdArgs.push_back("-fspell-checking-limit");
4578 CmdArgs.push_back(A->getValue());
4579 }
4580
Daniel Dunbar2c978472009-11-04 06:24:47 +00004581 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004582 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004583 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004584 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004585 } else {
4586 // If -fmessage-length=N was not specified, determine whether this is a
4587 // terminal and, if so, implicitly define -fmessage-length appropriately.
4588 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004589 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004590 }
4591
John McCallb4a99d32013-02-19 01:57:35 +00004592 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4593 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4594 options::OPT_fvisibility_ms_compat)) {
4595 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4596 CmdArgs.push_back("-fvisibility");
4597 CmdArgs.push_back(A->getValue());
4598 } else {
4599 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4600 CmdArgs.push_back("-fvisibility");
4601 CmdArgs.push_back("hidden");
4602 CmdArgs.push_back("-ftype-visibility");
4603 CmdArgs.push_back("default");
4604 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004605 }
4606
Douglas Gregor08329632010-06-15 17:05:35 +00004607 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004608
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004609 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4610
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004611 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004612 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4613 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004614 CmdArgs.push_back("-ffreestanding");
4615
Daniel Dunbare357d562009-12-03 18:42:11 +00004616 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004617 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004618 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004619 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004620 // Emulated TLS is enabled by default on Android, and can be enabled manually
4621 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004622 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004623 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4624 EmulatedTLSDefault))
4625 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004626 // AltiVec-like language extensions aren't relevant for assembling.
4627 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004628 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004629 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4630 }
Richard Trieu91844232012-06-26 18:18:47 +00004631 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4632 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004633
Alexey Bataevdb390212015-05-20 04:24:19 +00004634 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004635 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4636 options::OPT_fno_openmp, false))
4637 switch (getOpenMPRuntime(getToolChain(), Args)) {
4638 case OMPRT_OMP:
4639 case OMPRT_IOMP5:
4640 // Clang can generate useful OpenMP code for these two runtime libraries.
4641 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004642
4643 // If no option regarding the use of TLS in OpenMP codegeneration is
4644 // given, decide a default based on the target. Otherwise rely on the
4645 // options and pass the right information to the frontend.
4646 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004647 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004648 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004649 break;
4650 default:
4651 // By default, if Clang doesn't know how to generate useful OpenMP code
4652 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4653 // down to the actual compilation.
4654 // FIXME: It would be better to have a mode which *only* omits IR
4655 // generation based on the OpenMP support so that we get consistent
4656 // semantic analysis, etc.
4657 break;
4658 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004659
Peter Collingbourne32701642013-11-01 18:16:25 +00004660 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004661 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004662
Eric Christopher459d2712013-02-19 06:16:53 +00004663 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004664 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4665 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4666 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4667 Arch == llvm::Triple::ppc64le))
4668 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4669 << "ppc/ppc64/ppc64le";
4670 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004671
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004672 // -fzvector is incompatible with -faltivec.
4673 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4674 if (Args.hasArg(options::OPT_faltivec))
4675 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4676 << "-faltivec";
4677
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004678 if (getToolChain().SupportsProfiling())
4679 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004680
4681 // -flax-vector-conversions is default.
4682 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4683 options::OPT_fno_lax_vector_conversions))
4684 CmdArgs.push_back("-fno-lax-vector-conversions");
4685
John Brawna7b4ec02015-08-10 11:11:28 +00004686 if (Args.getLastArg(options::OPT_fapple_kext) ||
4687 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004688 CmdArgs.push_back("-fapple-kext");
4689
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004690 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004691 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004692 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004693 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4694 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004695
4696 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4697 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004698 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004699 }
4700
Bob Wilson14adb362012-02-03 06:27:22 +00004701 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004702
Chandler Carruth6e501032011-03-27 00:04:55 +00004703 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4704 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004705 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004706 if (A->getOption().matches(options::OPT_fwrapv))
4707 CmdArgs.push_back("-fwrapv");
4708 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4709 options::OPT_fno_strict_overflow)) {
4710 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4711 CmdArgs.push_back("-fwrapv");
4712 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004713
4714 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4715 options::OPT_fno_reroll_loops))
4716 if (A->getOption().matches(options::OPT_freroll_loops))
4717 CmdArgs.push_back("-freroll-loops");
4718
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004719 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004720 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4721 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004722
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004723 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4724
Daniel Dunbar4930e332009-11-17 08:07:36 +00004725 // -stack-protector=0 is default.
4726 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004727 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4728 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4729 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4730 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4731 Args.ClaimAllArgs(options::OPT_fstack_protector);
4732 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004733 options::OPT_fstack_protector_all,
4734 options::OPT_fstack_protector_strong,
4735 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004736 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004737 StackProtectorLevel = std::max<unsigned>(
4738 LangOptions::SSPOn,
4739 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004740 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004741 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004742 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004743 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004744 } else {
4745 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004746 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004747 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004748 if (StackProtectorLevel) {
4749 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004750 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004751 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004752
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004753 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004754 for (const Arg *A : Args.filtered(options::OPT__param)) {
4755 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004756 if (Str.startswith("ssp-buffer-size=")) {
4757 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004758 CmdArgs.push_back("-stack-protector-buffer-size");
4759 // FIXME: Verify the argument is a valid integer.
4760 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004761 }
Sean Silva14facf32015-06-09 01:57:17 +00004762 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004763 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004764 }
4765
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004766 // Translate -mstackrealign
4767 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004768 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004769 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004770
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004771 if (Args.hasArg(options::OPT_mstack_alignment)) {
4772 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4773 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004774 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004775
Hans Wennborg77dc2362015-01-20 19:45:50 +00004776 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4777 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4778
4779 if (!Size.empty())
4780 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4781 else
4782 CmdArgs.push_back("-mstack-probe-size=0");
4783 }
4784
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004785 switch (getToolChain().getArch()) {
4786 case llvm::Triple::aarch64:
4787 case llvm::Triple::aarch64_be:
4788 case llvm::Triple::arm:
4789 case llvm::Triple::armeb:
4790 case llvm::Triple::thumb:
4791 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004792 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004793 break;
4794
4795 default:
4796 break;
4797 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004798
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004799 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4800 options::OPT_mno_restrict_it)) {
4801 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4802 CmdArgs.push_back("-backend-option");
4803 CmdArgs.push_back("-arm-restrict-it");
4804 } else {
4805 CmdArgs.push_back("-backend-option");
4806 CmdArgs.push_back("-arm-no-restrict-it");
4807 }
James Y Knight2db38f32015-08-15 03:45:25 +00004808 } else if (Triple.isOSWindows() &&
4809 (Triple.getArch() == llvm::Triple::arm ||
4810 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004811 // Windows on ARM expects restricted IT blocks
4812 CmdArgs.push_back("-backend-option");
4813 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004814 }
4815
Daniel Dunbard18049a2009-04-07 21:16:11 +00004816 // Forward -f options with positive and negative forms; we translate
4817 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004818 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4819 StringRef fname = A->getValue();
4820 if (!llvm::sys::fs::exists(fname))
4821 D.Diag(diag::err_drv_no_such_file) << fname;
4822 else
4823 A->render(Args, CmdArgs);
4824 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004825
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004826 // -fbuiltin is default unless -mkernel is used.
4827 bool UseBuiltins =
4828 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4829 !Args.hasArg(options::OPT_mkernel));
4830 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004831 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004832
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004833 // -ffreestanding implies -fno-builtin.
4834 if (Args.hasArg(options::OPT_ffreestanding))
4835 UseBuiltins = false;
4836
4837 // Process the -fno-builtin-* options.
4838 for (const auto &Arg : Args) {
4839 const Option &O = Arg->getOption();
4840 if (!O.matches(options::OPT_fno_builtin_))
4841 continue;
4842
4843 Arg->claim();
4844 // If -fno-builtin is specified, then there's no need to pass the option to
4845 // the frontend.
4846 if (!UseBuiltins)
4847 continue;
4848
4849 StringRef FuncName = Arg->getValue();
4850 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4851 }
4852
Nuno Lopes13c88c72009-12-16 16:59:22 +00004853 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4854 options::OPT_fno_assume_sane_operator_new))
4855 CmdArgs.push_back("-fno-assume-sane-operator-new");
4856
Daniel Dunbar4930e332009-11-17 08:07:36 +00004857 // -fblocks=0 is default.
4858 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004859 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004860 (Args.hasArg(options::OPT_fgnu_runtime) &&
4861 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4862 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004863 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004865 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004866 !getToolChain().hasBlocksRuntime())
4867 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004868 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004869
Richard Smith47972af2015-06-16 00:08:24 +00004870 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004871 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004872 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004873 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004874 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004875 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4876 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004877 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004878 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004879 HaveModules = true;
4880 }
4881 }
4882
Richard Smith47972af2015-06-16 00:08:24 +00004883 // -fmodule-maps enables implicit reading of module map files. By default,
4884 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004885 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4886 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004887 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004888 }
4889
Daniel Jasperac42b752013-10-21 06:34:34 +00004890 // -fmodules-decluse checks that modules used are declared so (off by
4891 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004892 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004893 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004894 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004895 }
4896
Daniel Jasper962b38e2014-04-11 11:47:45 +00004897 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4898 // all #included headers are part of modules.
4899 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004900 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004901 CmdArgs.push_back("-fmodules-strict-decluse");
4902 }
4903
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004904 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4905 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4906 options::OPT_fno_implicit_modules)) {
4907 CmdArgs.push_back("-fno-implicit-modules");
4908 }
4909
Daniel Jasperac42b752013-10-21 06:34:34 +00004910 // -fmodule-name specifies the module that is currently being built (or
4911 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004912 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004913
Richard Smith9887d792014-10-17 01:42:53 +00004914 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004915 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004916 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004917
Richard Smithe842a472014-10-22 02:05:46 +00004918 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004919 if (HaveModules)
4920 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4921 else
4922 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004923
4924 // -fmodule-cache-path specifies where our implicitly-built module files
4925 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004926 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004927 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004928 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004929 if (HaveModules) {
4930 if (C.isForDiagnostics()) {
4931 // When generating crash reports, we want to emit the modules along with
4932 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004933 Path = Output.getFilename();
4934 llvm::sys::path::replace_extension(Path, ".cache");
4935 llvm::sys::path::append(Path, "modules");
4936 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004937 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004938 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004939 llvm::sys::path::append(Path, "org.llvm.clang.");
4940 appendUserToPath(Path);
4941 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004942 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004943 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004944 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4945 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004946 }
4947
4948 // When building modules and generating crashdumps, we need to dump a module
4949 // dependency VFS alongside the output.
4950 if (HaveModules && C.isForDiagnostics()) {
4951 SmallString<128> VFSDir(Output.getFilename());
4952 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004953 // Add the cache directory as a temp so the crash diagnostics pick it up.
4954 C.addTempFile(Args.MakeArgString(VFSDir));
4955
Justin Bognera88f0122014-06-20 22:59:50 +00004956 llvm::sys::path::append(VFSDir, "vfs");
4957 CmdArgs.push_back("-module-dependency-dir");
4958 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004959 }
4960
Richard Smith9887d792014-10-17 01:42:53 +00004961 if (HaveModules)
4962 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004963
Douglas Gregor35b04d62013-02-07 19:01:24 +00004964 // Pass through all -fmodules-ignore-macro arguments.
4965 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004966 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4967 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004968
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004969 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4970
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004971 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4972 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4973 D.Diag(diag::err_drv_argument_not_allowed_with)
4974 << A->getAsString(Args) << "-fbuild-session-timestamp";
4975
4976 llvm::sys::fs::file_status Status;
4977 if (llvm::sys::fs::status(A->getValue(), Status))
4978 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004979 CmdArgs.push_back(Args.MakeArgString(
4980 "-fbuild-session-timestamp=" +
4981 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004982 }
4983
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004984 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004985 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4986 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004987 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4988
4989 Args.AddLastArg(CmdArgs,
4990 options::OPT_fmodules_validate_once_per_build_session);
4991 }
4992
Ben Langmuirdcf73862014-03-12 00:06:17 +00004993 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4994
John McCalldfea9982010-04-09 19:12:06 +00004995 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004996 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004997 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004998 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004999
Anders Carlssond470fef2010-11-21 00:09:52 +00005000 // -felide-constructors is the default.
5001 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005002 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005003 CmdArgs.push_back("-fno-elide-constructors");
5004
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005005 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005006
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005007 if (KernelOrKext || (types::isCXX(InputType) &&
5008 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5009 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005010 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005011
Tony Linthicum76329bf2011-12-12 21:14:55 +00005012 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5014 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005015 CmdArgs.push_back("-fshort-enums");
5016
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005017 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005018 if (Arg *A = Args.getLastArg(
5019 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5020 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5021 if (A->getOption().matches(options::OPT_funsigned_char) ||
5022 A->getOption().matches(options::OPT_fno_signed_char)) {
5023 CmdArgs.push_back("-fno-signed-char");
5024 }
5025 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005026 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005027 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005028
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005029 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005030 if (!Args.hasFlag(
5031 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5032 !IsWindowsCygnus && !IsWindowsGNU &&
5033 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5034 getToolChain().getArch() != llvm::Triple::hexagon &&
5035 getToolChain().getArch() != llvm::Triple::xcore &&
5036 ((getToolChain().getTriple().getVendor() !=
5037 llvm::Triple::MipsTechnologies) ||
5038 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005039 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005040 CmdArgs.push_back("-fno-use-cxa-atexit");
5041
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005042 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005043 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005044 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005045 CmdArgs.push_back("-fms-extensions");
5046
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005047 // -fno-use-line-directives is default.
5048 if (Args.hasFlag(options::OPT_fuse_line_directives,
5049 options::OPT_fno_use_line_directives, false))
5050 CmdArgs.push_back("-fuse-line-directives");
5051
Francois Pichet1b4f1632011-09-17 04:32:15 +00005052 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005053 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005054 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005055 (IsWindowsMSVC &&
5056 Args.hasFlag(options::OPT_fms_extensions,
5057 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005058 CmdArgs.push_back("-fms-compatibility");
5059
David Majnemerc371ff02015-03-22 08:39:22 +00005060 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005061 VersionTuple MSVT = visualstudio::getMSVCVersion(
5062 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5063 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005064 CmdArgs.push_back(
5065 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005066
David Majnemer8db91762015-05-18 04:49:30 +00005067 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5068 if (ImplyVCPPCXXVer) {
5069 if (IsMSVC2015Compatible)
5070 CmdArgs.push_back("-std=c++14");
5071 else
5072 CmdArgs.push_back("-std=c++11");
5073 }
5074
Eric Christopher5ecce122013-02-18 00:38:31 +00005075 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005076 if (Args.hasFlag(options::OPT_fborland_extensions,
5077 options::OPT_fno_borland_extensions, false))
5078 CmdArgs.push_back("-fborland-extensions");
5079
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005080 // -fno-declspec is default, except for PS4.
5081 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5082 getToolChain().getTriple().isPS4()))
5083 CmdArgs.push_back("-fdeclspec");
5084 else if (Args.hasArg(options::OPT_fno_declspec))
5085 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5086
David Majnemerc371ff02015-03-22 08:39:22 +00005087 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5088 // than 19.
5089 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5090 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005091 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005092 CmdArgs.push_back("-fno-threadsafe-statics");
5093
Francois Pichet02744872011-09-01 16:38:08 +00005094 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5095 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005096 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005097 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005098 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005099
Chandler Carruthe03aa552010-04-17 20:17:31 +00005100 // -fgnu-keywords default varies depending on language; only pass if
5101 // specified.
5102 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005103 options::OPT_fno_gnu_keywords))
5104 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005105
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005106 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005107 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005108 CmdArgs.push_back("-fgnu89-inline");
5109
Chad Rosier9c76d242012-03-15 22:31:42 +00005110 if (Args.hasArg(options::OPT_fno_inline))
5111 CmdArgs.push_back("-fno-inline");
5112
Chad Rosier64d6be92012-03-06 21:17:19 +00005113 if (Args.hasArg(options::OPT_fno_inline_functions))
5114 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005115
John McCall5fb5df92012-06-20 06:18:46 +00005116 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005117
John McCall5fb5df92012-06-20 06:18:46 +00005118 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005119 // legacy is the default. Except for deployment taget of 10.5,
5120 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5121 // gets ignored silently.
5122 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005123 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5124 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005125 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005126 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005127 if (getToolChain().UseObjCMixedDispatch())
5128 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5129 else
5130 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5131 }
5132 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005133
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005134 // When ObjectiveC legacy runtime is in effect on MacOSX,
5135 // turn on the option to do Array/Dictionary subscripting
5136 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005137 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005138 getToolChain().getTriple().isMacOSX() &&
5139 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5140 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005141 objcRuntime.isNeXTFamily())
5142 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005143
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005144 // -fencode-extended-block-signature=1 is default.
5145 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5146 CmdArgs.push_back("-fencode-extended-block-signature");
5147 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005148
John McCall24fc0de2011-07-06 00:26:06 +00005149 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5150 // NOTE: This logic is duplicated in ToolChains.cpp.
5151 bool ARC = isObjCAutoRefCount(Args);
5152 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005153 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005154
John McCall24fc0de2011-07-06 00:26:06 +00005155 CmdArgs.push_back("-fobjc-arc");
5156
Chandler Carruth491db322011-11-04 07:34:47 +00005157 // FIXME: It seems like this entire block, and several around it should be
5158 // wrapped in isObjC, but for now we just use it here as this is where it
5159 // was being used previously.
5160 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5161 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5162 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5163 else
5164 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5165 }
5166
John McCall24fc0de2011-07-06 00:26:06 +00005167 // Allow the user to enable full exceptions code emission.
5168 // We define off for Objective-CC, on for Objective-C++.
5169 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5170 options::OPT_fno_objc_arc_exceptions,
5171 /*default*/ types::isCXX(InputType)))
5172 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005173
John McCall24fc0de2011-07-06 00:26:06 +00005174 }
5175
5176 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5177 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005178 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005179 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005180
John McCall24fc0de2011-07-06 00:26:06 +00005181 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5182 // takes precedence.
5183 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5184 if (!GCArg)
5185 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5186 if (GCArg) {
5187 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005188 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005189 } else if (getToolChain().SupportsObjCGC()) {
5190 GCArg->render(Args, CmdArgs);
5191 } else {
5192 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005193 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005194 }
5195 }
5196
John McCallfbe5ed72015-11-05 19:19:56 +00005197 // Pass down -fobjc-weak or -fno-objc-weak if present.
5198 if (types::isObjC(InputType)) {
5199 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5200 options::OPT_fno_objc_weak);
5201 if (!WeakArg) {
5202 // nothing to do
5203 } else if (GCArg) {
5204 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5205 D.Diag(diag::err_objc_weak_with_gc);
5206 } else if (!objcRuntime.allowsWeak()) {
5207 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5208 D.Diag(diag::err_objc_weak_unsupported);
5209 } else {
5210 WeakArg->render(Args, CmdArgs);
5211 }
5212 }
5213
Bob Wilsonb111ec92015-03-02 19:01:14 +00005214 if (Args.hasFlag(options::OPT_fapplication_extension,
5215 options::OPT_fno_application_extension, false))
5216 CmdArgs.push_back("-fapplication-extension");
5217
Reid Klecknerc542d372014-06-27 17:02:02 +00005218 // Handle GCC-style exception args.
5219 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5221 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005222
Tim Northovere931f9f2015-10-30 16:30:41 +00005223 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005224 CmdArgs.push_back("-fsjlj-exceptions");
5225
5226 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005227 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5228 options::OPT_fno_assume_sane_operator_new))
5229 CmdArgs.push_back("-fno-assume-sane-operator-new");
5230
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005231 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5232 // most platforms.
5233 if (Args.hasFlag(options::OPT_fsized_deallocation,
5234 options::OPT_fno_sized_deallocation, false))
5235 CmdArgs.push_back("-fsized-deallocation");
5236
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005237 // -fconstant-cfstrings is default, and may be subject to argument translation
5238 // on Darwin.
5239 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5240 options::OPT_fno_constant_cfstrings) ||
5241 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5242 options::OPT_mno_constant_cfstrings))
5243 CmdArgs.push_back("-fno-constant-cfstrings");
5244
John Thompsoned4e2952009-11-05 20:14:16 +00005245 // -fshort-wchar default varies depending on platform; only
5246 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005247 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5248 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005249 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005250
Hans Wennborg28c96312013-07-31 23:39:13 +00005251 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005252 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005253 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005254 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005255
Daniel Dunbar096ed292011-10-05 21:04:55 +00005256 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5257 // -fno-pack-struct doesn't apply to -fpack-struct=.
5258 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005259 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005260 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005261 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005262 } else if (Args.hasFlag(options::OPT_fpack_struct,
5263 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005264 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005265 }
5266
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005267 // Handle -fmax-type-align=N and -fno-type-align
5268 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5269 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5270 if (!SkipMaxTypeAlign) {
5271 std::string MaxTypeAlignStr = "-fmax-type-align=";
5272 MaxTypeAlignStr += A->getValue();
5273 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5274 }
5275 } else if (getToolChain().getTriple().isOSDarwin()) {
5276 if (!SkipMaxTypeAlign) {
5277 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5278 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5279 }
5280 }
5281
John Brawna7b4ec02015-08-10 11:11:28 +00005282 // -fcommon is the default unless compiling kernel code or the target says so
5283 bool NoCommonDefault =
5284 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5285 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5286 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005287 CmdArgs.push_back("-fno-common");
5288
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005289 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005290 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005291 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005292 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005293 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005294 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005295
Daniel Dunbar6358d682010-10-15 22:30:42 +00005296 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005298 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005299 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005300
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005301 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5303 StringRef value = inputCharset->getValue();
5304 if (value != "UTF-8")
5305 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5306 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005307 }
5308
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005309 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5311 StringRef value = execCharset->getValue();
5312 if (value != "UTF-8")
5313 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5314 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005315 }
5316
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005317 // -fcaret-diagnostics is default.
5318 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5319 options::OPT_fno_caret_diagnostics, true))
5320 CmdArgs.push_back("-fno-caret-diagnostics");
5321
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005322 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005323 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005324 options::OPT_fno_diagnostics_fixit_info))
5325 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005326
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005327 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005328 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005329 options::OPT_fno_diagnostics_show_option))
5330 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005331
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005332 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005333 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005334 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005335 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005336 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005338 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005339 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005340 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005341 }
5342
Chandler Carruthb6766f02011-03-27 01:50:55 +00005343 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005344 options::OPT_fdiagnostics_show_note_include_stack,
5345 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005346 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005348 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5349 else
5350 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5351 }
5352
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005353 // Color diagnostics are the default, unless the terminal doesn't support
5354 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005355 // Support both clang's -f[no-]color-diagnostics and gcc's
5356 // -f[no-]diagnostics-colors[=never|always|auto].
5357 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005358 for (const auto &Arg : Args) {
5359 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005360 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5361 !O.matches(options::OPT_fdiagnostics_color) &&
5362 !O.matches(options::OPT_fno_color_diagnostics) &&
5363 !O.matches(options::OPT_fno_diagnostics_color) &&
5364 !O.matches(options::OPT_fdiagnostics_color_EQ))
5365 continue;
5366
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005367 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005368 if (O.matches(options::OPT_fcolor_diagnostics) ||
5369 O.matches(options::OPT_fdiagnostics_color)) {
5370 ShowColors = Colors_On;
5371 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5372 O.matches(options::OPT_fno_diagnostics_color)) {
5373 ShowColors = Colors_Off;
5374 } else {
5375 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005376 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005377 if (value == "always")
5378 ShowColors = Colors_On;
5379 else if (value == "never")
5380 ShowColors = Colors_Off;
5381 else if (value == "auto")
5382 ShowColors = Colors_Auto;
5383 else
5384 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005385 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005386 }
5387 }
5388 if (ShowColors == Colors_On ||
5389 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005390 CmdArgs.push_back("-fcolor-diagnostics");
5391
Nico Rieck7857d462013-09-11 00:38:02 +00005392 if (Args.hasArg(options::OPT_fansi_escape_codes))
5393 CmdArgs.push_back("-fansi-escape-codes");
5394
Daniel Dunbardb097022009-06-08 21:13:54 +00005395 if (!Args.hasFlag(options::OPT_fshow_source_location,
5396 options::OPT_fno_show_source_location))
5397 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005398
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005399 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005400 true))
5401 CmdArgs.push_back("-fno-show-column");
5402
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005403 if (!Args.hasFlag(options::OPT_fspell_checking,
5404 options::OPT_fno_spell_checking))
5405 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005406
Chad Rosierc8e56e82012-12-05 21:08:21 +00005407 // -fno-asm-blocks is default.
5408 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5409 false))
5410 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005411
Steven Wucb0d13f2015-01-16 23:05:28 +00005412 // -fgnu-inline-asm is default.
5413 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5414 options::OPT_fno_gnu_inline_asm, true))
5415 CmdArgs.push_back("-fno-gnu-inline-asm");
5416
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005417 // Enable vectorization per default according to the optimization level
5418 // selected. For optimization levels that want vectorization we use the alias
5419 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005420 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005421 OptSpecifier VectorizeAliasOption =
5422 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005423 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005424 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005425 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005426
Chad Rosier136d67d2014-04-28 19:30:57 +00005427 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005428 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 OptSpecifier SLPVectAliasOption =
5430 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005431 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005432 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005433 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005434
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005435 // -fno-slp-vectorize-aggressive is default.
5436 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005437 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005438 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005439
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005440 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5441 A->render(Args, CmdArgs);
5442
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005443 // -fdollars-in-identifiers default varies depending on platform and
5444 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005445 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005446 options::OPT_fno_dollars_in_identifiers)) {
5447 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005448 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005449 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005450 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005451 }
5452
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005453 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5454 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005455 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005456 options::OPT_fno_unit_at_a_time)) {
5457 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005458 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005459 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005460
Eli Friedman055c9702011-11-02 01:53:16 +00005461 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5462 options::OPT_fno_apple_pragma_pack, false))
5463 CmdArgs.push_back("-fapple-pragma-pack");
5464
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005465 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005466 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5467 // by default.
5468 if (getToolChain().getArch() == llvm::Triple::le32) {
5469 CmdArgs.push_back("-fno-math-builtin");
5470 }
5471
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005472// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5473//
5474// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005475#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005476 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005477 (getToolChain().getArch() == llvm::Triple::arm ||
5478 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005479 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5480 CmdArgs.push_back("-fno-builtin-strcat");
5481 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5482 CmdArgs.push_back("-fno-builtin-strcpy");
5483 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005484#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005485
Justin Bognera88f0122014-06-20 22:59:50 +00005486 // Enable rewrite includes if the user's asked for it or if we're generating
5487 // diagnostics.
5488 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5489 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005490 if (Args.hasFlag(options::OPT_frewrite_includes,
5491 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005492 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005493 CmdArgs.push_back("-frewrite-includes");
5494
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005495 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005496 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005497 options::OPT_traditional_cpp)) {
5498 if (isa<PreprocessJobAction>(JA))
5499 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005500 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005501 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005502 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005503
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005504 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005505 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005506
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005507 // Handle serialized diagnostics.
5508 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5509 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005510 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005511 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005512
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005513 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5514 CmdArgs.push_back("-fretain-comments-from-system-headers");
5515
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005516 // Forward -fcomment-block-commands to -cc1.
5517 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005518 // Forward -fparse-all-comments to -cc1.
5519 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005520
John Brawnad31ace2015-09-23 13:55:40 +00005521 // Turn -fplugin=name.so into -load name.so
5522 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5523 CmdArgs.push_back("-load");
5524 CmdArgs.push_back(A->getValue());
5525 A->claim();
5526 }
5527
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005528 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5529 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005530 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005531 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5532 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005533
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005534 // We translate this by hand to the -cc1 argument, since nightly test uses
5535 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005536 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005537 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005538 } else
Sean Silva14facf32015-06-09 01:57:17 +00005539 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005540 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005541
Bob Wilson23a55f12014-12-21 07:00:00 +00005542 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005543 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5544 // by the frontend.
5545 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5546 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005547
Daniel Dunbard67a3222009-03-30 06:36:42 +00005548 if (Output.getType() == types::TY_Dependencies) {
5549 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005550 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005551 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005552 CmdArgs.push_back(Output.getFilename());
5553 } else {
5554 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005555 }
5556
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005557 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005558
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005559 if (Input.isFilename())
5560 CmdArgs.push_back(Input.getFilename());
5561 else
5562 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005563
Chris Lattnere9d7d782009-11-03 19:50:27 +00005564 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5565
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005566 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005567
5568 // Optionally embed the -cc1 level arguments into the debug info, for build
5569 // analysis.
5570 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005571 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005572 for (const auto &Arg : Args)
5573 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005574
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005575 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005576 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005577 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005578 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005579 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005580 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005581 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005582 }
5583 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005584 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005585 }
5586
Eric Christopherd3804002013-02-22 20:12:52 +00005587 // Add the split debug info name to the command lines here so we
5588 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005589 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005590 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5591 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005592 const char *SplitDwarfOut;
5593 if (SplitDwarf) {
5594 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005595 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005596 CmdArgs.push_back(SplitDwarfOut);
5597 }
5598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005599 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5600 // Include them with -fcuda-include-gpubinary.
5601 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005602 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005603 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005604 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005605 }
5606
Eric Christopherd3804002013-02-22 20:12:52 +00005607 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005608 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005609 Output.getType() == types::TY_Object &&
5610 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005611 auto CLCommand =
5612 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005613 C.addCommand(llvm::make_unique<FallbackCommand>(
5614 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005615 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005617 }
5618
Eric Christopherf1545832013-02-22 23:50:16 +00005619 // Handle the debug info splitting at object creation time if we're
5620 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005621 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005622 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005623 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005624
Roman Divacky178e01602011-02-10 16:52:03 +00005625 if (Arg *A = Args.getLastArg(options::OPT_pg))
5626 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005627 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5628 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005629
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005630 // Claim some arguments which clang supports automatically.
5631
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005632 // -fpch-preprocess is used with gcc to add a special marker in the output to
5633 // include the PCH file. Clang's PTH solution is completely transparent, so we
5634 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005635 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005636
Daniel Dunbar17731772009-03-23 19:03:36 +00005637 // Claim some arguments which clang doesn't support, but we don't
5638 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005639 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5640 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005641
Rafael Espindolab0092d72013-09-04 19:37:35 +00005642 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005643 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005644}
5645
John McCall5fb5df92012-06-20 06:18:46 +00005646/// Add options related to the Objective-C runtime/ABI.
5647///
5648/// Returns true if the runtime is non-fragile.
5649ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5650 ArgStringList &cmdArgs,
5651 RewriteKind rewriteKind) const {
5652 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005653 Arg *runtimeArg =
5654 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5655 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005656
5657 // Just forward -fobjc-runtime= to the frontend. This supercedes
5658 // options about fragility.
5659 if (runtimeArg &&
5660 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5661 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005662 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005663 if (runtime.tryParse(value)) {
5664 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005665 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005666 }
5667
5668 runtimeArg->render(args, cmdArgs);
5669 return runtime;
5670 }
5671
5672 // Otherwise, we'll need the ABI "version". Version numbers are
5673 // slightly confusing for historical reasons:
5674 // 1 - Traditional "fragile" ABI
5675 // 2 - Non-fragile ABI, version 1
5676 // 3 - Non-fragile ABI, version 2
5677 unsigned objcABIVersion = 1;
5678 // If -fobjc-abi-version= is present, use that to set the version.
5679 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005680 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005681 if (value == "1")
5682 objcABIVersion = 1;
5683 else if (value == "2")
5684 objcABIVersion = 2;
5685 else if (value == "3")
5686 objcABIVersion = 3;
5687 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005688 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005689 } else {
5690 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005691 bool nonFragileABIIsDefault =
5692 (rewriteKind == RK_NonFragile ||
5693 (rewriteKind == RK_None &&
5694 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005695 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5696 options::OPT_fno_objc_nonfragile_abi,
5697 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005698// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005699#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5700 unsigned nonFragileABIVersion = 1;
5701#else
5702 unsigned nonFragileABIVersion = 2;
5703#endif
5704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005705 if (Arg *abiArg =
5706 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005707 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005708 if (value == "1")
5709 nonFragileABIVersion = 1;
5710 else if (value == "2")
5711 nonFragileABIVersion = 2;
5712 else
5713 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005714 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005715 }
5716
5717 objcABIVersion = 1 + nonFragileABIVersion;
5718 } else {
5719 objcABIVersion = 1;
5720 }
5721 }
5722
5723 // We don't actually care about the ABI version other than whether
5724 // it's non-fragile.
5725 bool isNonFragile = objcABIVersion != 1;
5726
5727 // If we have no runtime argument, ask the toolchain for its default runtime.
5728 // However, the rewriter only really supports the Mac runtime, so assume that.
5729 ObjCRuntime runtime;
5730 if (!runtimeArg) {
5731 switch (rewriteKind) {
5732 case RK_None:
5733 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5734 break;
5735 case RK_Fragile:
5736 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5737 break;
5738 case RK_NonFragile:
5739 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5740 break;
5741 }
5742
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005744 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5745 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005746 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005747 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5748
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005749 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005750 } else {
5751 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5752 }
5753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005754 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005755 } else {
5756 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005757 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005758 // non-fragile mode or the GCC runtime in fragile mode.
5759 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005760 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005761 else
5762 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005763 }
5764
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005765 cmdArgs.push_back(
5766 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005767 return runtime;
5768}
5769
Reid Klecknerc542d372014-06-27 17:02:02 +00005770static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5771 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5772 I += HaveDash;
5773 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005774}
Reid Klecknerc542d372014-06-27 17:02:02 +00005775
Benjamin Kramere003ca22015-10-28 13:54:16 +00005776namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005777struct EHFlags {
5778 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5779 bool Synch;
5780 bool Asynch;
5781 bool NoExceptC;
5782};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005783} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005784
5785/// /EH controls whether to run destructor cleanups when exceptions are
5786/// thrown. There are three modifiers:
5787/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5788/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5789/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5790/// - c: Assume that extern "C" functions are implicitly noexcept. This
5791/// modifier is an optimization, so we ignore it for now.
5792/// The default is /EHs-c-, meaning cleanups are disabled.
5793static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5794 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005796 std::vector<std::string> EHArgs =
5797 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005798 for (auto EHVal : EHArgs) {
5799 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5800 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005801 case 'a':
5802 EH.Asynch = maybeConsumeDash(EHVal, I);
5803 continue;
5804 case 'c':
5805 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5806 continue;
5807 case 's':
5808 EH.Synch = maybeConsumeDash(EHVal, I);
5809 continue;
5810 default:
5811 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005812 }
5813 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5814 break;
5815 }
5816 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005817
Reid Klecknerc542d372014-06-27 17:02:02 +00005818 return EH;
5819}
5820
Douglas Katzman3459ce22015-10-08 04:24:12 +00005821void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5822 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5823 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005824 unsigned RTOptionID = options::OPT__SLASH_MT;
5825
Hans Wennborgf1a74252013-09-10 20:18:04 +00005826 if (Args.hasArg(options::OPT__SLASH_LDd))
5827 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5828 // but defining _DEBUG is sticky.
5829 RTOptionID = options::OPT__SLASH_MTd;
5830
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005831 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005832 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005833
David Majnemere2afb472015-07-24 06:49:13 +00005834 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005835 switch (RTOptionID) {
5836 case options::OPT__SLASH_MD:
5837 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005838 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005839 CmdArgs.push_back("-D_MT");
5840 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005841 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 break;
5843 case options::OPT__SLASH_MDd:
5844 CmdArgs.push_back("-D_DEBUG");
5845 CmdArgs.push_back("-D_MT");
5846 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005847 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005848 break;
5849 case options::OPT__SLASH_MT:
5850 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005851 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005852 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005853 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005854 break;
5855 case options::OPT__SLASH_MTd:
5856 CmdArgs.push_back("-D_DEBUG");
5857 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005858 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 break;
5860 default:
5861 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005862 }
5863
David Majnemere2afb472015-07-24 06:49:13 +00005864 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5865 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5866 } else {
5867 CmdArgs.push_back(FlagForCRT.data());
5868
5869 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5870 // users want. The /Za flag to cl.exe turns this off, but it's not
5871 // implemented in clang.
5872 CmdArgs.push_back("--dependent-lib=oldnames");
5873 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005874
Hans Wennborg8858a032014-07-21 23:42:07 +00005875 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5876 // would produce interleaved output, so ignore /showIncludes in such cases.
5877 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5878 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5879 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005880
David Majnemerf6072342014-07-01 22:24:56 +00005881 // This controls whether or not we emit RTTI data for polymorphic types.
5882 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5883 /*default=*/false))
5884 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005885
Reid Kleckner124955a2015-08-05 18:51:13 +00005886 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005887 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005888 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5889 // If we are emitting CV but not DWARF, don't build information that LLVM
5890 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005891 if (*EmitCodeView && !EmitDwarf)
5892 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5893 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005894 CmdArgs.push_back("-gcodeview");
5895
Reid Klecknerc542d372014-06-27 17:02:02 +00005896 const Driver &D = getToolChain().getDriver();
5897 EHFlags EH = parseClangCLEHFlags(D, Args);
5898 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005899 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005900 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005901 CmdArgs.push_back("-fexceptions");
5902 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005903
Hans Wennborge50cec32014-06-13 20:59:54 +00005904 // /EP should expand to -E -P.
5905 if (Args.hasArg(options::OPT__SLASH_EP)) {
5906 CmdArgs.push_back("-E");
5907 CmdArgs.push_back("-P");
5908 }
5909
David Majnemera5b195a2015-02-14 01:35:12 +00005910 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005911 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5912 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005913 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5914 else
5915 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5916
5917 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5918 VolatileOptionID = A->getOption().getID();
5919
5920 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5921 CmdArgs.push_back("-fms-volatile");
5922
David Majnemer86c318f2014-02-11 21:05:00 +00005923 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5924 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5925 if (MostGeneralArg && BestCaseArg)
5926 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5927 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5928
5929 if (MostGeneralArg) {
5930 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5931 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5932 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5933
5934 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5935 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5936 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5937 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5938 << FirstConflict->getAsString(Args)
5939 << SecondConflict->getAsString(Args);
5940
5941 if (SingleArg)
5942 CmdArgs.push_back("-fms-memptr-rep=single");
5943 else if (MultipleArg)
5944 CmdArgs.push_back("-fms-memptr-rep=multiple");
5945 else
5946 CmdArgs.push_back("-fms-memptr-rep=virtual");
5947 }
5948
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005949 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5950 A->render(Args, CmdArgs);
5951
Hans Wennborg81f74482013-09-10 01:07:07 +00005952 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5953 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005954 if (Args.hasArg(options::OPT__SLASH_fallback))
5955 CmdArgs.push_back("msvc-fallback");
5956 else
5957 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005958 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005959}
5960
Douglas Katzman95354292015-06-23 20:42:09 +00005961visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005962 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005963 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005964 return CLFallback.get();
5965}
5966
Daniel Sanders7f933f42015-01-30 17:35:23 +00005967void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5968 ArgStringList &CmdArgs) const {
5969 StringRef CPUName;
5970 StringRef ABIName;
5971 const llvm::Triple &Triple = getToolChain().getTriple();
5972 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5973
5974 CmdArgs.push_back("-target-abi");
5975 CmdArgs.push_back(ABIName.data());
5976}
5977
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005978void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005980 const ArgList &Args,
5981 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005982 ArgStringList CmdArgs;
5983
5984 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5985 const InputInfo &Input = Inputs[0];
5986
James Y Knight2db38f32015-08-15 03:45:25 +00005987 std::string TripleStr =
5988 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5989 const llvm::Triple Triple(TripleStr);
5990
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005991 // Don't warn about "clang -w -c foo.s"
5992 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005993 // and "clang -emit-llvm -c foo.s"
5994 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005995
Rafael Espindola577637a2015-01-03 00:06:04 +00005996 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005997
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005998 // Invoke ourselves in -cc1as mode.
5999 //
6000 // FIXME: Implement custom jobs for internal actions.
6001 CmdArgs.push_back("-cc1as");
6002
6003 // Add the "effective" target triple.
6004 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006005 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6006
6007 // Set the output mode, we currently only expect to be used as a real
6008 // assembler.
6009 CmdArgs.push_back("-filetype");
6010 CmdArgs.push_back("obj");
6011
Eric Christopher45f2e712012-12-18 00:31:10 +00006012 // Set the main file name, so that debug info works even with
6013 // -save-temps or preprocessed assembly.
6014 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006015 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006016
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006017 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006018 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006019 if (!CPU.empty()) {
6020 CmdArgs.push_back("-target-cpu");
6021 CmdArgs.push_back(Args.MakeArgString(CPU));
6022 }
6023
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006024 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006025 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006026
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006027 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006028 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006029
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006030 // Pass along any -I options so we get proper .include search paths.
6031 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6032
Eric Christopherfc3ee562012-01-10 00:38:01 +00006033 // Determine the original source input.
6034 const Action *SourceAction = &JA;
6035 while (SourceAction->getKind() != Action::InputClass) {
6036 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6037 SourceAction = SourceAction->getInputs()[0];
6038 }
6039
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006040 // Forward -g and handle debug info related flags, assuming we are dealing
6041 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006042 if (SourceAction->getType() == types::TY_Asm ||
6043 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006044 bool WantDebug = false;
6045 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006046 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006047 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006048 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6049 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006050 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006051 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006052 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006053 if (DwarfVersion == 0)
6054 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006055 RenderDebugEnablingArgs(Args, CmdArgs,
6056 (WantDebug ? CodeGenOptions::LimitedDebugInfo
6057 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006058 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006059
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006060 // Add the -fdebug-compilation-dir flag if needed.
6061 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006062
6063 // Set the AT_producer to the clang version when using the integrated
6064 // assembler on assembly source files.
6065 CmdArgs.push_back("-dwarf-debug-producer");
6066 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006067
6068 // And pass along -I options
6069 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006070 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006071
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006072 // Handle -fPIC et al -- the relocation-model affects the assembler
6073 // for some targets.
6074 llvm::Reloc::Model RelocationModel;
6075 unsigned PICLevel;
6076 bool IsPIE;
6077 std::tie(RelocationModel, PICLevel, IsPIE) =
6078 ParsePICArgs(getToolChain(), Triple, Args);
6079
6080 const char *RMName = RelocationModelName(RelocationModel);
6081 if (RMName) {
6082 CmdArgs.push_back("-mrelocation-model");
6083 CmdArgs.push_back(RMName);
6084 }
6085
Kevin Enderby292dc082011-12-22 19:31:58 +00006086 // Optionally embed the -cc1as level arguments into the debug info, for build
6087 // analysis.
6088 if (getToolChain().UseDwarfDebugFlags()) {
6089 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006090 for (const auto &Arg : Args)
6091 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006092
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006093 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006094 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6095 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006096 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006097 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006098 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006099 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006100 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006101 }
6102 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006103 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006104 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006105
6106 // FIXME: Add -static support, once we have it.
6107
Daniel Sanders7f933f42015-01-30 17:35:23 +00006108 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006109 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006110 default:
6111 break;
6112
6113 case llvm::Triple::mips:
6114 case llvm::Triple::mipsel:
6115 case llvm::Triple::mips64:
6116 case llvm::Triple::mips64el:
6117 AddMIPSTargetArgs(Args, CmdArgs);
6118 break;
6119 }
6120
David Blaikie372d9502014-01-17 03:17:40 +00006121 // Consume all the warning flags. Usually this would be handled more
6122 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6123 // doesn't handle that so rather than warning about unused flags that are
6124 // actually used, we'll lie by omission instead.
6125 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006126 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006127
David Blaikie9260ed62013-07-25 21:19:01 +00006128 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6129 getToolChain().getDriver());
6130
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006131 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006132
6133 assert(Output.isFilename() && "Unexpected lipo output.");
6134 CmdArgs.push_back("-o");
6135 CmdArgs.push_back(Output.getFilename());
6136
Daniel Dunbarb440f562010-08-02 02:38:21 +00006137 assert(Input.isFilename() && "Invalid input.");
6138 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006139
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006140 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006142
6143 // Handle the debug info splitting at object creation time if we're
6144 // creating an object.
6145 // TODO: Currently only works on linux with newer objcopy.
6146 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006147 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006148 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006149 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006150}
6151
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006152void GnuTool::anchor() {}
6153
Daniel Dunbara3246a02009-03-18 08:07:30 +00006154void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006155 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006156 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006157 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006158 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006159 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006160
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006161 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006162 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006163 // It is unfortunate that we have to claim here, as this means
6164 // we will basically never report anything interesting for
6165 // platforms using a generic gcc, even if we are just using gcc
6166 // to get to the assembler.
6167 A->claim();
6168
Daniel Dunbar939c1212010-08-03 16:14:14 +00006169 // Don't forward any -g arguments to assembly steps.
6170 if (isa<AssembleJobAction>(JA) &&
6171 A->getOption().matches(options::OPT_g_Group))
6172 continue;
6173
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006174 // Don't forward any -W arguments to assembly and link steps.
6175 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6176 A->getOption().matches(options::OPT_W_Group))
6177 continue;
6178
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006179 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006180 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006181 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006182
Daniel Dunbar4e295052010-01-25 22:35:08 +00006183 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006184
6185 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006186 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006187 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006188 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006189 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006190 }
6191
Daniel Dunbar5716d872009-05-02 21:41:52 +00006192 // Try to force gcc to match the tool chain we want, if we recognize
6193 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006194 //
6195 // FIXME: The triple class should directly provide the information we want
6196 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006197 switch (getToolChain().getArch()) {
6198 default:
6199 break;
6200 case llvm::Triple::x86:
6201 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006202 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006203 break;
6204 case llvm::Triple::x86_64:
6205 case llvm::Triple::ppc64:
6206 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006207 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006208 break;
6209 case llvm::Triple::sparcel:
6210 CmdArgs.push_back("-EL");
6211 break;
6212 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006213
Daniel Dunbarb440f562010-08-02 02:38:21 +00006214 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006215 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006216 CmdArgs.push_back(Output.getFilename());
6217 } else {
6218 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006219 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006220 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006222 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006223
6224 // Only pass -x if gcc will understand it; otherwise hope gcc
6225 // understands the suffix correctly. The main use case this would go
6226 // wrong in is for linker inputs if they happened to have an odd
6227 // suffix; really the only way to get this to happen is a command
6228 // like '-x foobar a.c' which will treat a.c like a linker input.
6229 //
6230 // FIXME: For the linker case specifically, can we safely convert
6231 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006232 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006233 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006234 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006235 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006236 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006237 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006238 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006239 else if (II.getType() == types::TY_ModuleFile)
6240 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006241 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006242
Daniel Dunbara3246a02009-03-18 08:07:30 +00006243 if (types::canTypeBeUserSpecified(II.getType())) {
6244 CmdArgs.push_back("-x");
6245 CmdArgs.push_back(types::getTypeName(II.getType()));
6246 }
6247
Daniel Dunbarb440f562010-08-02 02:38:21 +00006248 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006249 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006250 else {
6251 const Arg &A = II.getInputArg();
6252
6253 // Reverse translate some rewritten options.
6254 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6255 CmdArgs.push_back("-lstdc++");
6256 continue;
6257 }
6258
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006259 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006260 A.render(Args, CmdArgs);
6261 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006262 }
6263
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006264 const std::string customGCCName = D.getCCCGenericGCCName();
6265 const char *GCCName;
6266 if (!customGCCName.empty())
6267 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006268 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006269 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006270 } else
6271 GCCName = "gcc";
6272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006273 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006275}
6276
Douglas Katzman95354292015-06-23 20:42:09 +00006277void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6278 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006279 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006280}
6281
Douglas Katzman95354292015-06-23 20:42:09 +00006282void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6283 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006284 const Driver &D = getToolChain().getDriver();
6285
Eric Christophercc7ff502015-01-29 00:56:17 +00006286 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006287 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006288 case types::TY_LLVM_IR:
6289 case types::TY_LTO_IR:
6290 case types::TY_LLVM_BC:
6291 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006292 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006293 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006294 // We assume we've got an "integrated" assembler in that gcc will produce an
6295 // object file itself.
6296 case types::TY_Object:
6297 CmdArgs.push_back("-c");
6298 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006299 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006300 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006301 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006302 case types::TY_Nothing:
6303 CmdArgs.push_back("-fsyntax-only");
6304 break;
6305 default:
6306 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006307 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006308}
6309
Douglas Katzman95354292015-06-23 20:42:09 +00006310void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6311 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006312 // The types are (hopefully) good enough.
6313}
6314
Tony Linthicum76329bf2011-12-12 21:14:55 +00006315// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006316void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006317 ArgStringList &CmdArgs) const {
6318}
6319
Douglas Katzman95354292015-06-23 20:42:09 +00006320void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6321 const InputInfo &Output,
6322 const InputInfoList &Inputs,
6323 const ArgList &Args,
6324 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006325 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006327 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6328 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329 ArgStringList CmdArgs;
6330
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006331 std::string MArchString = "-march=hexagon";
6332 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333
6334 RenderExtraToolArgs(JA, CmdArgs);
6335
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006336 std::string AsName = "hexagon-llvm-mc";
6337 std::string MCpuString = "-mcpu=hexagon" +
6338 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6339 CmdArgs.push_back("-filetype=obj");
6340 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6341
Tony Linthicum76329bf2011-12-12 21:14:55 +00006342 if (Output.isFilename()) {
6343 CmdArgs.push_back("-o");
6344 CmdArgs.push_back(Output.getFilename());
6345 } else {
6346 assert(Output.isNothing() && "Unexpected output");
6347 CmdArgs.push_back("-fsyntax-only");
6348 }
6349
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6351 std::string N = llvm::utostr(G.getValue());
6352 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6353 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006354
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006355 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006356
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357 // Only pass -x if gcc will understand it; otherwise hope gcc
6358 // understands the suffix correctly. The main use case this would go
6359 // wrong in is for linker inputs if they happened to have an odd
6360 // suffix; really the only way to get this to happen is a command
6361 // like '-x foobar a.c' which will treat a.c like a linker input.
6362 //
6363 // FIXME: For the linker case specifically, can we safely convert
6364 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006365 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006366 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006367 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006368 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006369 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006370 else if (II.getType() == types::TY_AST)
6371 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006373 else if (II.getType() == types::TY_ModuleFile)
6374 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006376
6377 if (II.isFilename())
6378 CmdArgs.push_back(II.getFilename());
6379 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006380 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006381 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006382 II.getInputArg().render(Args, CmdArgs);
6383 }
6384
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006385 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006386 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006387}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006388
Douglas Katzman95354292015-06-23 20:42:09 +00006389void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6390 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006391}
6392
Douglas Katzman54366072015-07-27 16:53:08 +00006393static void
6394constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006395 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006396 const InputInfo &Output, const InputInfoList &Inputs,
6397 const ArgList &Args, ArgStringList &CmdArgs,
6398 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006399
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006400 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006401
Matthew Curtise689b052012-12-06 15:46:07 +00006402 //----------------------------------------------------------------------------
6403 //
6404 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006405 bool IsStatic = Args.hasArg(options::OPT_static);
6406 bool IsShared = Args.hasArg(options::OPT_shared);
6407 bool IsPIE = Args.hasArg(options::OPT_pie);
6408 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6409 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6410 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6411 bool UseG0 = false;
6412 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006413
Matthew Curtise689b052012-12-06 15:46:07 +00006414 //----------------------------------------------------------------------------
6415 // Silence warnings for various options
6416 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006417 Args.ClaimAllArgs(options::OPT_g_Group);
6418 Args.ClaimAllArgs(options::OPT_emit_llvm);
6419 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6420 // handled somewhere else.
6421 Args.ClaimAllArgs(options::OPT_static_libgcc);
6422
6423 //----------------------------------------------------------------------------
6424 //
6425 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006426 if (Args.hasArg(options::OPT_s))
6427 CmdArgs.push_back("-s");
6428
6429 if (Args.hasArg(options::OPT_r))
6430 CmdArgs.push_back("-r");
6431
6432 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006433 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006434
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006435 CmdArgs.push_back("-march=hexagon");
6436 std::string CpuVer =
6437 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6438 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6439 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006440
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006441 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006442 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 // The following should be the default, but doing as hexagon-gcc does.
6444 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006445 }
6446
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006448 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006449
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006451 CmdArgs.push_back("-pie");
6452
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6454 std::string N = llvm::utostr(G.getValue());
6455 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6456 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006457 }
6458
Matthew Curtise689b052012-12-06 15:46:07 +00006459 //----------------------------------------------------------------------------
6460 //
6461 //----------------------------------------------------------------------------
6462 CmdArgs.push_back("-o");
6463 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006464
Matthew Curtise689b052012-12-06 15:46:07 +00006465 //----------------------------------------------------------------------------
6466 // moslib
6467 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006468 std::vector<std::string> OsLibs;
6469 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006470
Sean Silva14facf32015-06-09 01:57:17 +00006471 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6472 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006473 OsLibs.emplace_back(A->getValue());
6474 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006475 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 if (OsLibs.empty()) {
6477 OsLibs.push_back("standalone");
6478 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006479 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480
Matthew Curtise689b052012-12-06 15:46:07 +00006481 //----------------------------------------------------------------------------
6482 // Start Files
6483 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006484 const std::string MCpuSuffix = "/" + CpuVer;
6485 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6486 const std::string RootDir =
6487 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6488 const std::string StartSubDir =
6489 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006490
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6492 const char *Name) -> std::string {
6493 std::string RelName = SubDir + Name;
6494 std::string P = HTC.GetFilePath(RelName.c_str());
6495 if (llvm::sys::fs::exists(P))
6496 return P;
6497 return RootDir + RelName;
6498 };
6499
6500 if (IncStdLib && IncStartFiles) {
6501 if (!IsShared) {
6502 if (HasStandalone) {
6503 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6504 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006505 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006506 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6507 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006508 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006509 std::string Init = UseShared
6510 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6511 : Find(RootDir, StartSubDir, "/init.o");
6512 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006513 }
6514
6515 //----------------------------------------------------------------------------
6516 // Library Search Paths
6517 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006518 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6519 for (const auto &LibPath : LibPaths)
6520 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006521
6522 //----------------------------------------------------------------------------
6523 //
6524 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006525 Args.AddAllArgs(CmdArgs,
6526 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6527 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006528
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006529 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006530
6531 //----------------------------------------------------------------------------
6532 // Libraries
6533 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006534 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006535 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006536 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006537 CmdArgs.push_back("-lm");
6538 }
6539
6540 CmdArgs.push_back("--start-group");
6541
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006542 if (!IsShared) {
6543 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006544 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006545 CmdArgs.push_back("-lc");
6546 }
6547 CmdArgs.push_back("-lgcc");
6548
6549 CmdArgs.push_back("--end-group");
6550 }
6551
6552 //----------------------------------------------------------------------------
6553 // End files
6554 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006555 if (IncStdLib && IncStartFiles) {
6556 std::string Fini = UseShared
6557 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6558 : Find(RootDir, StartSubDir, "/fini.o");
6559 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006560 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006561}
6562
Douglas Katzman95354292015-06-23 20:42:09 +00006563void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6564 const InputInfo &Output,
6565 const InputInfoList &Inputs,
6566 const ArgList &Args,
6567 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006569
6570 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006571 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006572 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006575 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006576 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577}
6578// Hexagon tools end.
6579
Tom Stellard8fa33092015-07-18 01:49:05 +00006580void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6581 const InputInfo &Output,
6582 const InputInfoList &Inputs,
6583 const ArgList &Args,
6584 const char *LinkingOutput) const {
6585
6586 std::string Linker = getToolChain().GetProgramPath(getShortName());
6587 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006588 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6589 CmdArgs.push_back("-o");
6590 CmdArgs.push_back(Output.getFilename());
6591 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6592 CmdArgs, Inputs));
6593}
6594// AMDGPU tools end.
6595
Dan Gohman52816862015-12-16 23:30:41 +00006596wasm::Linker::Linker(const ToolChain &TC)
6597 : GnuTool("wasm::Linker", "lld", TC) {}
6598
6599bool wasm::Linker::isLinkJob() const {
6600 return true;
6601}
6602
6603bool wasm::Linker::hasIntegratedCPP() const {
6604 return false;
6605}
6606
6607void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6608 const InputInfo &Output,
6609 const InputInfoList &Inputs,
6610 const ArgList &Args,
6611 const char *LinkingOutput) const {
6612 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6613 ArgStringList CmdArgs;
6614 CmdArgs.push_back("-flavor");
6615 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006616
6617 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006618 // size is of particular importance. This is significantly facilitated by
6619 // the enabling of -ffunction-sections and -fdata-sections in
6620 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006621 if (areOptimizationsEnabled(Args))
6622 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006623
Dan Gohman52816862015-12-16 23:30:41 +00006624 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6625 CmdArgs.push_back("-o");
6626 CmdArgs.push_back(Output.getFilename());
6627 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6628}
6629
Renato Golin7c542b42015-07-27 23:44:45 +00006630const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006631 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006632 if (!Arch.empty())
6633 MArch = Arch;
6634 else
Bernard Ogden31561762013-12-12 13:27:11 +00006635 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006636 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006637
6638 // Handle -march=native.
6639 if (MArch == "native") {
6640 std::string CPU = llvm::sys::getHostCPUName();
6641 if (CPU != "generic") {
6642 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006643 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006644 // If there is no valid architecture suffix for this CPU we don't know how
6645 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006646 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006647 MArch = "";
6648 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006649 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006650 }
6651 }
6652
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006653 return MArch;
6654}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006655
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006656/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006657StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006658 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006659 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6660 // here means an -march=native that we can't handle, so instead return no CPU.
6661 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006662 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006663
John Brawna95c1a82015-05-08 12:52:18 +00006664 // We need to return an empty string here on invalid MArch values as the
6665 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006666 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006667}
6668
6669/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006670std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006671 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006672 // FIXME: Warn on inconsistent use of -mcpu and -march.
6673 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006674 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006675 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006676 // Handle -mcpu=native.
6677 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006678 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006679 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006680 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006681 }
6682
Renato Goline17c5802015-07-27 23:44:42 +00006683 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006684}
6685
6686/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006687/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006688// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006689StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6690 const llvm::Triple &Triple) {
6691 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006692 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006693 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006694 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006695 if (ArchKind == llvm::ARM::AK_INVALID)
6696 // In case of generic Arch, i.e. "arm",
6697 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006698 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006699 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006700 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6701 // armv7k triple if it's actually been specified via "-arch armv7k".
6702 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006703 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006704 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006705 }
Renato Golin3c007252015-05-28 15:05:53 +00006706 if (ArchKind == llvm::ARM::AK_INVALID)
6707 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006708 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006709}
6710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006711void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006712 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006713 if (Args.hasArg(options::OPT_r))
6714 return;
6715
John Brawn94fd9632015-05-21 12:19:49 +00006716 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6717 // to generate BE-8 executables.
6718 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6719 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006720}
6721
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006722mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006723 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6724 // was first introduced in Release 3. However, other compilers have
6725 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006726 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6727 .Case("mips1", NanLegacy)
6728 .Case("mips2", NanLegacy)
6729 .Case("mips3", NanLegacy)
6730 .Case("mips4", NanLegacy)
6731 .Case("mips5", NanLegacy)
6732 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006733 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006734 .Case("mips32r3", NanLegacy | Nan2008)
6735 .Case("mips32r5", NanLegacy | Nan2008)
6736 .Case("mips32r6", Nan2008)
6737 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006738 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006739 .Case("mips64r3", NanLegacy | Nan2008)
6740 .Case("mips64r5", NanLegacy | Nan2008)
6741 .Case("mips64r6", Nan2008)
6742 .Default(NanLegacy);
6743}
6744
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006745bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6746 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6747 return A && (A->getValue() == StringRef(Value));
6748}
6749
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006750bool mips::isUCLibc(const ArgList &Args) {
6751 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006752 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006753}
6754
Daniel Sanders2bf13662014-07-10 14:40:57 +00006755bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006756 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6757 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006758 .Case("2008", true)
6759 .Case("legacy", false)
6760 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006761
6762 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006763 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006764 .Cases("mips32r6", "mips64r6", true)
6765 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006766
6767 return false;
6768}
6769
Daniel Sanders379d44b2014-07-16 11:52:23 +00006770bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006771 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006772 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006773 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006774 return false;
6775
6776 if (ABIName != "32")
6777 return false;
6778
Toma Tabacu94ea6862015-06-16 13:54:13 +00006779 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6780 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006781 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006782 return false;
6783
Daniel Sanders379d44b2014-07-16 11:52:23 +00006784 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006785 .Cases("mips2", "mips3", "mips4", "mips5", true)
6786 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6787 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6788 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006789}
6790
Toma Tabacu94ea6862015-06-16 13:54:13 +00006791bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6792 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006793 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006794 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6795
6796 // FPXX shouldn't be used if -msingle-float is present.
6797 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6798 options::OPT_mdouble_float))
6799 if (A->getOption().matches(options::OPT_msingle_float))
6800 UseFPXX = false;
6801
6802 return UseFPXX;
6803}
6804
Tim Northover157d9112014-01-16 08:48:16 +00006805llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006806 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6807 // archs which Darwin doesn't use.
6808
6809 // The matching this routine does is fairly pointless, since it is neither the
6810 // complete architecture list, nor a reasonable subset. The problem is that
6811 // historically the driver driver accepts this and also ties its -march=
6812 // handling to the architecture name, so we need to be careful before removing
6813 // support for it.
6814
6815 // This code must be kept in sync with Clang's Darwin specific argument
6816 // translation.
6817
6818 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006819 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6820 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6821 .Case("ppc64", llvm::Triple::ppc64)
6822 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6823 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6824 llvm::Triple::x86)
6825 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6826 // This is derived from the driver driver.
6827 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6828 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6829 .Cases("armv7s", "xscale", llvm::Triple::arm)
6830 .Case("arm64", llvm::Triple::aarch64)
6831 .Case("r600", llvm::Triple::r600)
6832 .Case("amdgcn", llvm::Triple::amdgcn)
6833 .Case("nvptx", llvm::Triple::nvptx)
6834 .Case("nvptx64", llvm::Triple::nvptx64)
6835 .Case("amdil", llvm::Triple::amdil)
6836 .Case("spir", llvm::Triple::spir)
6837 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006838}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006839
Tim Northover157d9112014-01-16 08:48:16 +00006840void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006841 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006842 T.setArch(Arch);
6843
6844 if (Str == "x86_64h")
6845 T.setArchName(Str);
6846 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6847 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006848 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006849 }
6850}
6851
Bob Wilsondecc03e2012-11-23 06:14:39 +00006852const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006853 const InputInfo &Input) {
6854 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006855}
6856
Bob Wilsondecc03e2012-11-23 06:14:39 +00006857const char *Clang::getBaseInputStem(const ArgList &Args,
6858 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006859 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006860
Chris Lattner906bb902011-01-16 08:14:11 +00006861 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006862 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006863
6864 return Str;
6865}
6866
Bob Wilsondecc03e2012-11-23 06:14:39 +00006867const char *Clang::getDependencyFileName(const ArgList &Args,
6868 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006869 // FIXME: Think about this more.
6870 std::string Res;
6871
6872 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006873 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006874 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006875 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006876 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006877 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006878 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006879}
6880
Douglas Katzman95354292015-06-23 20:42:09 +00006881void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6882 const InputInfo &Output,
6883 const InputInfoList &Inputs,
6884 const ArgList &Args,
6885 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006886 const ToolChain &ToolChain = getToolChain();
6887 const Driver &D = ToolChain.getDriver();
6888 ArgStringList CmdArgs;
6889
6890 // Silence warning for "clang -g foo.o -o foo"
6891 Args.ClaimAllArgs(options::OPT_g_Group);
6892 // and "clang -emit-llvm foo.o -o foo"
6893 Args.ClaimAllArgs(options::OPT_emit_llvm);
6894 // and for "clang -w foo.o -o foo". Other warning options are already
6895 // handled somewhere else.
6896 Args.ClaimAllArgs(options::OPT_w);
6897
6898 if (!D.SysRoot.empty())
6899 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6900
6901 // CloudABI only supports static linkage.
6902 CmdArgs.push_back("-Bstatic");
6903 CmdArgs.push_back("--eh-frame-hdr");
6904 CmdArgs.push_back("--gc-sections");
6905
6906 if (Output.isFilename()) {
6907 CmdArgs.push_back("-o");
6908 CmdArgs.push_back(Output.getFilename());
6909 } else {
6910 assert(Output.isNothing() && "Invalid output.");
6911 }
6912
Douglas Katzman78b37b02015-11-17 20:28:07 +00006913 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6916 }
6917
6918 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006919 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006920 Args.AddAllArgs(CmdArgs,
6921 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6922 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006923
Teresa Johnson945bc502015-10-15 20:35:53 +00006924 if (D.isUsingLTO())
6925 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006926
6927 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6928
Douglas Katzman78b37b02015-11-17 20:28:07 +00006929 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006930 if (D.CCCIsCXX())
6931 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6932 CmdArgs.push_back("-lc");
6933 CmdArgs.push_back("-lcompiler_rt");
6934 }
6935
Douglas Katzman78b37b02015-11-17 20:28:07 +00006936 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006937 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6938
6939 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006940 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006941}
6942
Douglas Katzman95354292015-06-23 20:42:09 +00006943void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6944 const InputInfo &Output,
6945 const InputInfoList &Inputs,
6946 const ArgList &Args,
6947 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006948 ArgStringList CmdArgs;
6949
6950 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6951 const InputInfo &Input = Inputs[0];
6952
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006953 // Determine the original source input.
6954 const Action *SourceAction = &JA;
6955 while (SourceAction->getKind() != Action::InputClass) {
6956 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6957 SourceAction = SourceAction->getInputs()[0];
6958 }
6959
Eric Christopherf5a8f492015-12-08 00:10:10 +00006960 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006961 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006962 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6963 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006964 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006965 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006966 const llvm::Triple &T(getToolChain().getTriple());
6967 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006968 CmdArgs.push_back("-Q");
6969 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006970
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006971 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006972 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006973 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006974 if (Args.hasArg(options::OPT_gstabs))
6975 CmdArgs.push_back("--gstabs");
6976 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006977 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006978 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006979
Daniel Dunbarbe220842009-03-20 16:06:39 +00006980 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006981 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006982
Daniel Dunbar6d484762010-07-22 01:47:22 +00006983 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006984 if (getToolChain().getArch() == llvm::Triple::x86 ||
6985 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006986 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6987 CmdArgs.push_back("-force_cpusubtype_ALL");
6988
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006989 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006990 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006991 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006992 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006993 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006994 CmdArgs.push_back("-static");
6995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006996 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006997
6998 assert(Output.isFilename() && "Unexpected lipo output.");
6999 CmdArgs.push_back("-o");
7000 CmdArgs.push_back(Output.getFilename());
7001
Daniel Dunbarb440f562010-08-02 02:38:21 +00007002 assert(Input.isFilename() && "Invalid input.");
7003 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007004
7005 // asm_final spec is empty.
7006
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007007 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007008 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007009}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007010
Tim Northover157d9112014-01-16 08:48:16 +00007011void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007012
Tim Northover157d9112014-01-16 08:48:16 +00007013void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7014 ArgStringList &CmdArgs) const {
7015 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007016
Daniel Dunbarc1964212009-03-26 16:23:12 +00007017 // Derived from darwin_arch spec.
7018 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007019 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007020
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007021 // FIXME: Is this needed anymore?
7022 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007023 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007024}
7025
Douglas Katzman95354292015-06-23 20:42:09 +00007026bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007027 // We only need to generate a temp path for LTO if we aren't compiling object
7028 // files. When compiling source files, we run 'dsymutil' after linking. We
7029 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007030 for (const auto &Input : Inputs)
7031 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007032 return true;
7033
7034 return false;
7035}
7036
Douglas Katzman95354292015-06-23 20:42:09 +00007037void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7038 ArgStringList &CmdArgs,
7039 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007040 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007041 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007042
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007043 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007044 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7045 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007046 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7047 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007048 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007050 }
7051
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007052 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007053 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007054 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7055 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007056
Bob Wilson3d27dad2013-08-02 22:25:34 +00007057 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7058 CmdArgs.push_back("-export_dynamic");
7059
Bob Wilsonb111ec92015-03-02 19:01:14 +00007060 // If we are using App Extension restrictions, pass a flag to the linker
7061 // telling it that the compiled code has been audited.
7062 if (Args.hasFlag(options::OPT_fapplication_extension,
7063 options::OPT_fno_application_extension, false))
7064 CmdArgs.push_back("-application_extension");
7065
Teresa Johnson945bc502015-10-15 20:35:53 +00007066 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007067 // If we are using LTO, then automatically create a temporary file path for
7068 // the linker to use, so that it's lifetime will extend past a possible
7069 // dsymutil step.
7070 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7071 const char *TmpPath = C.getArgs().MakeArgString(
7072 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7073 C.addTempFile(TmpPath);
7074 CmdArgs.push_back("-object_path_lto");
7075 CmdArgs.push_back(TmpPath);
7076 }
7077
7078 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7079 // it in clang installed libraries. If not found, the option is not used
7080 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7081 if (Version[0] >= 133) {
7082 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7083 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7084 SmallString<128> LibLTOPath(P);
7085 llvm::sys::path::append(LibLTOPath, "lib");
7086 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7087 if (llvm::sys::fs::exists(LibLTOPath)) {
7088 CmdArgs.push_back("-lto_library");
7089 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7090 } else {
7091 D.Diag(diag::warn_drv_lto_libpath);
7092 }
7093 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007094 }
7095
Daniel Dunbarc1964212009-03-26 16:23:12 +00007096 // Derived from the "link" spec.
7097 Args.AddAllArgs(CmdArgs, options::OPT_static);
7098 if (!Args.hasArg(options::OPT_static))
7099 CmdArgs.push_back("-dynamic");
7100 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7101 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7102 // here. How do we wish to handle such things?
7103 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007104
Daniel Dunbarc1964212009-03-26 16:23:12 +00007105 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007106 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007107 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007108 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007109
7110 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7111 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7112 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7113
7114 Arg *A;
7115 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7116 (A = Args.getLastArg(options::OPT_current__version)) ||
7117 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007118 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7119 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007120
7121 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7122 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7123 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7124 } else {
7125 CmdArgs.push_back("-dylib");
7126
7127 Arg *A;
7128 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7129 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7130 (A = Args.getLastArg(options::OPT_client__name)) ||
7131 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7132 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7133 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007134 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7135 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007136
Daniel Dunbarc1964212009-03-26 16:23:12 +00007137 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7138 "-dylib_compatibility_version");
7139 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7140 "-dylib_current_version");
7141
Tim Northover157d9112014-01-16 08:48:16 +00007142 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007143
7144 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7145 "-dylib_install_name");
7146 }
7147
7148 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7149 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7150 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007151 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007152 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007153 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7154 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7155 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7156 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7157 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7158 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007159 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007160 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7161 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7162 Args.AddAllArgs(CmdArgs, options::OPT_init);
7163
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007164 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007165 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007166
Daniel Dunbarc1964212009-03-26 16:23:12 +00007167 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7168 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7169 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7170 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7171 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007172
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007173 if (const Arg *A =
7174 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7175 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007176 if (A->getOption().matches(options::OPT_fpie) ||
7177 A->getOption().matches(options::OPT_fPIE))
7178 CmdArgs.push_back("-pie");
7179 else
7180 CmdArgs.push_back("-no_pie");
7181 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007182
7183 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7184 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7185 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7186 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7187 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7188 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7189 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7190 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7191 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7192 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7193 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7194 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7195 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7196 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7197 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7198 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007199
Daniel Dunbar84384642011-05-02 21:03:47 +00007200 // Give --sysroot= preference, over the Apple specific behavior to also use
7201 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007202 StringRef sysroot = C.getSysRoot();
7203 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007204 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007205 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007206 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7207 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007208 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007209 }
7210
Daniel Dunbarc1964212009-03-26 16:23:12 +00007211 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7212 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7213 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7214 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7215 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007216 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007217 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7218 Args.AddAllArgs(CmdArgs, options::OPT_y);
7219 Args.AddLastArg(CmdArgs, options::OPT_w);
7220 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7221 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7222 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7223 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7224 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7225 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7226 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7227 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7228 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7229 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7230 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7231 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7232}
7233
Douglas Katzman95354292015-06-23 20:42:09 +00007234void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7235 const InputInfo &Output,
7236 const InputInfoList &Inputs,
7237 const ArgList &Args,
7238 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007239 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007240
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007241 // If the number of arguments surpasses the system limits, we will encode the
7242 // input files in a separate file, shortening the command line. To this end,
7243 // build a list of input file names that can be passed via a file with the
7244 // -filelist linker option.
7245 llvm::opt::ArgStringList InputFileList;
7246
Daniel Dunbarc1964212009-03-26 16:23:12 +00007247 // The logic here is derived from gcc's behavior; most of which
7248 // comes from specs (starting with link_command). Consult gcc for
7249 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007250 ArgStringList CmdArgs;
7251
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007252 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7253 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7254 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007255 for (const auto &Arg : Args)
7256 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007257 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007258 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007259 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007261 return;
7262 }
7263
Daniel Dunbarc1964212009-03-26 16:23:12 +00007264 // I'm not sure why this particular decomposition exists in gcc, but
7265 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007266 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007267
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007268 // It seems that the 'e' option is completely ignored for dynamic executables
7269 // (the default), and with static executables, the last one wins, as expected.
7270 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7271 options::OPT_Z_Flag, options::OPT_u_Group,
7272 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007273
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007274 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7275 // members of static archive libraries which implement Objective-C classes or
7276 // categories.
7277 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7278 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007279
Daniel Dunbarc1964212009-03-26 16:23:12 +00007280 CmdArgs.push_back("-o");
7281 CmdArgs.push_back(Output.getFilename());
7282
Douglas Katzman78b37b02015-11-17 20:28:07 +00007283 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007284 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007285
Peter Collingbournec4122c12015-06-15 21:08:13 +00007286 // SafeStack requires its own runtime libraries
7287 // These libraries should be linked first, to make sure the
7288 // __safestack_init constructor executes before everything else
7289 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7290 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7291 "libclang_rt.safestack_osx.a",
7292 /*AlwaysLink=*/true);
7293 }
7294
Daniel Dunbarc1964212009-03-26 16:23:12 +00007295 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007296
Douglas Gregor9295df02012-05-15 21:00:27 +00007297 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007298 // Build the input file for -filelist (list of linker input files) in case we
7299 // need it later
7300 for (const auto &II : Inputs) {
7301 if (!II.isFilename()) {
7302 // This is a linker input argument.
7303 // We cannot mix input arguments and file names in a -filelist input, thus
7304 // we prematurely stop our list (remaining files shall be passed as
7305 // arguments).
7306 if (InputFileList.size() > 0)
7307 break;
7308
7309 continue;
7310 }
7311
7312 InputFileList.push_back(II.getFilename());
7313 }
7314
Douglas Katzman78b37b02015-11-17 20:28:07 +00007315 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007316 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7317
Douglas Katzman78b37b02015-11-17 20:28:07 +00007318 if (isObjCRuntimeLinked(Args) &&
7319 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007320 // We use arclite library for both ARC and subscripting support.
7321 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7322
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007323 CmdArgs.push_back("-framework");
7324 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007325 // Link libobj.
7326 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007327 }
John McCall31168b02011-06-15 23:02:42 +00007328
Daniel Dunbarc1964212009-03-26 16:23:12 +00007329 if (LinkingOutput) {
7330 CmdArgs.push_back("-arch_multiple");
7331 CmdArgs.push_back("-final_output");
7332 CmdArgs.push_back(LinkingOutput);
7333 }
7334
Daniel Dunbarc1964212009-03-26 16:23:12 +00007335 if (Args.hasArg(options::OPT_fnested_functions))
7336 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007337
Justin Bognerc7701242015-05-12 05:44:36 +00007338 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7339
Douglas Katzman78b37b02015-11-17 20:28:07 +00007340 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007341 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007342 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 // link_ssp spec is empty.
7345
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007346 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007347 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007348 }
7349
Douglas Katzman78b37b02015-11-17 20:28:07 +00007350 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007351 // endfile_spec is empty.
7352 }
7353
7354 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7355 Args.AddAllArgs(CmdArgs, options::OPT_F);
7356
Steven Wu3ffb61b2015-02-06 18:08:29 +00007357 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007358 for (const Arg *A : Args.filtered(options::OPT_iframework))
7359 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007360
Douglas Katzman78b37b02015-11-17 20:28:07 +00007361 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007362 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7363 if (A->getValue() == StringRef("Accelerate")) {
7364 CmdArgs.push_back("-framework");
7365 CmdArgs.push_back("Accelerate");
7366 }
7367 }
7368 }
7369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007370 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007371 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007372 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007373 Cmd->setInputFileList(std::move(InputFileList));
7374 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007375}
7376
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007377void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007378 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007379 const InputInfoList &Inputs,
7380 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007381 const char *LinkingOutput) const {
7382 ArgStringList CmdArgs;
7383
7384 CmdArgs.push_back("-create");
7385 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007386
7387 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007388 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007389
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007390 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007391 assert(II.isFilename() && "Unexpected lipo input.");
7392 CmdArgs.push_back(II.getFilename());
7393 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007394
7395 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007396 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007397}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007398
Daniel Dunbar88299622010-06-04 18:28:36 +00007399void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007400 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007401 const InputInfoList &Inputs,
7402 const ArgList &Args,
7403 const char *LinkingOutput) const {
7404 ArgStringList CmdArgs;
7405
Daniel Dunbareb86b042011-05-09 17:23:16 +00007406 CmdArgs.push_back("-o");
7407 CmdArgs.push_back(Output.getFilename());
7408
Daniel Dunbar88299622010-06-04 18:28:36 +00007409 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7410 const InputInfo &Input = Inputs[0];
7411 assert(Input.isFilename() && "Unexpected dsymutil input.");
7412 CmdArgs.push_back(Input.getFilename());
7413
Daniel Dunbar88299622010-06-04 18:28:36 +00007414 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007415 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007416 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007417}
7418
Eric Christopher551ef452011-08-23 17:56:55 +00007419void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007420 const InputInfo &Output,
7421 const InputInfoList &Inputs,
7422 const ArgList &Args,
7423 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007424 ArgStringList CmdArgs;
7425 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007426 CmdArgs.push_back("--debug-info");
7427 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007428 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007429
7430 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7431 const InputInfo &Input = Inputs[0];
7432 assert(Input.isFilename() && "Unexpected verify input");
7433
7434 // Grabbing the output of the earlier dsymutil run.
7435 CmdArgs.push_back(Input.getFilename());
7436
7437 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007438 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007440}
7441
Douglas Katzman95354292015-06-23 20:42:09 +00007442void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007443 const InputInfo &Output,
7444 const InputInfoList &Inputs,
7445 const ArgList &Args,
7446 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007447 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007448 ArgStringList CmdArgs;
7449
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007450 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007451
7452 CmdArgs.push_back("-o");
7453 CmdArgs.push_back(Output.getFilename());
7454
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007455 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007456 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007458 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007459 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007460}
7461
Douglas Katzman95354292015-06-23 20:42:09 +00007462void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7463 const InputInfo &Output,
7464 const InputInfoList &Inputs,
7465 const ArgList &Args,
7466 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007467 ArgStringList CmdArgs;
7468
David Chisnall272a0712012-02-29 15:06:12 +00007469 // Demangle C++ names in errors
7470 CmdArgs.push_back("-C");
7471
Douglas Katzman78b37b02015-11-17 20:28:07 +00007472 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007473 CmdArgs.push_back("-e");
7474 CmdArgs.push_back("_start");
7475 }
7476
7477 if (Args.hasArg(options::OPT_static)) {
7478 CmdArgs.push_back("-Bstatic");
7479 CmdArgs.push_back("-dn");
7480 } else {
7481 CmdArgs.push_back("-Bdynamic");
7482 if (Args.hasArg(options::OPT_shared)) {
7483 CmdArgs.push_back("-shared");
7484 } else {
7485 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007486 CmdArgs.push_back(
7487 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007488 }
7489 }
7490
7491 if (Output.isFilename()) {
7492 CmdArgs.push_back("-o");
7493 CmdArgs.push_back(Output.getFilename());
7494 } else {
7495 assert(Output.isNothing() && "Invalid output.");
7496 }
7497
Douglas Katzman78b37b02015-11-17 20:28:07 +00007498 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007499 if (!Args.hasArg(options::OPT_shared))
7500 CmdArgs.push_back(
7501 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7502
7503 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7504 CmdArgs.push_back(
7505 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7506 CmdArgs.push_back(
7507 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007508 }
7509
Douglas Katzman6059ef92015-11-17 17:41:23 +00007510 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007511
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007512 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7513 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007514
7515 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7516
Douglas Katzman78b37b02015-11-17 20:28:07 +00007517 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007518 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007519 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007520 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007521 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007522 if (!Args.hasArg(options::OPT_shared)) {
7523 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007524 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007525 }
David Chisnallf571cde2012-02-15 13:39:01 +00007526 }
7527
Douglas Katzman78b37b02015-11-17 20:28:07 +00007528 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007529 CmdArgs.push_back(
7530 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007531 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007532 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007533
Xinliang David Li69306c02015-10-22 06:15:31 +00007534 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007535
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007536 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007537 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007538}
7539
Douglas Katzman95354292015-06-23 20:42:09 +00007540void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7541 const InputInfo &Output,
7542 const InputInfoList &Inputs,
7543 const ArgList &Args,
7544 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007545 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007546 ArgStringList CmdArgs;
7547
Rafael Espindolacc126272014-02-28 01:55:21 +00007548 switch (getToolChain().getArch()) {
7549 case llvm::Triple::x86:
7550 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7551 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007552 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007553 break;
7554
7555 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007556 CmdArgs.push_back("-mppc");
7557 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007558 break;
7559
7560 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007561 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007562 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007563 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7564 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7565 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007566 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007567 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007568
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007569 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007570 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007571 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7572 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7573 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007574 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007575 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007576
7577 case llvm::Triple::mips64:
7578 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007579 StringRef CPUName;
7580 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007581 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007582
7583 CmdArgs.push_back("-mabi");
7584 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7585
7586 if (getToolChain().getArch() == llvm::Triple::mips64)
7587 CmdArgs.push_back("-EB");
7588 else
7589 CmdArgs.push_back("-EL");
7590
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007591 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007592 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007593 }
7594
Rafael Espindolacc126272014-02-28 01:55:21 +00007595 default:
7596 break;
7597 }
7598
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007599 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007600
7601 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007602 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007603
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007604 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007605 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007606
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007607 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007608 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007609}
7610
Douglas Katzman95354292015-06-23 20:42:09 +00007611void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7612 const InputInfo &Output,
7613 const InputInfoList &Inputs,
7614 const ArgList &Args,
7615 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007616 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007617 ArgStringList CmdArgs;
7618
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007619 // Silence warning for "clang -g foo.o -o foo"
7620 Args.ClaimAllArgs(options::OPT_g_Group);
7621 // and "clang -emit-llvm foo.o -o foo"
7622 Args.ClaimAllArgs(options::OPT_emit_llvm);
7623 // and for "clang -w foo.o -o foo". Other warning options are already
7624 // handled somewhere else.
7625 Args.ClaimAllArgs(options::OPT_w);
7626
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007627 if (getToolChain().getArch() == llvm::Triple::mips64)
7628 CmdArgs.push_back("-EB");
7629 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7630 CmdArgs.push_back("-EL");
7631
Douglas Katzman78b37b02015-11-17 20:28:07 +00007632 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007633 CmdArgs.push_back("-e");
7634 CmdArgs.push_back("__start");
7635 }
7636
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007637 if (Args.hasArg(options::OPT_static)) {
7638 CmdArgs.push_back("-Bstatic");
7639 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007640 if (Args.hasArg(options::OPT_rdynamic))
7641 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007642 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007643 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007644 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007645 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007646 } else {
7647 CmdArgs.push_back("-dynamic-linker");
7648 CmdArgs.push_back("/usr/libexec/ld.so");
7649 }
7650 }
7651
Rafael Espindola044f7832013-06-05 04:28:55 +00007652 if (Args.hasArg(options::OPT_nopie))
7653 CmdArgs.push_back("-nopie");
7654
Daniel Dunbarb440f562010-08-02 02:38:21 +00007655 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007656 CmdArgs.push_back("-o");
7657 CmdArgs.push_back(Output.getFilename());
7658 } else {
7659 assert(Output.isNothing() && "Invalid output.");
7660 }
7661
Douglas Katzman78b37b02015-11-17 20:28:07 +00007662 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007663 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007664 if (Args.hasArg(options::OPT_pg))
7665 CmdArgs.push_back(
7666 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007667 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007668 CmdArgs.push_back(
7669 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7670 CmdArgs.push_back(
7671 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007672 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007673 CmdArgs.push_back(
7674 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007675 }
7676 }
7677
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007678 std::string Triple = getToolChain().getTripleString();
7679 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007680 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007681 CmdArgs.push_back(
7682 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007683
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007684 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7685 options::OPT_e, options::OPT_s, options::OPT_t,
7686 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007687
Daniel Dunbar54423b22010-09-17 00:24:54 +00007688 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007689
Douglas Katzman78b37b02015-11-17 20:28:07 +00007690 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007691 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007692 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007693 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007694 CmdArgs.push_back("-lm_p");
7695 else
7696 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007697 }
7698
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007699 // FIXME: For some reason GCC passes -lgcc before adding
7700 // the default system libraries. Just mimic this for now.
7701 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007702
Eric Christopher17674ec2012-09-13 06:32:34 +00007703 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007704 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7705 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007706 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007707 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007708 }
7709
Chandler Carruth45661652011-12-17 22:32:42 +00007710 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007711 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007713 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007714 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007715 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007716
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007717 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007718 }
7719
Douglas Katzman78b37b02015-11-17 20:28:07 +00007720 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007721 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007722 CmdArgs.push_back(
7723 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007724 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007725 CmdArgs.push_back(
7726 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007727 }
7728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007729 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007730 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007731}
Ed Schoutene33194b2009-04-02 19:13:12 +00007732
Douglas Katzman95354292015-06-23 20:42:09 +00007733void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7734 const InputInfo &Output,
7735 const InputInfoList &Inputs,
7736 const ArgList &Args,
7737 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007738 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007739 ArgStringList CmdArgs;
7740
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007741 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007742
7743 CmdArgs.push_back("-o");
7744 CmdArgs.push_back(Output.getFilename());
7745
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007746 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007747 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007748
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007749 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007750 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007751}
7752
Douglas Katzman95354292015-06-23 20:42:09 +00007753void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7754 const InputInfo &Output,
7755 const InputInfoList &Inputs,
7756 const ArgList &Args,
7757 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007758 const Driver &D = getToolChain().getDriver();
7759 ArgStringList CmdArgs;
7760
Douglas Katzman78b37b02015-11-17 20:28:07 +00007761 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007762 CmdArgs.push_back("-e");
7763 CmdArgs.push_back("__start");
7764 }
7765
7766 if (Args.hasArg(options::OPT_static)) {
7767 CmdArgs.push_back("-Bstatic");
7768 } else {
7769 if (Args.hasArg(options::OPT_rdynamic))
7770 CmdArgs.push_back("-export-dynamic");
7771 CmdArgs.push_back("--eh-frame-hdr");
7772 CmdArgs.push_back("-Bdynamic");
7773 if (Args.hasArg(options::OPT_shared)) {
7774 CmdArgs.push_back("-shared");
7775 } else {
7776 CmdArgs.push_back("-dynamic-linker");
7777 CmdArgs.push_back("/usr/libexec/ld.so");
7778 }
7779 }
7780
7781 if (Output.isFilename()) {
7782 CmdArgs.push_back("-o");
7783 CmdArgs.push_back(Output.getFilename());
7784 } else {
7785 assert(Output.isNothing() && "Invalid output.");
7786 }
7787
Douglas Katzman78b37b02015-11-17 20:28:07 +00007788 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007789 if (!Args.hasArg(options::OPT_shared)) {
7790 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007791 CmdArgs.push_back(
7792 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007793 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007794 CmdArgs.push_back(
7795 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7796 CmdArgs.push_back(
7797 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007798 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007799 CmdArgs.push_back(
7800 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007801 }
7802 }
7803
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007804 Args.AddAllArgs(CmdArgs,
7805 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007806
7807 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7808
Douglas Katzman78b37b02015-11-17 20:28:07 +00007809 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007810 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007811 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7812 if (Args.hasArg(options::OPT_pg))
7813 CmdArgs.push_back("-lm_p");
7814 else
7815 CmdArgs.push_back("-lm");
7816 }
7817
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007818 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007819 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007820 CmdArgs.push_back("-lpthread_p");
7821 else
7822 CmdArgs.push_back("-lpthread");
7823 }
7824
Eli Friedman9fa28852012-08-08 23:57:20 +00007825 if (!Args.hasArg(options::OPT_shared)) {
7826 if (Args.hasArg(options::OPT_pg))
7827 CmdArgs.push_back("-lc_p");
7828 else
7829 CmdArgs.push_back("-lc");
7830 }
7831
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007832 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007833 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007834 case llvm::Triple::arm:
7835 MyArch = "arm";
7836 break;
7837 case llvm::Triple::x86:
7838 MyArch = "i386";
7839 break;
7840 case llvm::Triple::x86_64:
7841 MyArch = "amd64";
7842 break;
7843 default:
7844 llvm_unreachable("Unsupported architecture");
7845 }
7846 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007847 }
7848
Douglas Katzman78b37b02015-11-17 20:28:07 +00007849 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007850 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007851 CmdArgs.push_back(
7852 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007853 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 CmdArgs.push_back(
7855 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007856 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007858 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007859 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007860}
7861
Douglas Katzman95354292015-06-23 20:42:09 +00007862void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7863 const InputInfo &Output,
7864 const InputInfoList &Inputs,
7865 const ArgList &Args,
7866 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007867 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007868 ArgStringList CmdArgs;
7869
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007870 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7871 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007872 switch (getToolChain().getArch()) {
7873 default:
7874 break;
7875 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007876 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007877 break;
7878 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007879 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007880 break;
7881 case llvm::Triple::mips:
7882 case llvm::Triple::mipsel:
7883 case llvm::Triple::mips64:
7884 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007885 StringRef CPUName;
7886 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007887 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007888
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007889 CmdArgs.push_back("-march");
7890 CmdArgs.push_back(CPUName.data());
7891
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007892 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007893 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007894
7895 if (getToolChain().getArch() == llvm::Triple::mips ||
7896 getToolChain().getArch() == llvm::Triple::mips64)
7897 CmdArgs.push_back("-EB");
7898 else
7899 CmdArgs.push_back("-EL");
7900
Dimitry Andric46f338c2015-12-27 10:36:44 +00007901 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7902 StringRef v = A->getValue();
7903 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7904 A->claim();
7905 }
7906
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007907 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007908 break;
7909 }
7910 case llvm::Triple::arm:
7911 case llvm::Triple::armeb:
7912 case llvm::Triple::thumb:
7913 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007914 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007915
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007916 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007917 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007918 else
Renato Golinf4421f72014-02-19 10:44:07 +00007919 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007921 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007922 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007923 case llvm::Triple::GNUEABI:
7924 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007925 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007926 break;
7927
7928 default:
7929 CmdArgs.push_back("-matpcs");
7930 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007931 break;
7932 }
7933 case llvm::Triple::sparc:
7934 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007935 case llvm::Triple::sparcv9: {
7936 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7937 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007938 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007939 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007940 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007941 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007943 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007944
7945 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007946 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007947
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007948 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007949 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007950
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007951 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007952 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007953}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007954
Douglas Katzman95354292015-06-23 20:42:09 +00007955void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7956 const InputInfo &Output,
7957 const InputInfoList &Inputs,
7958 const ArgList &Args,
7959 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007960 const toolchains::FreeBSD &ToolChain =
7961 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007962 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007963 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007964 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007965 !Args.hasArg(options::OPT_shared) &&
7966 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007967 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007968
7969 // Silence warning for "clang -g foo.o -o foo"
7970 Args.ClaimAllArgs(options::OPT_g_Group);
7971 // and "clang -emit-llvm foo.o -o foo"
7972 Args.ClaimAllArgs(options::OPT_emit_llvm);
7973 // and for "clang -w foo.o -o foo". Other warning options are already
7974 // handled somewhere else.
7975 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007976
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007977 if (!D.SysRoot.empty())
7978 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7979
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007980 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007981 CmdArgs.push_back("-pie");
7982
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007983 if (Args.hasArg(options::OPT_static)) {
7984 CmdArgs.push_back("-Bstatic");
7985 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007986 if (Args.hasArg(options::OPT_rdynamic))
7987 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007988 CmdArgs.push_back("--eh-frame-hdr");
7989 if (Args.hasArg(options::OPT_shared)) {
7990 CmdArgs.push_back("-Bshareable");
7991 } else {
7992 CmdArgs.push_back("-dynamic-linker");
7993 CmdArgs.push_back("/libexec/ld-elf.so.1");
7994 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007995 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007996 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7997 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7998 CmdArgs.push_back("--hash-style=both");
7999 }
8000 }
8001 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008002 }
8003
8004 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8005 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008006 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008007 CmdArgs.push_back("-m");
8008 CmdArgs.push_back("elf_i386_fbsd");
8009 }
8010
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008011 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008012 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008013 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008014 }
8015
Dimitry Andric904895f2015-12-27 06:47:09 +00008016 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8017 if (ToolChain.getArch() == llvm::Triple::mips ||
8018 ToolChain.getArch() == llvm::Triple::mipsel ||
8019 ToolChain.getArch() == llvm::Triple::mips64 ||
8020 ToolChain.getArch() == llvm::Triple::mips64el) {
8021 StringRef v = A->getValue();
8022 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8023 A->claim();
8024 }
8025 }
8026
Daniel Dunbarb440f562010-08-02 02:38:21 +00008027 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008028 CmdArgs.push_back("-o");
8029 CmdArgs.push_back(Output.getFilename());
8030 } else {
8031 assert(Output.isNothing() && "Invalid output.");
8032 }
8033
Douglas Katzman78b37b02015-11-17 20:28:07 +00008034 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008035 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008036 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008037 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008038 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008039 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008040 crt1 = "Scrt1.o";
8041 else
8042 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008043 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008044 if (crt1)
8045 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8046
8047 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8048
Craig Topper92fc2df2014-05-17 16:56:41 +00008049 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008050 if (Args.hasArg(options::OPT_static))
8051 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008052 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008053 crtbegin = "crtbeginS.o";
8054 else
8055 crtbegin = "crtbegin.o";
8056
8057 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008058 }
8059
8060 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008061 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008062 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8063 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008064 Args.AddAllArgs(CmdArgs, options::OPT_s);
8065 Args.AddAllArgs(CmdArgs, options::OPT_t);
8066 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8067 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008068
Teresa Johnson945bc502015-10-15 20:35:53 +00008069 if (D.isUsingLTO())
8070 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008071
Alexey Samsonov52550342014-09-15 19:58:40 +00008072 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008073 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008074
Douglas Katzman78b37b02015-11-17 20:28:07 +00008075 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008076 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008077 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008078 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008079 if (Args.hasArg(options::OPT_pg))
8080 CmdArgs.push_back("-lm_p");
8081 else
8082 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008083 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008084 if (NeedsSanitizerDeps)
8085 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008086 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8087 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008088 if (Args.hasArg(options::OPT_pg))
8089 CmdArgs.push_back("-lgcc_p");
8090 else
8091 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008092 if (Args.hasArg(options::OPT_static)) {
8093 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008094 } else if (Args.hasArg(options::OPT_pg)) {
8095 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008096 } else {
8097 CmdArgs.push_back("--as-needed");
8098 CmdArgs.push_back("-lgcc_s");
8099 CmdArgs.push_back("--no-as-needed");
8100 }
8101
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008102 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008103 if (Args.hasArg(options::OPT_pg))
8104 CmdArgs.push_back("-lpthread_p");
8105 else
8106 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008107 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008108
Roman Divacky66f22762011-02-10 16:59:40 +00008109 if (Args.hasArg(options::OPT_pg)) {
8110 if (Args.hasArg(options::OPT_shared))
8111 CmdArgs.push_back("-lc");
8112 else
8113 CmdArgs.push_back("-lc_p");
8114 CmdArgs.push_back("-lgcc_p");
8115 } else {
8116 CmdArgs.push_back("-lc");
8117 CmdArgs.push_back("-lgcc");
8118 }
8119
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008120 if (Args.hasArg(options::OPT_static)) {
8121 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008122 } else if (Args.hasArg(options::OPT_pg)) {
8123 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008124 } else {
8125 CmdArgs.push_back("--as-needed");
8126 CmdArgs.push_back("-lgcc_s");
8127 CmdArgs.push_back("--no-as-needed");
8128 }
8129 }
8130
Douglas Katzman78b37b02015-11-17 20:28:07 +00008131 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008132 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008133 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008134 else
8135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008137 }
8138
Xinliang David Li69306c02015-10-22 06:15:31 +00008139 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008141 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008142 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008143}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008144
Douglas Katzman95354292015-06-23 20:42:09 +00008145void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008146 const InputInfo &Output,
8147 const InputInfoList &Inputs,
8148 const ArgList &Args,
8149 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008150 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008151 ArgStringList CmdArgs;
8152
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008153 // GNU as needs different flags for creating the correct output format
8154 // on architectures with different ABIs or optional feature sets.
8155 switch (getToolChain().getArch()) {
8156 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008157 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008158 break;
8159 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008160 case llvm::Triple::armeb:
8161 case llvm::Triple::thumb:
8162 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008163 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008164 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8165 std::string Arch =
8166 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008167 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008168 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008169 }
8170
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008171 case llvm::Triple::mips:
8172 case llvm::Triple::mipsel:
8173 case llvm::Triple::mips64:
8174 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008175 StringRef CPUName;
8176 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008177 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008178
8179 CmdArgs.push_back("-march");
8180 CmdArgs.push_back(CPUName.data());
8181
8182 CmdArgs.push_back("-mabi");
8183 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8184
8185 if (getToolChain().getArch() == llvm::Triple::mips ||
8186 getToolChain().getArch() == llvm::Triple::mips64)
8187 CmdArgs.push_back("-EB");
8188 else
8189 CmdArgs.push_back("-EL");
8190
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008191 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008192 break;
8193 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008194
8195 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008196 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008197 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008198 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8199 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008200 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008201 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008202 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008203
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008204 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008205 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008206 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8207 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008208 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008209 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008210 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008211
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008212 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008213 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008214 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008215
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008216 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008217
8218 CmdArgs.push_back("-o");
8219 CmdArgs.push_back(Output.getFilename());
8220
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008221 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008222 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008223
David Chisnallddbd68f2011-09-27 22:03:18 +00008224 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008225 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008226}
8227
Douglas Katzman95354292015-06-23 20:42:09 +00008228void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8229 const InputInfo &Output,
8230 const InputInfoList &Inputs,
8231 const ArgList &Args,
8232 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008233 const Driver &D = getToolChain().getDriver();
8234 ArgStringList CmdArgs;
8235
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008236 if (!D.SysRoot.empty())
8237 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8238
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008239 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008240 if (Args.hasArg(options::OPT_static)) {
8241 CmdArgs.push_back("-Bstatic");
8242 } else {
8243 if (Args.hasArg(options::OPT_rdynamic))
8244 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008245 if (Args.hasArg(options::OPT_shared)) {
8246 CmdArgs.push_back("-Bshareable");
8247 } else {
8248 CmdArgs.push_back("-dynamic-linker");
8249 CmdArgs.push_back("/libexec/ld.elf_so");
8250 }
8251 }
8252
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008253 // Many NetBSD architectures support more than one ABI.
8254 // Determine the correct emulation for ld.
8255 switch (getToolChain().getArch()) {
8256 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008257 CmdArgs.push_back("-m");
8258 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008259 break;
8260 case llvm::Triple::arm:
8261 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008262 CmdArgs.push_back("-m");
8263 switch (getToolChain().getTriple().getEnvironment()) {
8264 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008265 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008266 CmdArgs.push_back("armelf_nbsd_eabi");
8267 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008268 case llvm::Triple::EABIHF:
8269 case llvm::Triple::GNUEABIHF:
8270 CmdArgs.push_back("armelf_nbsd_eabihf");
8271 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008272 default:
8273 CmdArgs.push_back("armelf_nbsd");
8274 break;
8275 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008276 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008277 case llvm::Triple::armeb:
8278 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008279 arm::appendEBLinkFlags(
8280 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008281 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008282 CmdArgs.push_back("-m");
8283 switch (getToolChain().getTriple().getEnvironment()) {
8284 case llvm::Triple::EABI:
8285 case llvm::Triple::GNUEABI:
8286 CmdArgs.push_back("armelfb_nbsd_eabi");
8287 break;
8288 case llvm::Triple::EABIHF:
8289 case llvm::Triple::GNUEABIHF:
8290 CmdArgs.push_back("armelfb_nbsd_eabihf");
8291 break;
8292 default:
8293 CmdArgs.push_back("armelfb_nbsd");
8294 break;
8295 }
8296 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008297 case llvm::Triple::mips64:
8298 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008299 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008300 CmdArgs.push_back("-m");
8301 if (getToolChain().getArch() == llvm::Triple::mips64)
8302 CmdArgs.push_back("elf32btsmip");
8303 else
8304 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008305 } else if (mips::hasMipsAbiArg(Args, "64")) {
8306 CmdArgs.push_back("-m");
8307 if (getToolChain().getArch() == llvm::Triple::mips64)
8308 CmdArgs.push_back("elf64btsmip");
8309 else
8310 CmdArgs.push_back("elf64ltsmip");
8311 }
8312 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008313 case llvm::Triple::ppc:
8314 CmdArgs.push_back("-m");
8315 CmdArgs.push_back("elf32ppc_nbsd");
8316 break;
8317
8318 case llvm::Triple::ppc64:
8319 case llvm::Triple::ppc64le:
8320 CmdArgs.push_back("-m");
8321 CmdArgs.push_back("elf64ppc");
8322 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008323
8324 case llvm::Triple::sparc:
8325 CmdArgs.push_back("-m");
8326 CmdArgs.push_back("elf32_sparc");
8327 break;
8328
8329 case llvm::Triple::sparcv9:
8330 CmdArgs.push_back("-m");
8331 CmdArgs.push_back("elf64_sparc");
8332 break;
8333
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008334 default:
8335 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008336 }
8337
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008338 if (Output.isFilename()) {
8339 CmdArgs.push_back("-o");
8340 CmdArgs.push_back(Output.getFilename());
8341 } else {
8342 assert(Output.isNothing() && "Invalid output.");
8343 }
8344
Douglas Katzman78b37b02015-11-17 20:28:07 +00008345 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008346 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008347 CmdArgs.push_back(
8348 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8349 CmdArgs.push_back(
8350 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8351 CmdArgs.push_back(
8352 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008353 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008354 CmdArgs.push_back(
8355 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8356 CmdArgs.push_back(
8357 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008358 }
8359 }
8360
8361 Args.AddAllArgs(CmdArgs, options::OPT_L);
8362 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8363 Args.AddAllArgs(CmdArgs, options::OPT_e);
8364 Args.AddAllArgs(CmdArgs, options::OPT_s);
8365 Args.AddAllArgs(CmdArgs, options::OPT_t);
8366 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8367 Args.AddAllArgs(CmdArgs, options::OPT_r);
8368
8369 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8370
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008371 unsigned Major, Minor, Micro;
8372 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8373 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008374 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008375 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008376 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008377 case llvm::Triple::arm:
8378 case llvm::Triple::armeb:
8379 case llvm::Triple::thumb:
8380 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008381 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008382 case llvm::Triple::ppc64:
8383 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008384 case llvm::Triple::x86:
8385 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008386 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008387 break;
8388 default:
8389 break;
8390 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008391 }
8392
Douglas Katzman78b37b02015-11-17 20:28:07 +00008393 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008394 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008395 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008396 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8397 CmdArgs.push_back("-lm");
8398 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399 if (Args.hasArg(options::OPT_pthread))
8400 CmdArgs.push_back("-lpthread");
8401 CmdArgs.push_back("-lc");
8402
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008403 if (useLibgcc) {
8404 if (Args.hasArg(options::OPT_static)) {
8405 // libgcc_eh depends on libc, so resolve as much as possible,
8406 // pull in any new requirements from libc and then get the rest
8407 // of libgcc.
8408 CmdArgs.push_back("-lgcc_eh");
8409 CmdArgs.push_back("-lc");
8410 CmdArgs.push_back("-lgcc");
8411 } else {
8412 CmdArgs.push_back("-lgcc");
8413 CmdArgs.push_back("--as-needed");
8414 CmdArgs.push_back("-lgcc_s");
8415 CmdArgs.push_back("--no-as-needed");
8416 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008417 }
8418 }
8419
Douglas Katzman78b37b02015-11-17 20:28:07 +00008420 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008422 CmdArgs.push_back(
8423 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008424 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008425 CmdArgs.push_back(
8426 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8427 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008428 }
8429
Xinliang David Li69306c02015-10-22 06:15:31 +00008430 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008431
Logan Chieneb9162f2014-06-26 14:23:45 +00008432 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008433 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008434}
8435
Douglas Katzman95354292015-06-23 20:42:09 +00008436void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8437 const InputInfo &Output,
8438 const InputInfoList &Inputs,
8439 const ArgList &Args,
8440 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008441 claimNoWarnArgs(Args);
8442
James Y Knight2db38f32015-08-15 03:45:25 +00008443 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8444 llvm::Triple Triple = llvm::Triple(TripleStr);
8445
Rafael Espindola92b00932010-08-10 00:25:48 +00008446 ArgStringList CmdArgs;
8447
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008448 llvm::Reloc::Model RelocationModel;
8449 unsigned PICLevel;
8450 bool IsPIE;
8451 std::tie(RelocationModel, PICLevel, IsPIE) =
8452 ParsePICArgs(getToolChain(), Triple, Args);
8453
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008454 switch (getToolChain().getArch()) {
8455 default:
8456 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008457 // Add --32/--64 to make sure we get the format we want.
8458 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008459 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008460 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008461 break;
8462 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008463 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8464 CmdArgs.push_back("--x32");
8465 else
8466 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008467 break;
8468 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008469 CmdArgs.push_back("-a32");
8470 CmdArgs.push_back("-mppc");
8471 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008472 break;
8473 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008474 CmdArgs.push_back("-a64");
8475 CmdArgs.push_back("-mppc64");
8476 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008477 break;
8478 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008479 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008480 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008481 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008482 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008483 break;
8484 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008485 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008486 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008487 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8488 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8489 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008490 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008491 }
8492 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008493 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008494 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8495 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8496 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008497 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008498 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008499 case llvm::Triple::arm:
8500 case llvm::Triple::armeb:
8501 case llvm::Triple::thumb:
8502 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008503 const llvm::Triple &Triple2 = getToolChain().getTriple();
8504 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008505 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008506 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008507 break;
8508 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008509 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008510 break;
8511 default:
8512 break;
8513 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008514
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008515 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008516 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8517 case arm::FloatABI::Soft:
8518 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8519 break;
8520 case arm::FloatABI::SoftFP:
8521 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8522 break;
8523 case arm::FloatABI::Hard:
8524 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8525 break;
8526 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008527
8528 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008529
8530 // FIXME: remove krait check when GNU tools support krait cpu
8531 // for now replace it with -march=armv7-a to avoid a lower
8532 // march from being picked in the absence of a cpu flag.
8533 Arg *A;
8534 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008535 StringRef(A->getValue()).lower() == "krait")
8536 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008537 else
8538 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008539 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008540 break;
8541 }
8542 case llvm::Triple::mips:
8543 case llvm::Triple::mipsel:
8544 case llvm::Triple::mips64:
8545 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008546 StringRef CPUName;
8547 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008548 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008549 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008550
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008551 CmdArgs.push_back("-march");
8552 CmdArgs.push_back(CPUName.data());
8553
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008554 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008555 CmdArgs.push_back(ABIName.data());
8556
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008557 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8558 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008559 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008560 CmdArgs.push_back("-mno-shared");
8561
Daniel Sanders379d44b2014-07-16 11:52:23 +00008562 // LLVM doesn't support -mplt yet and acts as if it is always given.
8563 // However, -mplt has no effect with the N64 ABI.
8564 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008565
8566 if (getToolChain().getArch() == llvm::Triple::mips ||
8567 getToolChain().getArch() == llvm::Triple::mips64)
8568 CmdArgs.push_back("-EB");
8569 else
8570 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008571
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008572 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8573 if (StringRef(A->getValue()) == "2008")
8574 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8575 }
8576
Daniel Sanders379d44b2014-07-16 11:52:23 +00008577 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8578 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8579 options::OPT_mfp64)) {
8580 A->claim();
8581 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008582 } else if (mips::shouldUseFPXX(
8583 Args, getToolChain().getTriple(), CPUName, ABIName,
8584 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008585 CmdArgs.push_back("-mfpxx");
8586
8587 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8588 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008589 if (Arg *A =
8590 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008591 if (A->getOption().matches(options::OPT_mips16)) {
8592 A->claim();
8593 A->render(Args, CmdArgs);
8594 } else {
8595 A->claim();
8596 CmdArgs.push_back("-no-mips16");
8597 }
8598 }
8599
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008600 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8601 options::OPT_mno_micromips);
8602 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8603 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8604
Simon Atanasyanbd986632013-11-26 11:58:04 +00008605 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8606 // Do not use AddLastArg because not all versions of MIPS assembler
8607 // support -mmsa / -mno-msa options.
8608 if (A->getOption().matches(options::OPT_mmsa))
8609 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8610 }
8611
Daniel Sanders379d44b2014-07-16 11:52:23 +00008612 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8613 options::OPT_msoft_float);
8614
Toma Tabacub36d6102015-06-11 12:13:18 +00008615 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8616 options::OPT_msingle_float);
8617
Daniel Sanders379d44b2014-07-16 11:52:23 +00008618 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8619 options::OPT_mno_odd_spreg);
8620
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008621 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008622 break;
8623 }
8624 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008625 // Always pass an -march option, since our default of z10 is later
8626 // than the GNU assembler's default.
8627 StringRef CPUName = getSystemZTargetCPU(Args);
8628 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008629 break;
8630 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008631 }
8632
Renato Golina74bbc72015-07-22 15:32:36 +00008633 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008634 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008635
8636 CmdArgs.push_back("-o");
8637 CmdArgs.push_back(Output.getFilename());
8638
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008639 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008640 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008641
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008642 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008643 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008644
8645 // Handle the debug info splitting at object creation time if we're
8646 // creating an object.
8647 // TODO: Currently only works on linux with newer objcopy.
8648 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008649 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008650 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008651 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008652}
8653
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008654static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008655 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008656 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008657 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008658 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8659 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008660 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008661 CmdArgs.push_back("-lgcc");
8662
Logan Chien3d3373c2012-11-19 12:04:11 +00008663 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008664 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008665 CmdArgs.push_back("-lgcc");
8666 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008667 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008668 CmdArgs.push_back("--as-needed");
8669 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008670 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008671 CmdArgs.push_back("--no-as-needed");
8672 }
8673
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008674 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008675 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008676 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008677 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008678
8679 // According to Android ABI, we have to link with libdl if we are
8680 // linking with non-static libgcc.
8681 //
8682 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8683 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8684 if (isAndroid && !StaticLibgcc)
8685 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008686}
8687
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008688static std::string getLinuxDynamicLinker(const ArgList &Args,
8689 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008690 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8691
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008692 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008693 if (ToolChain.getTriple().isArch64Bit())
8694 return "/system/bin/linker64";
8695 else
8696 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008697 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8698 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008699 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008700 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008701 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008702 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008703 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008704 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008705 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008706 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008707 return "/lib/ld-linux-armhf.so.3";
8708 else
8709 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008710 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8711 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008712 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008713 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008714 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008715 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008716 return "/lib/ld-linux.so.3";
8717 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8718 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008719 std::string LibDir =
8720 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008721 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008722 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008723 if (mips::isUCLibc(Args))
8724 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008725 else if (!ToolChain.getTriple().hasEnvironment()) {
8726 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8727 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8728 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8729 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008730 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008731
8732 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008733 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008734 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008735 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008736 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8737 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008738 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008739 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008740 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8741 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008742 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008743 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008744 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008745 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008746 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008747 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008748 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8749 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008750 else
8751 return "/lib64/ld-linux-x86-64.so.2";
8752}
8753
Renato Golinc4b49242014-02-13 10:01:16 +00008754static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008755 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008756 // Make use of compiler-rt if --rtlib option is used
8757 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8758
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008759 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008760 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008761 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008762 default:
8763 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008764 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008765 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008766 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008767 break;
8768 }
Renato Golinc4b49242014-02-13 10:01:16 +00008769 break;
8770 case ToolChain::RLT_Libgcc:
8771 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8772 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008773 }
8774}
8775
Rafael Espindola1e085772014-08-15 17:14:35 +00008776static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8777 switch (T.getArch()) {
8778 case llvm::Triple::x86:
8779 return "elf_i386";
8780 case llvm::Triple::aarch64:
8781 return "aarch64linux";
8782 case llvm::Triple::aarch64_be:
8783 return "aarch64_be_linux";
8784 case llvm::Triple::arm:
8785 case llvm::Triple::thumb:
8786 return "armelf_linux_eabi";
8787 case llvm::Triple::armeb:
8788 case llvm::Triple::thumbeb:
8789 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8790 case llvm::Triple::ppc:
8791 return "elf32ppclinux";
8792 case llvm::Triple::ppc64:
8793 return "elf64ppc";
8794 case llvm::Triple::ppc64le:
8795 return "elf64lppc";
8796 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008797 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008798 return "elf32_sparc";
8799 case llvm::Triple::sparcv9:
8800 return "elf64_sparc";
8801 case llvm::Triple::mips:
8802 return "elf32btsmip";
8803 case llvm::Triple::mipsel:
8804 return "elf32ltsmip";
8805 case llvm::Triple::mips64:
8806 if (mips::hasMipsAbiArg(Args, "n32"))
8807 return "elf32btsmipn32";
8808 return "elf64btsmip";
8809 case llvm::Triple::mips64el:
8810 if (mips::hasMipsAbiArg(Args, "n32"))
8811 return "elf32ltsmipn32";
8812 return "elf64ltsmip";
8813 case llvm::Triple::systemz:
8814 return "elf64_s390";
8815 case llvm::Triple::x86_64:
8816 if (T.getEnvironment() == llvm::Triple::GNUX32)
8817 return "elf32_x86_64";
8818 return "elf_x86_64";
8819 default:
8820 llvm_unreachable("Unexpected arch");
8821 }
8822}
8823
Douglas Katzman95354292015-06-23 20:42:09 +00008824void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8825 const InputInfo &Output,
8826 const InputInfoList &Inputs,
8827 const ArgList &Args,
8828 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008829 const toolchains::Linux &ToolChain =
8830 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008831 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008832
8833 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8834 llvm::Triple Triple = llvm::Triple(TripleStr);
8835
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008836 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008837 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008838 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008839 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8840 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008841 const bool HasCRTBeginEndFiles =
8842 ToolChain.getTriple().hasEnvironment() ||
8843 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008844
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008845 ArgStringList CmdArgs;
8846
Rafael Espindolad1002f62010-11-15 18:28:16 +00008847 // Silence warning for "clang -g foo.o -o foo"
8848 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008849 // and "clang -emit-llvm foo.o -o foo"
8850 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008851 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008852 // handled somewhere else.
8853 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008854
Peter Collingbourne39719a72015-11-20 20:49:39 +00008855 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8856 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008857 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008858 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008859 CmdArgs.push_back("-target");
8860 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8861 }
8862
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008863 if (!D.SysRoot.empty())
8864 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008865
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008866 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008867 CmdArgs.push_back("-pie");
8868
Rafael Espindola1c76c592010-11-07 22:57:16 +00008869 if (Args.hasArg(options::OPT_rdynamic))
8870 CmdArgs.push_back("-export-dynamic");
8871
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008872 if (Args.hasArg(options::OPT_s))
8873 CmdArgs.push_back("-s");
8874
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008875 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008876 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008877
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008878 for (const auto &Opt : ToolChain.ExtraOpts)
8879 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008880
8881 if (!Args.hasArg(options::OPT_static)) {
8882 CmdArgs.push_back("--eh-frame-hdr");
8883 }
8884
8885 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008886 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008887
8888 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008889 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8890 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008891 CmdArgs.push_back("-Bstatic");
8892 else
8893 CmdArgs.push_back("-static");
8894 } else if (Args.hasArg(options::OPT_shared)) {
8895 CmdArgs.push_back("-shared");
8896 }
8897
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008898 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8899 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008900 (!Args.hasArg(options::OPT_static) &&
8901 !Args.hasArg(options::OPT_shared))) {
8902 CmdArgs.push_back("-dynamic-linker");
8903 CmdArgs.push_back(Args.MakeArgString(
8904 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8905 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008906
8907 CmdArgs.push_back("-o");
8908 CmdArgs.push_back(Output.getFilename());
8909
Douglas Katzman78b37b02015-11-17 20:28:07 +00008910 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008911 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008912 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008913 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008914 if (Args.hasArg(options::OPT_pg))
8915 crt1 = "gcrt1.o";
8916 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008917 crt1 = "Scrt1.o";
8918 else
8919 crt1 = "crt1.o";
8920 }
8921 if (crt1)
8922 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008923
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8925 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008926
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008927 const char *crtbegin;
8928 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008929 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008930 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008931 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008932 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008933 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008934 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008935 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008936
8937 if (HasCRTBeginEndFiles)
8938 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008939
8940 // Add crtfastmath.o if available and fast math is enabled.
8941 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008942 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008943
8944 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008945 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008946
Douglas Katzman6059ef92015-11-17 17:41:23 +00008947 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008948
Teresa Johnson945bc502015-10-15 20:35:53 +00008949 if (D.isUsingLTO())
8950 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008951
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008952 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8953 CmdArgs.push_back("--no-demangle");
8954
Alexey Samsonov52550342014-09-15 19:58:40 +00008955 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008956 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008957 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008958 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008959
Douglas Katzman78b37b02015-11-17 20:28:07 +00008960 if (D.CCCIsCXX() &&
8961 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008962 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008963 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008964 if (OnlyLibstdcxxStatic)
8965 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008966 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008967 if (OnlyLibstdcxxStatic)
8968 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008969 CmdArgs.push_back("-lm");
8970 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008971 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8972 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008973
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008974 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008975 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8976 if (Args.hasArg(options::OPT_static))
8977 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008978
Alexey Samsonov52550342014-09-15 19:58:40 +00008979 if (NeedsSanitizerDeps)
8980 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8981
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008982 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8983 Args.hasArg(options::OPT_pthreads);
8984
8985 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8986 options::OPT_fno_openmp, false)) {
8987 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8988 // FIXME: Does this really make sense for all GNU toolchains?
8989 WantPthread = true;
8990
8991 // Also link the particular OpenMP runtimes.
8992 switch (getOpenMPRuntime(ToolChain, Args)) {
8993 case OMPRT_OMP:
8994 CmdArgs.push_back("-lomp");
8995 break;
8996 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008997 CmdArgs.push_back("-lgomp");
8998
8999 // FIXME: Exclude this for platforms with libgomp that don't require
9000 // librt. Most modern Linux platforms require it, but some may not.
9001 CmdArgs.push_back("-lrt");
9002 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009003 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009004 CmdArgs.push_back("-liomp5");
9005 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009006 case OMPRT_Unknown:
9007 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009008 break;
9009 }
Chandler Carruth01538002013-01-17 13:19:29 +00009010 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009011
Renato Golinc4b49242014-02-13 10:01:16 +00009012 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009013
Richard Smith31d1de22015-05-20 22:48:44 +00009014 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009015 CmdArgs.push_back("-lpthread");
9016
Rafael Espindolab17bc532016-01-25 18:29:16 +00009017 if (Args.hasArg(options::OPT_fsplit_stack))
9018 CmdArgs.push_back("--wrap=pthread_create");
9019
Chandler Carruth94a32012012-05-14 18:31:18 +00009020 CmdArgs.push_back("-lc");
9021
9022 if (Args.hasArg(options::OPT_static))
9023 CmdArgs.push_back("--end-group");
9024 else
Renato Golinc4b49242014-02-13 10:01:16 +00009025 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009026 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009027
Rafael Espindola81937ec2010-12-01 01:52:43 +00009028 if (!Args.hasArg(options::OPT_nostartfiles)) {
9029 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009030 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009031 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009032 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009033 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009034 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009035 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009036
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009037 if (HasCRTBeginEndFiles)
9038 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009039 if (!isAndroid)
9040 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009041 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009042 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009043
Peter Collingbourne39719a72015-11-20 20:49:39 +00009044 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009045}
9046
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009047// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9048// for the various SFI requirements like register masking. The assembly tool
9049// inserts the file containing the macros as an input into all the assembly
9050// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009051void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9052 const InputInfo &Output,
9053 const InputInfoList &Inputs,
9054 const ArgList &Args,
9055 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009056 const toolchains::NaClToolChain &ToolChain =
9057 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009058 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009059 "nacl-arm-macros.s");
9060 InputInfoList NewInputs;
9061 NewInputs.push_back(NaClMacros);
9062 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009063 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9064 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009065}
9066
Douglas Katzman750cfc52015-06-29 18:42:16 +00009067// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009068// we use static by default, do not yet support sanitizers or LTO, and a few
9069// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009070// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009071void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9072 const InputInfo &Output,
9073 const InputInfoList &Inputs,
9074 const ArgList &Args,
9075 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009076
Douglas Katzman54366072015-07-27 16:53:08 +00009077 const toolchains::NaClToolChain &ToolChain =
9078 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009079 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009080 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009081 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009082 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009083
9084 ArgStringList CmdArgs;
9085
9086 // Silence warning for "clang -g foo.o -o foo"
9087 Args.ClaimAllArgs(options::OPT_g_Group);
9088 // and "clang -emit-llvm foo.o -o foo"
9089 Args.ClaimAllArgs(options::OPT_emit_llvm);
9090 // and for "clang -w foo.o -o foo". Other warning options are already
9091 // handled somewhere else.
9092 Args.ClaimAllArgs(options::OPT_w);
9093
9094 if (!D.SysRoot.empty())
9095 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9096
9097 if (Args.hasArg(options::OPT_rdynamic))
9098 CmdArgs.push_back("-export-dynamic");
9099
9100 if (Args.hasArg(options::OPT_s))
9101 CmdArgs.push_back("-s");
9102
Douglas Katzman54366072015-07-27 16:53:08 +00009103 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9104 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009105 CmdArgs.push_back("--build-id");
9106
9107 if (!IsStatic)
9108 CmdArgs.push_back("--eh-frame-hdr");
9109
9110 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009111 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009112 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009113 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009114 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009115 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009116 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009117 else if (Arch == llvm::Triple::mipsel)
9118 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009119 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009120 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9121 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009122
9123 if (IsStatic)
9124 CmdArgs.push_back("-static");
9125 else if (Args.hasArg(options::OPT_shared))
9126 CmdArgs.push_back("-shared");
9127
9128 CmdArgs.push_back("-o");
9129 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009131 if (!Args.hasArg(options::OPT_shared))
9132 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9133 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9134
9135 const char *crtbegin;
9136 if (IsStatic)
9137 crtbegin = "crtbeginT.o";
9138 else if (Args.hasArg(options::OPT_shared))
9139 crtbegin = "crtbeginS.o";
9140 else
9141 crtbegin = "crtbegin.o";
9142 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9143 }
9144
9145 Args.AddAllArgs(CmdArgs, options::OPT_L);
9146 Args.AddAllArgs(CmdArgs, options::OPT_u);
9147
Douglas Katzman6059ef92015-11-17 17:41:23 +00009148 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009149
9150 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9151 CmdArgs.push_back("--no-demangle");
9152
9153 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9154
Douglas Katzman78b37b02015-11-17 20:28:07 +00009155 if (D.CCCIsCXX() &&
9156 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009157 bool OnlyLibstdcxxStatic =
9158 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009159 if (OnlyLibstdcxxStatic)
9160 CmdArgs.push_back("-Bstatic");
9161 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9162 if (OnlyLibstdcxxStatic)
9163 CmdArgs.push_back("-Bdynamic");
9164 CmdArgs.push_back("-lm");
9165 }
9166
9167 if (!Args.hasArg(options::OPT_nostdlib)) {
9168 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9169 // Always use groups, since it has no effect on dynamic libraries.
9170 CmdArgs.push_back("--start-group");
9171 CmdArgs.push_back("-lc");
9172 // NaCl's libc++ currently requires libpthread, so just always include it
9173 // in the group for C++.
9174 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009175 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009176 // Gold, used by Mips, handles nested groups differently than ld, and
9177 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9178 // which is not a desired behaviour here.
9179 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9180 if (getToolChain().getArch() == llvm::Triple::mipsel)
9181 CmdArgs.push_back("-lnacl");
9182
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009183 CmdArgs.push_back("-lpthread");
9184 }
9185
9186 CmdArgs.push_back("-lgcc");
9187 CmdArgs.push_back("--as-needed");
9188 if (IsStatic)
9189 CmdArgs.push_back("-lgcc_eh");
9190 else
9191 CmdArgs.push_back("-lgcc_s");
9192 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009193
9194 // Mips needs to create and use pnacl_legacy library that contains
9195 // definitions from bitcode/pnaclmm.c and definitions for
9196 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9197 if (getToolChain().getArch() == llvm::Triple::mipsel)
9198 CmdArgs.push_back("-lpnacl_legacy");
9199
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009200 CmdArgs.push_back("--end-group");
9201 }
9202
9203 if (!Args.hasArg(options::OPT_nostartfiles)) {
9204 const char *crtend;
9205 if (Args.hasArg(options::OPT_shared))
9206 crtend = "crtendS.o";
9207 else
9208 crtend = "crtend.o";
9209
9210 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9211 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9212 }
9213 }
9214
Peter Collingbourne39719a72015-11-20 20:49:39 +00009215 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009217}
9218
Douglas Katzman95354292015-06-23 20:42:09 +00009219void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9220 const InputInfo &Output,
9221 const InputInfoList &Inputs,
9222 const ArgList &Args,
9223 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009224 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009225 ArgStringList CmdArgs;
9226
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009227 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009228
9229 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009230 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009231
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009232 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009233 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009235 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009236 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009237}
9238
Douglas Katzman95354292015-06-23 20:42:09 +00009239void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9240 const InputInfo &Output,
9241 const InputInfoList &Inputs,
9242 const ArgList &Args,
9243 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009244 const Driver &D = getToolChain().getDriver();
9245 ArgStringList CmdArgs;
9246
Daniel Dunbarb440f562010-08-02 02:38:21 +00009247 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009248 CmdArgs.push_back("-o");
9249 CmdArgs.push_back(Output.getFilename());
9250 } else {
9251 assert(Output.isNothing() && "Invalid output.");
9252 }
9253
Douglas Katzman78b37b02015-11-17 20:28:07 +00009254 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009255 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9256 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9257 CmdArgs.push_back(
9258 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9259 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009260 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009261
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009262 Args.AddAllArgs(CmdArgs,
9263 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009264
Daniel Dunbar54423b22010-09-17 00:24:54 +00009265 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009266
Xinliang David Li69306c02015-10-22 06:15:31 +00009267 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009268
Douglas Katzman78b37b02015-11-17 20:28:07 +00009269 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009270 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009271 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009272 CmdArgs.push_back("-lm");
9273 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009274 }
9275
Douglas Katzman78b37b02015-11-17 20:28:07 +00009276 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009277 if (Args.hasArg(options::OPT_pthread))
9278 CmdArgs.push_back("-lpthread");
9279 CmdArgs.push_back("-lc");
9280 CmdArgs.push_back("-lCompilerRT-Generic");
9281 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9282 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009283 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009284 }
9285
Logan Chieneb9162f2014-06-26 14:23:45 +00009286 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009287 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009288}
9289
Daniel Dunbarcc912342009-05-02 18:28:39 +00009290/// DragonFly Tools
9291
9292// For now, DragonFly Assemble does just about the same as for
9293// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009294void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9295 const InputInfo &Output,
9296 const InputInfoList &Inputs,
9297 const ArgList &Args,
9298 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009299 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009300 ArgStringList CmdArgs;
9301
9302 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9303 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009304 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009305 CmdArgs.push_back("--32");
9306
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009307 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009308
9309 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009310 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009312 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009313 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009314
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009315 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009316 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009317}
9318
Douglas Katzman95354292015-06-23 20:42:09 +00009319void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9320 const InputInfo &Output,
9321 const InputInfoList &Inputs,
9322 const ArgList &Args,
9323 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009324 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009325 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009326
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009327 if (!D.SysRoot.empty())
9328 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9329
John McCall65b8da02013-04-11 22:55:55 +00009330 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009331 if (Args.hasArg(options::OPT_static)) {
9332 CmdArgs.push_back("-Bstatic");
9333 } else {
John McCall65b8da02013-04-11 22:55:55 +00009334 if (Args.hasArg(options::OPT_rdynamic))
9335 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009336 if (Args.hasArg(options::OPT_shared))
9337 CmdArgs.push_back("-Bshareable");
9338 else {
9339 CmdArgs.push_back("-dynamic-linker");
9340 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9341 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009342 CmdArgs.push_back("--hash-style=gnu");
9343 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009344 }
9345
9346 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9347 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009348 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009349 CmdArgs.push_back("-m");
9350 CmdArgs.push_back("elf_i386");
9351 }
9352
Daniel Dunbarb440f562010-08-02 02:38:21 +00009353 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009354 CmdArgs.push_back("-o");
9355 CmdArgs.push_back(Output.getFilename());
9356 } else {
9357 assert(Output.isNothing() && "Invalid output.");
9358 }
9359
Douglas Katzman78b37b02015-11-17 20:28:07 +00009360 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009361 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009362 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009363 CmdArgs.push_back(
9364 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009365 else {
9366 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009367 CmdArgs.push_back(
9368 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009369 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009370 CmdArgs.push_back(
9371 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009372 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009373 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009374 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009375 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009376 CmdArgs.push_back(
9377 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009378 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009379 CmdArgs.push_back(
9380 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009381 }
9382
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009383 Args.AddAllArgs(CmdArgs,
9384 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009385
Daniel Dunbar54423b22010-09-17 00:24:54 +00009386 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009387
Douglas Katzman78b37b02015-11-17 20:28:07 +00009388 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009389 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009390
9391 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009392 CmdArgs.push_back("-rpath");
9393 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009394 }
9395
Hans Wennborg70850d82013-07-18 20:29:38 +00009396 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009397 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009398 CmdArgs.push_back("-lm");
9399 }
9400
Daniel Dunbarcc912342009-05-02 18:28:39 +00009401 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009402 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009403
9404 if (!Args.hasArg(options::OPT_nolibc)) {
9405 CmdArgs.push_back("-lc");
9406 }
9407
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009408 if (Args.hasArg(options::OPT_static) ||
9409 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009410 CmdArgs.push_back("-lgcc");
9411 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009412 } else {
9413 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009414 CmdArgs.push_back("-lgcc_pic");
9415 if (!Args.hasArg(options::OPT_shared))
9416 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009417 } else {
John McCall65b8da02013-04-11 22:55:55 +00009418 CmdArgs.push_back("-lgcc");
9419 CmdArgs.push_back("--as-needed");
9420 CmdArgs.push_back("-lgcc_pic");
9421 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009422 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009423 }
9424 }
9425
Douglas Katzman78b37b02015-11-17 20:28:07 +00009426 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009427 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009428 CmdArgs.push_back(
9429 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009430 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009431 CmdArgs.push_back(
9432 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9433 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009434 }
9435
Xinliang David Li69306c02015-10-22 06:15:31 +00009436 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009437
Logan Chieneb9162f2014-06-26 14:23:45 +00009438 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009440}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009441
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009442// Try to find Exe from a Visual Studio distribution. This first tries to find
9443// an installed copy of Visual Studio and, failing that, looks in the PATH,
9444// making sure that whatever executable that's found is not a same-named exe
9445// from clang itself to prevent clang from falling back to itself.
9446static std::string FindVisualStudioExecutable(const ToolChain &TC,
9447 const char *Exe,
9448 const char *ClangProgramPath) {
9449 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9450 std::string visualStudioBinDir;
9451 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9452 visualStudioBinDir)) {
9453 SmallString<128> FilePath(visualStudioBinDir);
9454 llvm::sys::path::append(FilePath, Exe);
9455 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9456 return FilePath.str();
9457 }
9458
9459 return Exe;
9460}
9461
Douglas Katzman95354292015-06-23 20:42:09 +00009462void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9463 const InputInfo &Output,
9464 const InputInfoList &Inputs,
9465 const ArgList &Args,
9466 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009467 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009468 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009469
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009470 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9471 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009472 CmdArgs.push_back(
9473 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009474
Douglas Katzman78b37b02015-11-17 20:28:07 +00009475 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9476 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009477 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009478
Zachary Turner10d75b22014-10-22 20:40:43 +00009479 if (!llvm::sys::Process::GetEnv("LIB")) {
9480 // If the VC environment hasn't been configured (perhaps because the user
9481 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009482 // the environment variable is set however, assume the user knows what
9483 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009484 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009485 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009486 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9487 SmallString<128> LibDir(VisualStudioDir);
9488 llvm::sys::path::append(LibDir, "VC", "lib");
9489 switch (MSVC.getArch()) {
9490 case llvm::Triple::x86:
9491 // x86 just puts the libraries directly in lib
9492 break;
9493 case llvm::Triple::x86_64:
9494 llvm::sys::path::append(LibDir, "amd64");
9495 break;
9496 case llvm::Triple::arm:
9497 llvm::sys::path::append(LibDir, "arm");
9498 break;
9499 default:
9500 break;
9501 }
9502 CmdArgs.push_back(
9503 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009504
9505 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9506 std::string UniversalCRTLibPath;
9507 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9508 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9509 UniversalCRTLibPath.c_str()));
9510 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009511 }
9512
9513 std::string WindowsSdkLibPath;
9514 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9515 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9516 WindowsSdkLibPath.c_str()));
9517 }
9518
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009519 CmdArgs.push_back("-nologo");
9520
Reid Kleckner124955a2015-08-05 18:51:13 +00009521 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009522 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009523
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009524 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009525 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009526 if (DLL) {
9527 CmdArgs.push_back(Args.MakeArgString("-dll"));
9528
9529 SmallString<128> ImplibName(Output.getFilename());
9530 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009531 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009532 }
9533
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009534 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009535 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009536 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009537 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009538 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9539 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009540 // Make sure the dynamic runtime thunk is not optimized out at link time
9541 // to ensure proper SEH handling.
9542 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009543 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009544 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009545 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009546 for (const auto &Lib : {"asan", "asan_cxx"})
9547 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009548 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009549 }
9550
Hans Wennborg2e274592013-08-13 23:38:57 +00009551 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009552
Alexey Bataevc7e84352015-08-19 04:49:01 +00009553 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9554 options::OPT_fno_openmp, false)) {
9555 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9556 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9557 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9558 TC.getDriver().Dir + "/../lib"));
9559 switch (getOpenMPRuntime(getToolChain(), Args)) {
9560 case OMPRT_OMP:
9561 CmdArgs.push_back("-defaultlib:libomp.lib");
9562 break;
9563 case OMPRT_IOMP5:
9564 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9565 break;
9566 case OMPRT_GOMP:
9567 break;
9568 case OMPRT_Unknown:
9569 // Already diagnosed.
9570 break;
9571 }
9572 }
9573
Reid Kleckner337188f2014-09-16 19:22:00 +00009574 // Add filenames, libraries, and other linker inputs.
9575 for (const auto &Input : Inputs) {
9576 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009577 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009578 continue;
9579 }
9580
9581 const Arg &A = Input.getInputArg();
9582
9583 // Render -l options differently for the MSVC linker.
9584 if (A.getOption().matches(options::OPT_l)) {
9585 StringRef Lib = A.getValue();
9586 const char *LinkLibArg;
9587 if (Lib.endswith(".lib"))
9588 LinkLibArg = Args.MakeArgString(Lib);
9589 else
9590 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9591 CmdArgs.push_back(LinkLibArg);
9592 continue;
9593 }
9594
9595 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9596 // or -L. Render it, even if MSVC doesn't understand it.
9597 A.renderAsInput(Args, CmdArgs);
9598 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009599
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009600 TC.addProfileRTLibs(Args, CmdArgs);
9601
Zachary Turner719f58c2014-12-01 23:06:47 +00009602 // We need to special case some linker paths. In the case of lld, we need to
9603 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9604 // linker, we need to use a special search algorithm.
9605 llvm::SmallString<128> linkPath;
9606 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9607 if (Linker.equals_lower("lld"))
9608 Linker = "lld-link";
9609
9610 if (Linker.equals_lower("link")) {
9611 // If we're using the MSVC linker, it's not sufficient to just use link
9612 // from the program PATH, because other environments like GnuWin32 install
9613 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009614 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009615 C.getDriver().getClangProgramPath());
9616 } else {
9617 linkPath = Linker;
9618 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009619 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009620 }
9621
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009622 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009623 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009624}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009625
Douglas Katzman95354292015-06-23 20:42:09 +00009626void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9627 const InputInfo &Output,
9628 const InputInfoList &Inputs,
9629 const ArgList &Args,
9630 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009631 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9632}
9633
Douglas Katzman95354292015-06-23 20:42:09 +00009634std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009635 Compilation &C, const JobAction &JA, const InputInfo &Output,
9636 const InputInfoList &Inputs, const ArgList &Args,
9637 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009638 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009639 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009640 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009641 CmdArgs.push_back("/W0"); // No warnings.
9642
9643 // The goal is to be able to invoke this tool correctly based on
9644 // any flag accepted by clang-cl.
9645
9646 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009647 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009648
9649 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009650 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9651 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9652 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009653 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9654 if (A->getOption().getID() == options::OPT_O0) {
9655 CmdArgs.push_back("/Od");
9656 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009657 CmdArgs.push_back("/Og");
9658
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009659 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009660 if (OptLevel == "s" || OptLevel == "z")
9661 CmdArgs.push_back("/Os");
9662 else
9663 CmdArgs.push_back("/Ot");
9664
9665 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009666 }
9667 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009668 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9669 options::OPT_fno_omit_frame_pointer))
9670 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9671 ? "/Oy"
9672 : "/Oy-");
9673 if (!Args.hasArg(options::OPT_fwritable_strings))
9674 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009675
Nico Weber3f8dafb2015-03-12 19:37:10 +00009676 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009677 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9678
David Majnemerf6072342014-07-01 22:24:56 +00009679 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9680 /*default=*/false))
9681 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009682 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9683 options::OPT_fno_function_sections))
9684 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9685 ? "/Gy"
9686 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009687 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9688 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009689 CmdArgs.push_back(
9690 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009691 if (Args.hasArg(options::OPT_fsyntax_only))
9692 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009693 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9694 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009695 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009696
Nico Weber3f8dafb2015-03-12 19:37:10 +00009697 std::vector<std::string> Includes =
9698 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009699 for (const auto &Include : Includes)
9700 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009701
Hans Wennborg87cfa712013-09-19 20:32:16 +00009702 // Flags that can simply be passed through.
9703 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9704 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009705 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009706 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009707
9708 // The order of these flags is relevant, so pick the last one.
9709 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9710 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9711 A->render(Args, CmdArgs);
9712
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009713 // Pass through all unknown arguments so that the fallback command can see
9714 // them too.
9715 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9716
Hans Wennborg87cfa712013-09-19 20:32:16 +00009717 // Input filename.
9718 assert(Inputs.size() == 1);
9719 const InputInfo &II = Inputs[0];
9720 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9721 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9722 if (II.isFilename())
9723 CmdArgs.push_back(II.getFilename());
9724 else
9725 II.getInputArg().renderAsInput(Args, CmdArgs);
9726
9727 // Output filename.
9728 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009729 const char *Fo =
9730 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009731 CmdArgs.push_back(Fo);
9732
Hans Wennborg188382e2013-09-20 18:16:35 +00009733 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009734 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9735 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009736 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009737 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009738}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009739
Yaron Keren1c0070c2015-07-02 04:45:27 +00009740/// MinGW Tools
9741void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9742 const InputInfo &Output,
9743 const InputInfoList &Inputs,
9744 const ArgList &Args,
9745 const char *LinkingOutput) const {
9746 claimNoWarnArgs(Args);
9747 ArgStringList CmdArgs;
9748
9749 if (getToolChain().getArch() == llvm::Triple::x86) {
9750 CmdArgs.push_back("--32");
9751 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9752 CmdArgs.push_back("--64");
9753 }
9754
9755 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9756
9757 CmdArgs.push_back("-o");
9758 CmdArgs.push_back(Output.getFilename());
9759
9760 for (const auto &II : Inputs)
9761 CmdArgs.push_back(II.getFilename());
9762
9763 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009764 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009765
9766 if (Args.hasArg(options::OPT_gsplit_dwarf))
9767 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9768 SplitDebugName(Args, Inputs[0]));
9769}
9770
9771void MinGW::Linker::AddLibGCC(const ArgList &Args,
9772 ArgStringList &CmdArgs) const {
9773 if (Args.hasArg(options::OPT_mthreads))
9774 CmdArgs.push_back("-lmingwthrd");
9775 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009776
Yaron Kerenaa281332015-08-09 00:24:07 +00009777 // Make use of compiler-rt if --rtlib option is used
9778 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9779 if (RLT == ToolChain::RLT_Libgcc) {
9780 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9781 Args.hasArg(options::OPT_static);
9782 bool Shared = Args.hasArg(options::OPT_shared);
9783 bool CXX = getToolChain().getDriver().CCCIsCXX();
9784
9785 if (Static || (!CXX && !Shared)) {
9786 CmdArgs.push_back("-lgcc");
9787 CmdArgs.push_back("-lgcc_eh");
9788 } else {
9789 CmdArgs.push_back("-lgcc_s");
9790 CmdArgs.push_back("-lgcc");
9791 }
9792 } else {
9793 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9794 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009795
Yaron Keren1c0070c2015-07-02 04:45:27 +00009796 CmdArgs.push_back("-lmoldname");
9797 CmdArgs.push_back("-lmingwex");
9798 CmdArgs.push_back("-lmsvcrt");
9799}
9800
9801void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9802 const InputInfo &Output,
9803 const InputInfoList &Inputs,
9804 const ArgList &Args,
9805 const char *LinkingOutput) const {
9806 const ToolChain &TC = getToolChain();
9807 const Driver &D = TC.getDriver();
9808 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9809
9810 ArgStringList CmdArgs;
9811
9812 // Silence warning for "clang -g foo.o -o foo"
9813 Args.ClaimAllArgs(options::OPT_g_Group);
9814 // and "clang -emit-llvm foo.o -o foo"
9815 Args.ClaimAllArgs(options::OPT_emit_llvm);
9816 // and for "clang -w foo.o -o foo". Other warning options are already
9817 // handled somewhere else.
9818 Args.ClaimAllArgs(options::OPT_w);
9819
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009820 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9821 if (LinkerName.equals_lower("lld")) {
9822 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009823 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009824 } else if (!LinkerName.equals_lower("ld")) {
9825 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009826 }
9827
Yaron Keren1c0070c2015-07-02 04:45:27 +00009828 if (!D.SysRoot.empty())
9829 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9830
9831 if (Args.hasArg(options::OPT_s))
9832 CmdArgs.push_back("-s");
9833
9834 CmdArgs.push_back("-m");
9835 if (TC.getArch() == llvm::Triple::x86)
9836 CmdArgs.push_back("i386pe");
9837 if (TC.getArch() == llvm::Triple::x86_64)
9838 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009839 if (TC.getArch() == llvm::Triple::arm)
9840 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009841
9842 if (Args.hasArg(options::OPT_mwindows)) {
9843 CmdArgs.push_back("--subsystem");
9844 CmdArgs.push_back("windows");
9845 } else if (Args.hasArg(options::OPT_mconsole)) {
9846 CmdArgs.push_back("--subsystem");
9847 CmdArgs.push_back("console");
9848 }
9849
9850 if (Args.hasArg(options::OPT_static))
9851 CmdArgs.push_back("-Bstatic");
9852 else {
9853 if (Args.hasArg(options::OPT_mdll))
9854 CmdArgs.push_back("--dll");
9855 else if (Args.hasArg(options::OPT_shared))
9856 CmdArgs.push_back("--shared");
9857 CmdArgs.push_back("-Bdynamic");
9858 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9859 CmdArgs.push_back("-e");
9860 if (TC.getArch() == llvm::Triple::x86)
9861 CmdArgs.push_back("_DllMainCRTStartup@12");
9862 else
9863 CmdArgs.push_back("DllMainCRTStartup");
9864 CmdArgs.push_back("--enable-auto-image-base");
9865 }
9866 }
9867
9868 CmdArgs.push_back("-o");
9869 CmdArgs.push_back(Output.getFilename());
9870
9871 Args.AddAllArgs(CmdArgs, options::OPT_e);
9872 // FIXME: add -N, -n flags
9873 Args.AddLastArg(CmdArgs, options::OPT_r);
9874 Args.AddLastArg(CmdArgs, options::OPT_s);
9875 Args.AddLastArg(CmdArgs, options::OPT_t);
9876 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9877 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9878
Douglas Katzman78b37b02015-11-17 20:28:07 +00009879 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009880 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9881 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9882 } else {
9883 if (Args.hasArg(options::OPT_municode))
9884 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9885 else
9886 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9887 }
9888 if (Args.hasArg(options::OPT_pg))
9889 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9891 }
9892
9893 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009894 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009895 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9896
9897 // TODO: Add ASan stuff here
9898
9899 // TODO: Add profile stuff here
9900
Douglas Katzman78b37b02015-11-17 20:28:07 +00009901 if (D.CCCIsCXX() &&
9902 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009903 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9904 !Args.hasArg(options::OPT_static);
9905 if (OnlyLibstdcxxStatic)
9906 CmdArgs.push_back("-Bstatic");
9907 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9908 if (OnlyLibstdcxxStatic)
9909 CmdArgs.push_back("-Bdynamic");
9910 }
9911
9912 if (!Args.hasArg(options::OPT_nostdlib)) {
9913 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9914 if (Args.hasArg(options::OPT_static))
9915 CmdArgs.push_back("--start-group");
9916
9917 if (Args.hasArg(options::OPT_fstack_protector) ||
9918 Args.hasArg(options::OPT_fstack_protector_strong) ||
9919 Args.hasArg(options::OPT_fstack_protector_all)) {
9920 CmdArgs.push_back("-lssp_nonshared");
9921 CmdArgs.push_back("-lssp");
9922 }
9923 if (Args.hasArg(options::OPT_fopenmp))
9924 CmdArgs.push_back("-lgomp");
9925
9926 AddLibGCC(Args, CmdArgs);
9927
9928 if (Args.hasArg(options::OPT_pg))
9929 CmdArgs.push_back("-lgmon");
9930
Yaron Kerenadce68e2015-07-06 18:52:19 +00009931 if (Args.hasArg(options::OPT_pthread))
9932 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009933
9934 // add system libraries
9935 if (Args.hasArg(options::OPT_mwindows)) {
9936 CmdArgs.push_back("-lgdi32");
9937 CmdArgs.push_back("-lcomdlg32");
9938 }
9939 CmdArgs.push_back("-ladvapi32");
9940 CmdArgs.push_back("-lshell32");
9941 CmdArgs.push_back("-luser32");
9942 CmdArgs.push_back("-lkernel32");
9943
9944 if (Args.hasArg(options::OPT_static))
9945 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009946 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009947 AddLibGCC(Args, CmdArgs);
9948 }
9949
9950 if (!Args.hasArg(options::OPT_nostartfiles)) {
9951 // Add crtfastmath.o if available and fast math is enabled.
9952 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9953
9954 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9955 }
9956 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009957 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009958 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009959}
9960
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009961/// XCore Tools
9962// We pass assemble and link construction to the xcc tool.
9963
Douglas Katzman95354292015-06-23 20:42:09 +00009964void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9965 const InputInfo &Output,
9966 const InputInfoList &Inputs,
9967 const ArgList &Args,
9968 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009969 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009970 ArgStringList CmdArgs;
9971
9972 CmdArgs.push_back("-o");
9973 CmdArgs.push_back(Output.getFilename());
9974
9975 CmdArgs.push_back("-c");
9976
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009977 if (Args.hasArg(options::OPT_v))
9978 CmdArgs.push_back("-v");
9979
Robert Lytton894d25c2014-05-02 09:33:25 +00009980 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9981 if (!A->getOption().matches(options::OPT_g0))
9982 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009983
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009984 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9985 false))
9986 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009987
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009988 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009989
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009990 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009991 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009992
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009993 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009994 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009995}
9996
Douglas Katzman95354292015-06-23 20:42:09 +00009997void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9998 const InputInfo &Output,
9999 const InputInfoList &Inputs,
10000 const ArgList &Args,
10001 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010002 ArgStringList CmdArgs;
10003
10004 if (Output.isFilename()) {
10005 CmdArgs.push_back("-o");
10006 CmdArgs.push_back(Output.getFilename());
10007 } else {
10008 assert(Output.isNothing() && "Invalid output.");
10009 }
10010
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010011 if (Args.hasArg(options::OPT_v))
10012 CmdArgs.push_back("-v");
10013
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010014 // Pass -fexceptions through to the linker if it was present.
10015 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10016 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010017 CmdArgs.push_back("-fexceptions");
10018
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010019 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10020
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010021 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010022 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010023}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010024
Douglas Katzman95354292015-06-23 20:42:09 +000010025void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10026 const InputInfo &Output,
10027 const InputInfoList &Inputs,
10028 const ArgList &Args,
10029 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010030 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010031 const auto &TC =
10032 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10033 ArgStringList CmdArgs;
10034 const char *Exec;
10035
10036 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010037 default:
10038 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010039 case llvm::Triple::arm:
10040 case llvm::Triple::thumb:
10041 break;
10042 case llvm::Triple::x86:
10043 CmdArgs.push_back("--32");
10044 break;
10045 case llvm::Triple::x86_64:
10046 CmdArgs.push_back("--64");
10047 break;
10048 }
10049
10050 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10051
10052 CmdArgs.push_back("-o");
10053 CmdArgs.push_back(Output.getFilename());
10054
10055 for (const auto &Input : Inputs)
10056 CmdArgs.push_back(Input.getFilename());
10057
10058 const std::string Assembler = TC.GetProgramPath("as");
10059 Exec = Args.MakeArgString(Assembler);
10060
Justin Bognerd3371d82015-07-17 03:35:54 +000010061 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010062}
10063
Douglas Katzman95354292015-06-23 20:42:09 +000010064void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10065 const InputInfo &Output,
10066 const InputInfoList &Inputs,
10067 const ArgList &Args,
10068 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010069 const auto &TC =
10070 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10071 const llvm::Triple &T = TC.getTriple();
10072 const Driver &D = TC.getDriver();
10073 SmallString<128> EntryPoint;
10074 ArgStringList CmdArgs;
10075 const char *Exec;
10076
10077 // Silence warning for "clang -g foo.o -o foo"
10078 Args.ClaimAllArgs(options::OPT_g_Group);
10079 // and "clang -emit-llvm foo.o -o foo"
10080 Args.ClaimAllArgs(options::OPT_emit_llvm);
10081 // and for "clang -w foo.o -o foo"
10082 Args.ClaimAllArgs(options::OPT_w);
10083 // Other warning options are already handled somewhere else.
10084
10085 if (!D.SysRoot.empty())
10086 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10087
10088 if (Args.hasArg(options::OPT_pie))
10089 CmdArgs.push_back("-pie");
10090 if (Args.hasArg(options::OPT_rdynamic))
10091 CmdArgs.push_back("-export-dynamic");
10092 if (Args.hasArg(options::OPT_s))
10093 CmdArgs.push_back("--strip-all");
10094
10095 CmdArgs.push_back("-m");
10096 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010097 default:
10098 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010099 case llvm::Triple::arm:
10100 case llvm::Triple::thumb:
10101 // FIXME: this is incorrect for WinCE
10102 CmdArgs.push_back("thumb2pe");
10103 break;
10104 case llvm::Triple::x86:
10105 CmdArgs.push_back("i386pe");
10106 EntryPoint.append("_");
10107 break;
10108 case llvm::Triple::x86_64:
10109 CmdArgs.push_back("i386pep");
10110 break;
10111 }
10112
10113 if (Args.hasArg(options::OPT_shared)) {
10114 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010115 default:
10116 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010117 case llvm::Triple::arm:
10118 case llvm::Triple::thumb:
10119 case llvm::Triple::x86_64:
10120 EntryPoint.append("_DllMainCRTStartup");
10121 break;
10122 case llvm::Triple::x86:
10123 EntryPoint.append("_DllMainCRTStartup@12");
10124 break;
10125 }
10126
10127 CmdArgs.push_back("-shared");
10128 CmdArgs.push_back("-Bdynamic");
10129
10130 CmdArgs.push_back("--enable-auto-image-base");
10131
10132 CmdArgs.push_back("--entry");
10133 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10134 } else {
10135 EntryPoint.append("mainCRTStartup");
10136
10137 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10138 : "-Bdynamic");
10139
Douglas Katzman78b37b02015-11-17 20:28:07 +000010140 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010141 CmdArgs.push_back("--entry");
10142 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10143 }
10144
10145 // FIXME: handle subsystem
10146 }
10147
10148 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010149 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010150
10151 CmdArgs.push_back("-o");
10152 CmdArgs.push_back(Output.getFilename());
10153
10154 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10155 SmallString<261> ImpLib(Output.getFilename());
10156 llvm::sys::path::replace_extension(ImpLib, ".lib");
10157
10158 CmdArgs.push_back("--out-implib");
10159 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10160 }
10161
Douglas Katzman78b37b02015-11-17 20:28:07 +000010162 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010163 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10164 const char *CRTBegin;
10165
10166 CRTBegin =
10167 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10168 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10169 }
10170
10171 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010172 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010173 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10174
10175 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10176 !Args.hasArg(options::OPT_nodefaultlibs)) {
10177 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10178 !Args.hasArg(options::OPT_static);
10179 if (StaticCXX)
10180 CmdArgs.push_back("-Bstatic");
10181 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10182 if (StaticCXX)
10183 CmdArgs.push_back("-Bdynamic");
10184 }
10185
10186 if (!Args.hasArg(options::OPT_nostdlib)) {
10187 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10188 // TODO handle /MT[d] /MD[d]
10189 CmdArgs.push_back("-lmsvcrt");
10190 AddRunTimeLibs(TC, D, CmdArgs, Args);
10191 }
10192 }
10193
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010194 if (TC.getSanitizerArgs().needsAsanRt()) {
10195 // TODO handle /MT[d] /MD[d]
10196 if (Args.hasArg(options::OPT_shared)) {
10197 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10198 } else {
10199 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10200 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10201 // Make sure the dynamic runtime thunk is not optimized out at link time
10202 // to ensure proper SEH handling.
10203 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10204 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10205 ? "___asan_seh_interceptor"
10206 : "__asan_seh_interceptor"));
10207 }
10208 }
10209
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010210 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010211
Justin Bognerd3371d82015-07-17 03:35:54 +000010212 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010213}
Douglas Katzman84a75642015-06-19 14:55:19 +000010214
Douglas Katzman95354292015-06-23 20:42:09 +000010215void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10216 const InputInfo &Output,
10217 const InputInfoList &Inputs,
10218 const ArgList &Args,
10219 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010220 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010221 assert(Inputs.size() == 1);
10222 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010223 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10224 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010225
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010226 if (JA.getKind() == Action::PreprocessJobClass) {
10227 Args.ClaimAllArgs();
10228 CmdArgs.push_back("-E");
10229 } else {
10230 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10231 CmdArgs.push_back("-S");
10232 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10233 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010234 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010235 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010236
Douglas Katzmanf6071112015-08-03 14:34:22 +000010237 // Append all -I, -iquote, -isystem paths, defines/undefines,
10238 // 'f' flags, optimize flags, and warning options.
10239 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010240 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010241 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010242 options::OPT_f_Group, options::OPT_f_clang_Group,
10243 options::OPT_g_Group, options::OPT_M_Group,
10244 options::OPT_O_Group, options::OPT_W_Group});
10245
10246 // If we're producing a dependency file, and assembly is the final action,
10247 // then the name of the target in the dependency file should be the '.o'
10248 // file, not the '.s' file produced by this step. For example, instead of
10249 // /tmp/mumble.s: mumble.c .../someheader.h
10250 // the filename on the lefthand side should be "mumble.o"
10251 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10252 C.getActions().size() == 1 &&
10253 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10254 Arg *A = Args.getLastArg(options::OPT_o);
10255 if (A) {
10256 CmdArgs.push_back("-MT");
10257 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10258 }
10259 }
10260
Douglas Katzman84a75642015-06-19 14:55:19 +000010261 CmdArgs.push_back(II.getFilename());
10262 CmdArgs.push_back("-o");
10263 CmdArgs.push_back(Output.getFilename());
10264
10265 std::string Exec =
10266 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010267 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10268 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010269}
10270
Douglas Katzman95354292015-06-23 20:42:09 +000010271void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10272 const InputInfo &Output,
10273 const InputInfoList &Inputs,
10274 const ArgList &Args,
10275 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010276 ArgStringList CmdArgs;
10277
10278 assert(Inputs.size() == 1);
10279 const InputInfo &II = Inputs[0];
10280 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10281 assert(Output.getType() == types::TY_Object);
10282
10283 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010284 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010285 CmdArgs.push_back("-noSPrefixing");
10286 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010287 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10288 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10289 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010290 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010291 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010292 }
10293 CmdArgs.push_back("-elf"); // Output format.
10294 CmdArgs.push_back(II.getFilename());
10295 CmdArgs.push_back(
10296 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10297
10298 std::string Exec =
10299 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010300 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10301 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010302}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010303
10304void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10305 const InputInfo &Output,
10306 const InputInfoList &Inputs,
10307 const ArgList &Args,
10308 const char *LinkingOutput) const {
10309 const auto &TC =
10310 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10311 const llvm::Triple &T = TC.getTriple();
10312 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010313 bool UseStartfiles =
10314 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010315 bool UseDefaultLibs =
10316 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010317
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010318 if (T.getArch() == llvm::Triple::sparc)
10319 CmdArgs.push_back("-EB");
10320 else // SHAVE assumes little-endian, and sparcel is expressly so.
10321 CmdArgs.push_back("-EL");
10322
10323 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10324 // but we never pass through a --sysroot option and various other bits.
10325 // For example, there are no sanitizers (yet) nor gold linker.
10326
10327 // Eat some arguments that may be present but have no effect.
10328 Args.ClaimAllArgs(options::OPT_g_Group);
10329 Args.ClaimAllArgs(options::OPT_w);
10330 Args.ClaimAllArgs(options::OPT_static_libgcc);
10331
10332 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10333 CmdArgs.push_back("-s");
10334
10335 CmdArgs.push_back("-o");
10336 CmdArgs.push_back(Output.getFilename());
10337
10338 if (UseStartfiles) {
10339 // If you want startfiles, it means you want the builtin crti and crtbegin,
10340 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010341 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10342 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010343 }
10344
10345 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10346 options::OPT_e, options::OPT_s, options::OPT_t,
10347 options::OPT_Z_Flag, options::OPT_r});
10348
Douglas Katzman674a3122015-11-18 16:24:46 +000010349 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010350
10351 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10352
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010353 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010354 if (C.getDriver().CCCIsCXX())
10355 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010356 if (T.getOS() == llvm::Triple::RTEMS) {
10357 CmdArgs.push_back("--start-group");
10358 CmdArgs.push_back("-lc");
10359 // You must provide your own "-L" option to enable finding these.
10360 CmdArgs.push_back("-lrtemscpu");
10361 CmdArgs.push_back("-lrtemsbsp");
10362 CmdArgs.push_back("--end-group");
10363 } else {
10364 CmdArgs.push_back("-lc");
10365 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010366 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010367 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010368 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010369 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10370 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010371 }
10372
10373 std::string Exec =
10374 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10375 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10376 CmdArgs, Inputs));
10377}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010378
10379void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10380 const InputInfo &Output,
10381 const InputInfoList &Inputs,
10382 const ArgList &Args,
10383 const char *LinkingOutput) const {
10384 claimNoWarnArgs(Args);
10385 ArgStringList CmdArgs;
10386
10387 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10388
10389 CmdArgs.push_back("-o");
10390 CmdArgs.push_back(Output.getFilename());
10391
10392 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10393 const InputInfo &Input = Inputs[0];
10394 assert(Input.isFilename() && "Invalid input.");
10395 CmdArgs.push_back(Input.getFilename());
10396
10397 const char *Exec =
10398 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10400}
10401
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010402static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10403 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10404 if (SanArgs.needsUbsanRt()) {
10405 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10406 }
10407 if (SanArgs.needsAsanRt()) {
10408 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10409 }
10410}
10411
10412static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10413 const JobAction &JA, const InputInfo &Output,
10414 const InputInfoList &Inputs,
10415 const ArgList &Args,
10416 const char *LinkingOutput) {
10417 const toolchains::FreeBSD &ToolChain =
10418 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10419 const Driver &D = ToolChain.getDriver();
10420 ArgStringList CmdArgs;
10421
10422 // Silence warning for "clang -g foo.o -o foo"
10423 Args.ClaimAllArgs(options::OPT_g_Group);
10424 // and "clang -emit-llvm foo.o -o foo"
10425 Args.ClaimAllArgs(options::OPT_emit_llvm);
10426 // and for "clang -w foo.o -o foo". Other warning options are already
10427 // handled somewhere else.
10428 Args.ClaimAllArgs(options::OPT_w);
10429
10430 if (!D.SysRoot.empty())
10431 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10432
10433 if (Args.hasArg(options::OPT_pie))
10434 CmdArgs.push_back("-pie");
10435
10436 if (Args.hasArg(options::OPT_rdynamic))
10437 CmdArgs.push_back("-export-dynamic");
10438 if (Args.hasArg(options::OPT_shared))
10439 CmdArgs.push_back("--oformat=so");
10440
10441 if (Output.isFilename()) {
10442 CmdArgs.push_back("-o");
10443 CmdArgs.push_back(Output.getFilename());
10444 } else {
10445 assert(Output.isNothing() && "Invalid output.");
10446 }
10447
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010448 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10449
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010450 Args.AddAllArgs(CmdArgs, options::OPT_L);
10451 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10452 Args.AddAllArgs(CmdArgs, options::OPT_e);
10453 Args.AddAllArgs(CmdArgs, options::OPT_s);
10454 Args.AddAllArgs(CmdArgs, options::OPT_t);
10455 Args.AddAllArgs(CmdArgs, options::OPT_r);
10456
10457 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10458 CmdArgs.push_back("--no-demangle");
10459
10460 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10461
10462 if (Args.hasArg(options::OPT_pthread)) {
10463 CmdArgs.push_back("-lpthread");
10464 }
10465
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010466 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10467
10468 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10469}
10470
10471static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10472 const JobAction &JA, const InputInfo &Output,
10473 const InputInfoList &Inputs,
10474 const ArgList &Args,
10475 const char *LinkingOutput) {
10476 const toolchains::FreeBSD &ToolChain =
10477 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10478 const Driver &D = ToolChain.getDriver();
10479 ArgStringList CmdArgs;
10480
10481 // Silence warning for "clang -g foo.o -o foo"
10482 Args.ClaimAllArgs(options::OPT_g_Group);
10483 // and "clang -emit-llvm foo.o -o foo"
10484 Args.ClaimAllArgs(options::OPT_emit_llvm);
10485 // and for "clang -w foo.o -o foo". Other warning options are already
10486 // handled somewhere else.
10487 Args.ClaimAllArgs(options::OPT_w);
10488
10489 if (!D.SysRoot.empty())
10490 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10491
10492 if (Args.hasArg(options::OPT_pie))
10493 CmdArgs.push_back("-pie");
10494
10495 if (Args.hasArg(options::OPT_static)) {
10496 CmdArgs.push_back("-Bstatic");
10497 } else {
10498 if (Args.hasArg(options::OPT_rdynamic))
10499 CmdArgs.push_back("-export-dynamic");
10500 CmdArgs.push_back("--eh-frame-hdr");
10501 if (Args.hasArg(options::OPT_shared)) {
10502 CmdArgs.push_back("-Bshareable");
10503 } else {
10504 CmdArgs.push_back("-dynamic-linker");
10505 CmdArgs.push_back("/libexec/ld-elf.so.1");
10506 }
10507 CmdArgs.push_back("--enable-new-dtags");
10508 }
10509
10510 if (Output.isFilename()) {
10511 CmdArgs.push_back("-o");
10512 CmdArgs.push_back(Output.getFilename());
10513 } else {
10514 assert(Output.isNothing() && "Invalid output.");
10515 }
10516
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010517 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10518
Douglas Katzman78b37b02015-11-17 20:28:07 +000010519 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010520 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010521 if (!Args.hasArg(options::OPT_shared)) {
10522 if (Args.hasArg(options::OPT_pg))
10523 crt1 = "gcrt1.o";
10524 else if (Args.hasArg(options::OPT_pie))
10525 crt1 = "Scrt1.o";
10526 else
10527 crt1 = "crt1.o";
10528 }
10529 if (crt1)
10530 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10531
10532 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10533
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010534 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010535 if (Args.hasArg(options::OPT_static))
10536 crtbegin = "crtbeginT.o";
10537 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10538 crtbegin = "crtbeginS.o";
10539 else
10540 crtbegin = "crtbegin.o";
10541
10542 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10543 }
10544
10545 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010546 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010547 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10548 Args.AddAllArgs(CmdArgs, options::OPT_e);
10549 Args.AddAllArgs(CmdArgs, options::OPT_s);
10550 Args.AddAllArgs(CmdArgs, options::OPT_t);
10551 Args.AddAllArgs(CmdArgs, options::OPT_r);
10552
10553 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10554 CmdArgs.push_back("--no-demangle");
10555
10556 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10557
Douglas Katzman78b37b02015-11-17 20:28:07 +000010558 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010559 // For PS4, we always want to pass libm, libstdc++ and libkernel
10560 // libraries for both C and C++ compilations.
10561 CmdArgs.push_back("-lkernel");
10562 if (D.CCCIsCXX()) {
10563 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10564 if (Args.hasArg(options::OPT_pg))
10565 CmdArgs.push_back("-lm_p");
10566 else
10567 CmdArgs.push_back("-lm");
10568 }
10569 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10570 // the default system libraries. Just mimic this for now.
10571 if (Args.hasArg(options::OPT_pg))
10572 CmdArgs.push_back("-lgcc_p");
10573 else
10574 CmdArgs.push_back("-lcompiler_rt");
10575 if (Args.hasArg(options::OPT_static)) {
10576 CmdArgs.push_back("-lstdc++");
10577 } else if (Args.hasArg(options::OPT_pg)) {
10578 CmdArgs.push_back("-lgcc_eh_p");
10579 } else {
10580 CmdArgs.push_back("--as-needed");
10581 CmdArgs.push_back("-lstdc++");
10582 CmdArgs.push_back("--no-as-needed");
10583 }
10584
10585 if (Args.hasArg(options::OPT_pthread)) {
10586 if (Args.hasArg(options::OPT_pg))
10587 CmdArgs.push_back("-lpthread_p");
10588 else
10589 CmdArgs.push_back("-lpthread");
10590 }
10591
10592 if (Args.hasArg(options::OPT_pg)) {
10593 if (Args.hasArg(options::OPT_shared))
10594 CmdArgs.push_back("-lc");
10595 else {
10596 if (Args.hasArg(options::OPT_static)) {
10597 CmdArgs.push_back("--start-group");
10598 CmdArgs.push_back("-lc_p");
10599 CmdArgs.push_back("-lpthread_p");
10600 CmdArgs.push_back("--end-group");
10601 } else {
10602 CmdArgs.push_back("-lc_p");
10603 }
10604 }
10605 CmdArgs.push_back("-lgcc_p");
10606 } else {
10607 if (Args.hasArg(options::OPT_static)) {
10608 CmdArgs.push_back("--start-group");
10609 CmdArgs.push_back("-lc");
10610 CmdArgs.push_back("-lpthread");
10611 CmdArgs.push_back("--end-group");
10612 } else {
10613 CmdArgs.push_back("-lc");
10614 }
10615 CmdArgs.push_back("-lcompiler_rt");
10616 }
10617
10618 if (Args.hasArg(options::OPT_static)) {
10619 CmdArgs.push_back("-lstdc++");
10620 } else if (Args.hasArg(options::OPT_pg)) {
10621 CmdArgs.push_back("-lgcc_eh_p");
10622 } else {
10623 CmdArgs.push_back("--as-needed");
10624 CmdArgs.push_back("-lstdc++");
10625 CmdArgs.push_back("--no-as-needed");
10626 }
10627 }
10628
Douglas Katzman78b37b02015-11-17 20:28:07 +000010629 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010630 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10631 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10632 else
10633 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10634 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10635 }
10636
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010637 const char *Exec =
10638#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010639 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010640#else
10641 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10642#endif
10643
10644 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10645}
10646
10647void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10648 const InputInfo &Output,
10649 const InputInfoList &Inputs,
10650 const ArgList &Args,
10651 const char *LinkingOutput) const {
10652 const toolchains::FreeBSD &ToolChain =
10653 static_cast<const toolchains::FreeBSD &>(getToolChain());
10654 const Driver &D = ToolChain.getDriver();
10655 bool PS4Linker;
10656 StringRef LinkerOptName;
10657 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10658 LinkerOptName = A->getValue();
10659 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10660 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10661 }
10662
10663 if (LinkerOptName == "gold")
10664 PS4Linker = false;
10665 else if (LinkerOptName == "ps4")
10666 PS4Linker = true;
10667 else
10668 PS4Linker = !Args.hasArg(options::OPT_shared);
10669
10670 if (PS4Linker)
10671 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10672 else
10673 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10674}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010675
10676void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10677 const InputInfo &Output,
10678 const InputInfoList &Inputs,
10679 const ArgList &Args,
10680 const char *LinkingOutput) const {
10681 const auto &TC =
10682 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010683 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010684
10685 std::vector<std::string> gpu_archs =
10686 Args.getAllArgValues(options::OPT_march_EQ);
10687 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10688 const std::string& gpu_arch = gpu_archs[0];
10689
10690
10691 ArgStringList CmdArgs;
10692 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10693
Justin Lebar2836dcd2016-01-19 19:52:21 +000010694 // Map the -O we received to -O{0,1,2,3}.
10695 //
10696 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,
10697 // so it may correspond more closely to the spirit of clang -O2.
10698 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10699 // -O3 seems like the least-bad option when -Osomething is specified to
10700 // clang but it isn't handled below.
10701 StringRef OOpt = "3";
10702 if (A->getOption().matches(options::OPT_O4) ||
10703 A->getOption().matches(options::OPT_Ofast))
10704 OOpt = "3";
10705 else if (A->getOption().matches(options::OPT_O0))
10706 OOpt = "0";
10707 else if (A->getOption().matches(options::OPT_O)) {
10708 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10709 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10710 .Case("1", "1")
10711 .Case("2", "2")
10712 .Case("3", "3")
10713 .Case("s", "2")
10714 .Case("z", "2")
10715 .Default("2");
10716 }
10717 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10718 } else {
10719 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10720 // to no optimizations, but ptxas's default is -O3.
10721 CmdArgs.push_back("-O0");
10722 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010723
10724 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10725 // not supported at other optimization levels.
10726
10727 CmdArgs.push_back("--gpu-name");
10728 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10729 CmdArgs.push_back("--output-file");
10730 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10731 for (const auto& II : Inputs)
10732 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10733
10734 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10735 CmdArgs.push_back(Args.MakeArgString(A));
10736
10737 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10738 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10739}
10740
10741// All inputs to this linker must be from CudaDeviceActions, as we need to look
10742// at the Inputs' Actions in order to figure out which GPU architecture they
10743// correspond to.
10744void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10745 const InputInfo &Output,
10746 const InputInfoList &Inputs,
10747 const ArgList &Args,
10748 const char *LinkingOutput) const {
10749 const auto &TC =
10750 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010751 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010752
10753 ArgStringList CmdArgs;
10754 CmdArgs.push_back("--cuda");
10755 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10756 CmdArgs.push_back(Args.MakeArgString("--create"));
10757 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10758
10759 for (const auto& II : Inputs) {
10760 auto* A = cast<const CudaDeviceAction>(II.getAction());
10761 // We need to pass an Arch of the form "sm_XX" for cubin files and
10762 // "compute_XX" for ptx.
10763 const char *Arch = (II.getType() == types::TY_PP_Asm)
10764 ? A->getComputeArchName()
10765 : A->getGpuArchName();
10766 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10767 Arch + ",file=" + II.getFilename()));
10768 }
10769
10770 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10771 CmdArgs.push_back(Args.MakeArgString(A));
10772
10773 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10774 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10775}