blob: 2819ab39885206f3006c9583797b0b7b2b17b63a [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;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000701 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000702 break;
703 }
Tim Northover756447a2015-10-30 16:30:36 +0000704 case llvm::Triple::WatchOS:
705 ABI = FloatABI::Hard;
706 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000707
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000708 // FIXME: this is invalid for WindowsCE
709 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000710 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000711 break;
712
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000715 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000716 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000717 break;
718 default:
719 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000720 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000721 break;
722 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000723 break;
724
Daniel Dunbar78485922009-09-10 23:00:09 +0000725 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000727 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000728 case llvm::Triple::EABIHF:
729 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000730 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000732 case llvm::Triple::EABI:
733 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000734 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000735 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000736 case llvm::Triple::Android:
737 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000738 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000742 if (Triple.getOS() != llvm::Triple::UnknownOS ||
743 !Triple.isOSBinFormatMachO())
744 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000745 break;
746 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000747 }
748 }
749
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 assert(ABI != FloatABI::Invalid && "must select an ABI");
751 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752}
753
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000754static void getARMTargetFeatures(const ToolChain &TC,
755 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000757 std::vector<const char *> &Features,
758 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000759 const Driver &D = TC.getDriver();
760
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000761 bool KernelOrKext =
762 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000763 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000764 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
765 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
766
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 if (!ForAS) {
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
770 // stripped out by the ARM target. We should probably pass this a new
771 // -target-option, which is handled by the -cc1/-cc1as invocation.
772 //
773 // FIXME2: For consistency, it would be ideal if we set up the target
774 // machine state the same when using the frontend or the assembler. We don't
775 // currently do that for the assembler, we pass the options directly to the
776 // backend and never even instantiate the frontend TargetInfo. If we did,
777 // and used its handleTargetFeatures hook, then we could ensure the
778 // assembler and the frontend behave the same.
779
780 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000782 Features.push_back("+soft-float");
783
784 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000786 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000787 } else {
788 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
789 // to the assembler correctly.
790 for (const Arg *A :
791 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
792 StringRef Value = A->getValue();
793 if (Value.startswith("-mfpu=")) {
794 WaFPU = A;
795 } else if (Value.startswith("-mcpu=")) {
796 WaCPU = A;
797 } else if (Value.startswith("-mhwdiv=")) {
798 WaHDiv = A;
799 } else if (Value.startswith("-march=")) {
800 WaArch = A;
801 }
802 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000803 }
804
Renato Golin7c542b42015-07-27 23:44:45 +0000805 // Check -march. ClangAs gives preference to -Wa,-march=.
806 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000807 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000808 if (WaArch) {
809 if (ArchArg)
810 D.Diag(clang::diag::warn_drv_unused_argument)
811 << ArchArg->getAsString(Args);
812 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000814 // FIXME: Set Arch.
815 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
816 } else if (ArchArg) {
817 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000818 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000819 }
820
Renato Golin7c542b42015-07-27 23:44:45 +0000821 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
822 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000823 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000824 if (WaCPU) {
825 if (CPUArg)
826 D.Diag(clang::diag::warn_drv_unused_argument)
827 << CPUArg->getAsString(Args);
828 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000829 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000830 } else if (CPUArg) {
831 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000832 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000833 }
John Brawna95c1a82015-05-08 12:52:18 +0000834
Renato Golin23459c62015-07-30 16:40:17 +0000835 // Add CPU features for generic CPUs
836 if (CPUName == "native") {
837 llvm::StringMap<bool> HostFeatures;
838 if (llvm::sys::getHostCPUFeatures(HostFeatures))
839 for (auto &F : HostFeatures)
840 Features.push_back(
841 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
842 }
843
844 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
845 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
846 if (WaFPU) {
847 if (FPUArg)
848 D.Diag(clang::diag::warn_drv_unused_argument)
849 << FPUArg->getAsString(Args);
850 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
851 Features);
852 } else if (FPUArg) {
853 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
854 }
855
856 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
857 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
858 if (WaHDiv) {
859 if (HDivArg)
860 D.Diag(clang::diag::warn_drv_unused_argument)
861 << HDivArg->getAsString(Args);
862 getARMHWDivFeatures(D, WaHDiv, Args,
863 StringRef(WaHDiv->getValue()).substr(8), Features);
864 } else if (HDivArg)
865 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
866
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000867 // Setting -msoft-float effectively disables NEON because of the GCC
868 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000869 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000870 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000871 // Also need to explicitly disable features which imply NEON.
872 Features.push_back("-crypto");
873 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000874
Eric Christopher269c2a22015-04-04 03:34:43 +0000875 // En/disable crc code generation.
876 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000877 if (A->getOption().matches(options::OPT_mcrc))
878 Features.push_back("+crc");
879 else
880 Features.push_back("-crc");
881 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000882
883 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
884 Features.insert(Features.begin(), "+v8.1a");
885 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000886
Akira Hatanakac2694822015-07-07 08:28:42 +0000887 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
888 // neither options are specified, see if we are compiling for kernel/kext and
889 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000890 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
891 options::OPT_mno_long_calls)) {
892 if (A->getOption().matches(options::OPT_mlong_calls))
893 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000894 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
895 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000896 Features.push_back("+long-calls");
897 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000898
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000899 // Kernel code has more strict alignment requirements.
900 if (KernelOrKext)
901 Features.push_back("+strict-align");
902 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
903 options::OPT_munaligned_access)) {
904 if (A->getOption().matches(options::OPT_munaligned_access)) {
905 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
906 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
907 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
908 } else
909 Features.push_back("+strict-align");
910 } else {
911 // Assume pre-ARMv6 doesn't support unaligned accesses.
912 //
913 // ARMv6 may or may not support unaligned accesses depending on the
914 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
915 // Darwin and NetBSD targets support unaligned accesses, and others don't.
916 //
917 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
918 // which raises an alignment fault on unaligned accesses. Linux
919 // defaults this bit to 0 and handles it as a system-wide (not
920 // per-process) setting. It is therefore safe to assume that ARMv7+
921 // Linux targets support unaligned accesses. The same goes for NaCl.
922 //
923 // The above behavior is consistent with GCC.
924 int VersionNum = getARMSubArchVersionNumber(Triple);
925 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000926 if (VersionNum < 6 ||
927 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000928 Features.push_back("+strict-align");
929 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
930 if (VersionNum < 7)
931 Features.push_back("+strict-align");
932 } else
933 Features.push_back("+strict-align");
934 }
935
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000936 // llvm does not support reserving registers in general. There is support
937 // for reserving r9 on ARM though (defined as a platform-specific register
938 // in ARM EABI).
939 if (Args.hasArg(options::OPT_ffixed_r9))
940 Features.push_back("+reserve-r9");
941
Dimitry Andric08107392016-01-06 07:42:18 +0000942 // The kext linker doesn't know how to deal with movw/movt.
943 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000944 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000945}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000946
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000947void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
948 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000950 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000951 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000953 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000954 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000955 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000956 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000957 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +0000958 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +0000959 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000960 } else {
961 ABIName = "apcs-gnu";
962 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000963 } else if (Triple.isOSWindows()) {
964 // FIXME: this is invalid for WindowsCE
965 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000966 } else {
967 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000968 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000969 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000970 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000971 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000972 ABIName = "aapcs-linux";
973 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000974 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000975 case llvm::Triple::EABI:
976 ABIName = "aapcs";
977 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000978 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000979 if (Triple.getOS() == llvm::Triple::NetBSD)
980 ABIName = "apcs-gnu";
981 else
982 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000983 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000984 }
985 }
986 CmdArgs.push_back("-target-abi");
987 CmdArgs.push_back(ABIName);
988
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000989 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000990 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000991 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000993 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000994 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000997 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000998 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000999 CmdArgs.push_back("-mfloat-abi");
1000 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001001 } else {
1002 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001003 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001004 CmdArgs.push_back("-mfloat-abi");
1005 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001006 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001007
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001008 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001009 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1010 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001011 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001012 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001013 CmdArgs.push_back("-arm-global-merge=false");
1014 else
1015 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001016 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001017
Bob Wilson9c8af452013-04-11 18:53:25 +00001018 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001019 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001020 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001021}
Renato Goline17c5802015-07-27 23:44:42 +00001022// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001023
Tim Northover573cbee2014-05-24 12:52:07 +00001024/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1025/// targeting.
1026static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001027 Arg *A;
1028 std::string CPU;
1029 // If we have -mtune or -mcpu, use that.
1030 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001031 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001032 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001033 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001034 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001035 }
1036
Kevin Qin110db6f2014-07-18 07:03:22 +00001037 // Handle CPU name is 'native'.
1038 if (CPU == "native")
1039 return llvm::sys::getHostCPUName();
1040 else if (CPU.size())
1041 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001042
James Molloy9b1586b2014-04-17 12:51:17 +00001043 // Make sure we pick "cyclone" if -arch is used.
1044 // FIXME: Should this be picked by checking the target triple instead?
1045 if (Args.getLastArg(options::OPT_arch))
1046 return "cyclone";
1047
1048 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001049}
1050
Tim Northover573cbee2014-05-24 12:52:07 +00001051void Clang::AddAArch64TargetArgs(const ArgList &Args,
1052 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001053 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1054 llvm::Triple Triple(TripleStr);
1055
1056 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1057 Args.hasArg(options::OPT_mkernel) ||
1058 Args.hasArg(options::OPT_fapple_kext))
1059 CmdArgs.push_back("-disable-red-zone");
1060
1061 if (!Args.hasFlag(options::OPT_mimplicit_float,
1062 options::OPT_mno_implicit_float, true))
1063 CmdArgs.push_back("-no-implicit-float");
1064
Craig Topper92fc2df2014-05-17 16:56:41 +00001065 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001066 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1067 ABIName = A->getValue();
1068 else if (Triple.isOSDarwin())
1069 ABIName = "darwinpcs";
1070 else
1071 ABIName = "aapcs";
1072
1073 CmdArgs.push_back("-target-abi");
1074 CmdArgs.push_back(ABIName);
1075
Bradley Smith9ff64332014-10-13 10:16:06 +00001076 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1077 options::OPT_mno_fix_cortex_a53_835769)) {
1078 CmdArgs.push_back("-backend-option");
1079 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1080 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1081 else
1082 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001083 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001084 // Enabled A53 errata (835769) workaround by default on android
1085 CmdArgs.push_back("-backend-option");
1086 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001087 }
1088
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001089 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001090 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1091 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001092 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001093 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001094 CmdArgs.push_back("-aarch64-global-merge=false");
1095 else
1096 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001097 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001098}
1099
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001100// Get CPU and ABI names. They are not independent
1101// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001102void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1103 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001104 const char *DefMips32CPU = "mips32r2";
1105 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001106
Daniel Sanders2bf13662014-07-10 14:40:57 +00001107 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1108 // default for mips64(el)?-img-linux-gnu.
1109 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1110 Triple.getEnvironment() == llvm::Triple::GNU) {
1111 DefMips32CPU = "mips32r6";
1112 DefMips64CPU = "mips64r6";
1113 }
Renato Golin7c542b42015-07-27 23:44:45 +00001114
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001115 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001116 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001117 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001118
Brad Smithba26f582015-01-06 02:53:17 +00001119 // MIPS3 is the default for mips64*-unknown-openbsd.
1120 if (Triple.getOS() == llvm::Triple::OpenBSD)
1121 DefMips64CPU = "mips3";
1122
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001123 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001124 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001125
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001126 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001127 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001128 // Convert a GNU style Mips ABI name to the name
1129 // accepted by LLVM Mips backend.
1130 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001131 .Case("32", "o32")
1132 .Case("64", "n64")
1133 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001134 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001135
1136 // Setup default CPU and ABI names.
1137 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001138 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001139 default:
1140 llvm_unreachable("Unexpected triple arch name");
1141 case llvm::Triple::mips:
1142 case llvm::Triple::mipsel:
1143 CPUName = DefMips32CPU;
1144 break;
1145 case llvm::Triple::mips64:
1146 case llvm::Triple::mips64el:
1147 CPUName = DefMips64CPU;
1148 break;
1149 }
1150 }
1151
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001152 if (ABIName.empty()) {
1153 // Deduce ABI name from the target triple.
1154 if (Triple.getArch() == llvm::Triple::mips ||
1155 Triple.getArch() == llvm::Triple::mipsel)
1156 ABIName = "o32";
1157 else
1158 ABIName = "n64";
1159 }
1160
1161 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001162 // Deduce CPU name from ABI name.
1163 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001164 .Cases("o32", "eabi", DefMips32CPU)
1165 .Cases("n32", "n64", DefMips64CPU)
1166 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001167 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001168
1169 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170}
1171
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001172std::string mips::getMipsABILibSuffix(const ArgList &Args,
1173 const llvm::Triple &Triple) {
1174 StringRef CPUName, ABIName;
1175 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1176 return llvm::StringSwitch<std::string>(ABIName)
1177 .Case("o32", "")
1178 .Case("n32", "32")
1179 .Case("n64", "64");
1180}
1181
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001182// Convert ABI name to the GNU tools acceptable variant.
1183static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1184 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001185 .Case("o32", "32")
1186 .Case("n64", "64")
1187 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001188}
1189
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001190// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1191// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001192static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1193 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001194 if (Arg *A =
1195 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1196 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001197 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001198 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001199 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001200 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001201 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001202 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1203 .Case("soft", mips::FloatABI::Soft)
1204 .Case("hard", mips::FloatABI::Hard)
1205 .Default(mips::FloatABI::Invalid);
1206 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001207 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001208 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001209 }
1210 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001211 }
1212
1213 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001214 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001215 // Assume "hard", because it's a default value used by gcc.
1216 // When we start to recognize specific target MIPS processors,
1217 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001218 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001219 }
1220
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001221 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1222 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001223}
1224
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001225static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001226 std::vector<const char *> &Features,
1227 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001228 StringRef FeatureName) {
1229 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001230 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001231 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001232 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001233 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001234 }
1235}
1236
Daniel Sanders379d44b2014-07-16 11:52:23 +00001237static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1238 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001239 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001240 StringRef CPUName;
1241 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001242 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001243 ABIName = getGnuCompatibleMipsABIName(ABIName);
1244
Daniel Sandersfeb61302014-08-08 15:47:17 +00001245 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1246 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001247
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001248 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1249 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001250 // FIXME: Note, this is a hack. We need to pass the selected float
1251 // mode to the MipsTargetInfoBase to define appropriate macros there.
1252 // Now it is the only method.
1253 Features.push_back("+soft-float");
1254 }
1255
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001256 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001257 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001258 if (Val == "2008") {
1259 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1260 Features.push_back("+nan2008");
1261 else {
1262 Features.push_back("-nan2008");
1263 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1264 }
1265 } else if (Val == "legacy") {
1266 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1267 Features.push_back("-nan2008");
1268 else {
1269 Features.push_back("+nan2008");
1270 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1271 }
1272 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001273 D.Diag(diag::err_drv_unsupported_option_argument)
1274 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001275 }
1276
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001277 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1278 options::OPT_mdouble_float, "single-float");
1279 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1280 "mips16");
1281 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1282 options::OPT_mno_micromips, "micromips");
1283 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1284 "dsp");
1285 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1286 "dspr2");
1287 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1288 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001289
1290 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1291 // pass -mfpxx
1292 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1293 options::OPT_mfp64)) {
1294 if (A->getOption().matches(options::OPT_mfp32))
1295 Features.push_back(Args.MakeArgString("-fp64"));
1296 else if (A->getOption().matches(options::OPT_mfpxx)) {
1297 Features.push_back(Args.MakeArgString("+fpxx"));
1298 Features.push_back(Args.MakeArgString("+nooddspreg"));
1299 } else
1300 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001301 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001302 Features.push_back(Args.MakeArgString("+fpxx"));
1303 Features.push_back(Args.MakeArgString("+nooddspreg"));
1304 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305
Daniel Sanders28e5d392014-07-10 10:39:51 +00001306 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1307 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001308}
1309
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001310void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001311 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001312 const Driver &D = getToolChain().getDriver();
1313 StringRef CPUName;
1314 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001315 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001316 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001317
1318 CmdArgs.push_back("-target-abi");
1319 CmdArgs.push_back(ABIName.data());
1320
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001321 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1322 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001324 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001325 CmdArgs.push_back("-mfloat-abi");
1326 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001327 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001328 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001329 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001330 CmdArgs.push_back("-mfloat-abi");
1331 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001332 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001333
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001334 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1335 if (A->getOption().matches(options::OPT_mxgot)) {
1336 CmdArgs.push_back("-mllvm");
1337 CmdArgs.push_back("-mxgot");
1338 }
1339 }
1340
Simon Atanasyanc580b322013-05-11 06:33:44 +00001341 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1342 options::OPT_mno_ldc1_sdc1)) {
1343 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1344 CmdArgs.push_back("-mllvm");
1345 CmdArgs.push_back("-mno-ldc1-sdc1");
1346 }
1347 }
1348
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001349 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1350 options::OPT_mno_check_zero_division)) {
1351 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1352 CmdArgs.push_back("-mllvm");
1353 CmdArgs.push_back("-mno-check-zero-division");
1354 }
1355 }
1356
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001357 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001358 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001359 CmdArgs.push_back("-mllvm");
1360 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1361 A->claim();
1362 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001363}
1364
Hal Finkel8eb59282012-06-11 22:35:19 +00001365/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1366static std::string getPPCTargetCPU(const ArgList &Args) {
1367 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001368 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001369
1370 if (CPUName == "native") {
1371 std::string CPU = llvm::sys::getHostCPUName();
1372 if (!CPU.empty() && CPU != "generic")
1373 return CPU;
1374 else
1375 return "";
1376 }
1377
1378 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001379 .Case("common", "generic")
1380 .Case("440", "440")
1381 .Case("440fp", "440")
1382 .Case("450", "450")
1383 .Case("601", "601")
1384 .Case("602", "602")
1385 .Case("603", "603")
1386 .Case("603e", "603e")
1387 .Case("603ev", "603ev")
1388 .Case("604", "604")
1389 .Case("604e", "604e")
1390 .Case("620", "620")
1391 .Case("630", "pwr3")
1392 .Case("G3", "g3")
1393 .Case("7400", "7400")
1394 .Case("G4", "g4")
1395 .Case("7450", "7450")
1396 .Case("G4+", "g4+")
1397 .Case("750", "750")
1398 .Case("970", "970")
1399 .Case("G5", "g5")
1400 .Case("a2", "a2")
1401 .Case("a2q", "a2q")
1402 .Case("e500mc", "e500mc")
1403 .Case("e5500", "e5500")
1404 .Case("power3", "pwr3")
1405 .Case("power4", "pwr4")
1406 .Case("power5", "pwr5")
1407 .Case("power5x", "pwr5x")
1408 .Case("power6", "pwr6")
1409 .Case("power6x", "pwr6x")
1410 .Case("power7", "pwr7")
1411 .Case("power8", "pwr8")
1412 .Case("pwr3", "pwr3")
1413 .Case("pwr4", "pwr4")
1414 .Case("pwr5", "pwr5")
1415 .Case("pwr5x", "pwr5x")
1416 .Case("pwr6", "pwr6")
1417 .Case("pwr6x", "pwr6x")
1418 .Case("pwr7", "pwr7")
1419 .Case("pwr8", "pwr8")
1420 .Case("powerpc", "ppc")
1421 .Case("powerpc64", "ppc64")
1422 .Case("powerpc64le", "ppc64le")
1423 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001424 }
1425
1426 return "";
1427}
1428
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001429static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1430 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001431 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001432 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001433
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001434 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1435 if (FloatABI == ppc::FloatABI::Soft &&
1436 !(Triple.getArch() == llvm::Triple::ppc64 ||
1437 Triple.getArch() == llvm::Triple::ppc64le))
1438 Features.push_back("+soft-float");
1439 else if (FloatABI == ppc::FloatABI::Soft &&
1440 (Triple.getArch() == llvm::Triple::ppc64 ||
1441 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001442 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001443 << "soft float is not supported for ppc64";
1444
Eric Christopher643bb6a2013-10-16 20:40:08 +00001445 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001446 AddTargetFeature(Args, Features, options::OPT_faltivec,
1447 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001448}
1449
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001450ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1451 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1452 if (Arg *A =
1453 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1454 options::OPT_mfloat_abi_EQ)) {
1455 if (A->getOption().matches(options::OPT_msoft_float))
1456 ABI = ppc::FloatABI::Soft;
1457 else if (A->getOption().matches(options::OPT_mhard_float))
1458 ABI = ppc::FloatABI::Hard;
1459 else {
1460 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1461 .Case("soft", ppc::FloatABI::Soft)
1462 .Case("hard", ppc::FloatABI::Hard)
1463 .Default(ppc::FloatABI::Invalid);
1464 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1465 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1466 ABI = ppc::FloatABI::Hard;
1467 }
1468 }
1469 }
1470
1471 // If unspecified, choose the default based on the platform.
1472 if (ABI == ppc::FloatABI::Invalid) {
1473 ABI = ppc::FloatABI::Hard;
1474 }
1475
1476 return ABI;
1477}
1478
Ulrich Weigand8afad612014-07-28 13:17:52 +00001479void Clang::AddPPCTargetArgs(const ArgList &Args,
1480 ArgStringList &CmdArgs) const {
1481 // Select the ABI to use.
1482 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001483 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001484 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001485 case llvm::Triple::ppc64: {
1486 // When targeting a processor that supports QPX, or if QPX is
1487 // specifically enabled, default to using the ABI that supports QPX (so
1488 // long as it is not specifically disabled).
1489 bool HasQPX = false;
1490 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1491 HasQPX = A->getValue() == StringRef("a2q");
1492 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1493 if (HasQPX) {
1494 ABIName = "elfv1-qpx";
1495 break;
1496 }
1497
Ulrich Weigand8afad612014-07-28 13:17:52 +00001498 ABIName = "elfv1";
1499 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001500 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001501 case llvm::Triple::ppc64le:
1502 ABIName = "elfv2";
1503 break;
1504 default:
1505 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001506 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001507
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001508 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1509 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1510 // the option if given as we don't have backend support for any targets
1511 // that don't use the altivec abi.
1512 if (StringRef(A->getValue()) != "altivec")
1513 ABIName = A->getValue();
1514
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001515 ppc::FloatABI FloatABI =
1516 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1517
1518 if (FloatABI == ppc::FloatABI::Soft) {
1519 // Floating point operations and argument passing are soft.
1520 CmdArgs.push_back("-msoft-float");
1521 CmdArgs.push_back("-mfloat-abi");
1522 CmdArgs.push_back("soft");
1523 } else {
1524 // Floating point operations and argument passing are hard.
1525 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1526 CmdArgs.push_back("-mfloat-abi");
1527 CmdArgs.push_back("hard");
1528 }
1529
Ulrich Weigand8afad612014-07-28 13:17:52 +00001530 if (ABIName) {
1531 CmdArgs.push_back("-target-abi");
1532 CmdArgs.push_back(ABIName);
1533 }
1534}
1535
1536bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1537 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1538 return A && (A->getValue() == StringRef(Value));
1539}
1540
Tom Stellard6674c702013-04-01 20:56:53 +00001541/// Get the (LLVM) name of the R600 gpu we are targeting.
1542static std::string getR600TargetGPU(const ArgList &Args) {
1543 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001544 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001545 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 .Cases("rv630", "rv635", "r600")
1547 .Cases("rv610", "rv620", "rs780", "rs880")
1548 .Case("rv740", "rv770")
1549 .Case("palm", "cedar")
1550 .Cases("sumo", "sumo2", "sumo")
1551 .Case("hemlock", "cypress")
1552 .Case("aruba", "cayman")
1553 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001554 }
1555 return "";
1556}
1557
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001558void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001559 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001560 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001561 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001562
James Y Knightb2406522015-06-15 20:51:24 +00001563 bool SoftFloatABI = false;
1564 if (Arg *A =
1565 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001566 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001567 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001568 }
1569
James Y Knightb2406522015-06-15 20:51:24 +00001570 // Only the hard-float ABI on Sparc is standardized, and it is the
1571 // default. GCC also supports a nonstandard soft-float ABI mode, and
1572 // perhaps LLVM should implement that, too. However, since llvm
1573 // currently does not support Sparc soft-float, at all, display an
1574 // error if it's requested.
1575 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001576 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1577 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001578 }
1579}
1580
Richard Sandiford4652d892013-07-19 16:51:51 +00001581static const char *getSystemZTargetCPU(const ArgList &Args) {
1582 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1583 return A->getValue();
1584 return "z10";
1585}
1586
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001587static void getSystemZTargetFeatures(const ArgList &Args,
1588 std::vector<const char *> &Features) {
1589 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001590 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001591 if (A->getOption().matches(options::OPT_mhtm))
1592 Features.push_back("+transactional-execution");
1593 else
1594 Features.push_back("-transactional-execution");
1595 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001596 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001597 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001598 if (A->getOption().matches(options::OPT_mvx))
1599 Features.push_back("+vector");
1600 else
1601 Features.push_back("-vector");
1602 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001603}
1604
Chandler Carruth953fb082013-01-13 11:46:33 +00001605static const char *getX86TargetCPU(const ArgList &Args,
1606 const llvm::Triple &Triple) {
1607 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001608 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001609 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001610 return "core-avx2";
1611
Chandler Carruth953fb082013-01-13 11:46:33 +00001612 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001613 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001614
1615 // FIXME: Reject attempts to use -march=native unless the target matches
1616 // the host.
1617 //
1618 // FIXME: We should also incorporate the detected target features for use
1619 // with -native.
1620 std::string CPU = llvm::sys::getHostCPUName();
1621 if (!CPU.empty() && CPU != "generic")
1622 return Args.MakeArgString(CPU);
1623 }
1624
Reid Kleckner3123eff2015-06-30 16:32:04 +00001625 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1626 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1627 StringRef Arch = A->getValue();
1628 const char *CPU;
1629 if (Triple.getArch() == llvm::Triple::x86) {
1630 CPU = llvm::StringSwitch<const char *>(Arch)
1631 .Case("IA32", "i386")
1632 .Case("SSE", "pentium3")
1633 .Case("SSE2", "pentium4")
1634 .Case("AVX", "sandybridge")
1635 .Case("AVX2", "haswell")
1636 .Default(nullptr);
1637 } else {
1638 CPU = llvm::StringSwitch<const char *>(Arch)
1639 .Case("AVX", "sandybridge")
1640 .Case("AVX2", "haswell")
1641 .Default(nullptr);
1642 }
1643 if (CPU)
1644 return CPU;
1645 }
1646
Chandler Carruth953fb082013-01-13 11:46:33 +00001647 // Select the default CPU if none was given (or detection failed).
1648
1649 if (Triple.getArch() != llvm::Triple::x86_64 &&
1650 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001651 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001652
1653 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1654
1655 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001656 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001657 if (Triple.getArchName() == "x86_64h")
1658 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001659 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001660 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001661
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001662 // Set up default CPU name for PS4 compilers.
1663 if (Triple.isPS4CPU())
1664 return "btver2";
1665
Alexey Bataev286d1b92014-01-31 04:07:13 +00001666 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001667 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001668 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001669
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001670 // Everything else goes to x86-64 in 64-bit mode.
1671 if (Is64Bit)
1672 return "x86-64";
1673
1674 switch (Triple.getOS()) {
1675 case llvm::Triple::FreeBSD:
1676 case llvm::Triple::NetBSD:
1677 case llvm::Triple::OpenBSD:
1678 return "i486";
1679 case llvm::Triple::Haiku:
1680 return "i586";
1681 case llvm::Triple::Bitrig:
1682 return "i686";
1683 default:
1684 // Fallback to p4.
1685 return "pentium4";
1686 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001687}
1688
Dan Gohmanc2853072015-09-03 22:51:53 +00001689/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1690static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1691 // If we have -mcpu=, use that.
1692 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1693 StringRef CPU = A->getValue();
1694
1695#ifdef __wasm__
1696 // Handle "native" by examining the host. "native" isn't meaningful when
1697 // cross compiling, so only support this when the host is also WebAssembly.
1698 if (CPU == "native")
1699 return llvm::sys::getHostCPUName();
1700#endif
1701
1702 return CPU;
1703 }
1704
1705 return "generic";
1706}
1707
Renato Golin7c542b42015-07-27 23:44:45 +00001708static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1709 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001710 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001711 default:
1712 return "";
1713
Amara Emerson703da2e2013-10-31 09:32:33 +00001714 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001715 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001716 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001717
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001718 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001719 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001720 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001721 case llvm::Triple::thumbeb: {
1722 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001723 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001724 return arm::getARMTargetCPU(MCPU, MArch, T);
1725 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001726 case llvm::Triple::mips:
1727 case llvm::Triple::mipsel:
1728 case llvm::Triple::mips64:
1729 case llvm::Triple::mips64el: {
1730 StringRef CPUName;
1731 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001732 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001733 return CPUName;
1734 }
1735
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001736 case llvm::Triple::nvptx:
1737 case llvm::Triple::nvptx64:
1738 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1739 return A->getValue();
1740 return "";
1741
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001742 case llvm::Triple::ppc:
1743 case llvm::Triple::ppc64:
1744 case llvm::Triple::ppc64le: {
1745 std::string TargetCPUName = getPPCTargetCPU(Args);
1746 // LLVM may default to generating code for the native CPU,
1747 // but, like gcc, we default to a more generic option for
1748 // each architecture. (except on Darwin)
1749 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1750 if (T.getArch() == llvm::Triple::ppc64)
1751 TargetCPUName = "ppc64";
1752 else if (T.getArch() == llvm::Triple::ppc64le)
1753 TargetCPUName = "ppc64le";
1754 else
1755 TargetCPUName = "ppc";
1756 }
1757 return TargetCPUName;
1758 }
1759
1760 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001761 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001762 case llvm::Triple::sparcv9:
1763 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001764 return A->getValue();
1765 return "";
1766
1767 case llvm::Triple::x86:
1768 case llvm::Triple::x86_64:
1769 return getX86TargetCPU(Args, T);
1770
1771 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001772 return "hexagon" +
1773 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001774
1775 case llvm::Triple::systemz:
1776 return getSystemZTargetCPU(Args);
1777
1778 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001779 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001780 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001781
1782 case llvm::Triple::wasm32:
1783 case llvm::Triple::wasm64:
1784 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001785 }
1786}
1787
Alp Tokerce365ca2013-12-02 12:43:03 +00001788static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001789 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001790 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1791 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1792 // forward.
1793 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001794 std::string Plugin =
1795 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001796 CmdArgs.push_back(Args.MakeArgString(Plugin));
1797
1798 // Try to pass driver level flags relevant to LTO code generation down to
1799 // the plugin.
1800
1801 // Handle flags for selecting CPU variants.
1802 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1803 if (!CPU.empty())
1804 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001805
James Molloyf97fdae2015-12-21 10:44:36 +00001806 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1807 StringRef OOpt;
1808 if (A->getOption().matches(options::OPT_O4) ||
1809 A->getOption().matches(options::OPT_Ofast))
1810 OOpt = "3";
1811 else if (A->getOption().matches(options::OPT_O))
1812 OOpt = A->getValue();
1813 else if (A->getOption().matches(options::OPT_O0))
1814 OOpt = "0";
1815 if (!OOpt.empty())
1816 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1817 }
1818
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001819 if (IsThinLTO)
1820 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001821
1822 // If an explicit debugger tuning argument appeared, pass it along.
1823 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1824 options::OPT_ggdbN_Group)) {
1825 if (A->getOption().matches(options::OPT_glldb))
1826 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1827 else if (A->getOption().matches(options::OPT_gsce))
1828 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1829 else
1830 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1831 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001832}
1833
Sanjay Patel2987c292015-06-11 14:53:41 +00001834/// This is a helper function for validating the optional refinement step
1835/// parameter in reciprocal argument strings. Return false if there is an error
1836/// parsing the refinement step. Otherwise, return true and set the Position
1837/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001838static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001839 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001840 const char RefinementStepToken = ':';
1841 Position = In.find(RefinementStepToken);
1842 if (Position != StringRef::npos) {
1843 StringRef Option = A.getOption().getName();
1844 StringRef RefStep = In.substr(Position + 1);
1845 // Allow exactly one numeric character for the additional refinement
1846 // step parameter. This is reasonable for all currently-supported
1847 // operations and architectures because we would expect that a larger value
1848 // of refinement steps would cause the estimate "optimization" to
1849 // under-perform the native operation. Also, if the estimate does not
1850 // converge quickly, it probably will not ever converge, so further
1851 // refinement steps will not produce a better answer.
1852 if (RefStep.size() != 1) {
1853 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1854 return false;
1855 }
1856 char RefStepChar = RefStep[0];
1857 if (RefStepChar < '0' || RefStepChar > '9') {
1858 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1859 return false;
1860 }
1861 }
1862 return true;
1863}
1864
1865/// The -mrecip flag requires processing of many optional parameters.
1866static void ParseMRecip(const Driver &D, const ArgList &Args,
1867 ArgStringList &OutStrings) {
1868 StringRef DisabledPrefixIn = "!";
1869 StringRef DisabledPrefixOut = "!";
1870 StringRef EnabledPrefixOut = "";
1871 StringRef Out = "-mrecip=";
1872
1873 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1874 if (!A)
1875 return;
1876
1877 unsigned NumOptions = A->getNumValues();
1878 if (NumOptions == 0) {
1879 // No option is the same as "all".
1880 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1881 return;
1882 }
1883
1884 // Pass through "all", "none", or "default" with an optional refinement step.
1885 if (NumOptions == 1) {
1886 StringRef Val = A->getValue(0);
1887 size_t RefStepLoc;
1888 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1889 return;
1890 StringRef ValBase = Val.slice(0, RefStepLoc);
1891 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1892 OutStrings.push_back(Args.MakeArgString(Out + Val));
1893 return;
1894 }
1895 }
1896
1897 // Each reciprocal type may be enabled or disabled individually.
1898 // Check each input value for validity, concatenate them all back together,
1899 // and pass through.
1900
1901 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001902 OptionStrings.insert(std::make_pair("divd", false));
1903 OptionStrings.insert(std::make_pair("divf", false));
1904 OptionStrings.insert(std::make_pair("vec-divd", false));
1905 OptionStrings.insert(std::make_pair("vec-divf", false));
1906 OptionStrings.insert(std::make_pair("sqrtd", false));
1907 OptionStrings.insert(std::make_pair("sqrtf", false));
1908 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1909 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001910
1911 for (unsigned i = 0; i != NumOptions; ++i) {
1912 StringRef Val = A->getValue(i);
1913
1914 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1915 // Ignore the disablement token for string matching.
1916 if (IsDisabled)
1917 Val = Val.substr(1);
1918
1919 size_t RefStep;
1920 if (!getRefinementStep(Val, D, *A, RefStep))
1921 return;
1922
1923 StringRef ValBase = Val.slice(0, RefStep);
1924 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1925 if (OptionIter == OptionStrings.end()) {
1926 // Try again specifying float suffix.
1927 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1928 if (OptionIter == OptionStrings.end()) {
1929 // The input name did not match any known option string.
1930 D.Diag(diag::err_drv_unknown_argument) << Val;
1931 return;
1932 }
1933 // The option was specified without a float or double suffix.
1934 // Make sure that the double entry was not already specified.
1935 // The float entry will be checked below.
1936 if (OptionStrings[ValBase.str() + 'd']) {
1937 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1938 return;
1939 }
1940 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001941
Sanjay Patel2987c292015-06-11 14:53:41 +00001942 if (OptionIter->second == true) {
1943 // Duplicate option specified.
1944 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1945 return;
1946 }
1947
1948 // Mark the matched option as found. Do not allow duplicate specifiers.
1949 OptionIter->second = true;
1950
1951 // If the precision was not specified, also mark the double entry as found.
1952 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1953 OptionStrings[ValBase.str() + 'd'] = true;
1954
1955 // Build the output string.
1956 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1957 Out = Args.MakeArgString(Out + Prefix + Val);
1958 if (i != NumOptions - 1)
1959 Out = Args.MakeArgString(Out + ",");
1960 }
1961
1962 OutStrings.push_back(Args.MakeArgString(Out));
1963}
1964
Eric Christopherc54920a2015-03-23 19:26:05 +00001965static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001966 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001967 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001968 // If -march=native, autodetect the feature list.
1969 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1970 if (StringRef(A->getValue()) == "native") {
1971 llvm::StringMap<bool> HostFeatures;
1972 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1973 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001974 Features.push_back(
1975 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001976 }
1977 }
1978
Jim Grosbach82eee262013-11-16 00:53:35 +00001979 if (Triple.getArchName() == "x86_64h") {
1980 // x86_64h implies quite a few of the more modern subtarget features
1981 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1982 Features.push_back("-rdrnd");
1983 Features.push_back("-aes");
1984 Features.push_back("-pclmul");
1985 Features.push_back("-rtm");
1986 Features.push_back("-hle");
1987 Features.push_back("-fsgsbase");
1988 }
1989
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001990 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001991 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001992 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001993 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001994 Features.push_back("+sse4.2");
1995 Features.push_back("+popcnt");
1996 } else
1997 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001998 }
1999
Eric Christopherc54920a2015-03-23 19:26:05 +00002000 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002001 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2002 StringRef Arch = A->getValue();
2003 bool ArchUsed = false;
2004 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002005 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002006 if (Arch == "AVX" || Arch == "AVX2") {
2007 ArchUsed = true;
2008 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2009 }
2010 }
2011 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002012 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002013 if (Arch == "IA32") {
2014 ArchUsed = true;
2015 } else if (Arch == "SSE" || Arch == "SSE2") {
2016 ArchUsed = true;
2017 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2018 }
2019 }
2020 if (!ArchUsed)
2021 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2022 }
2023
Jim Grosbach82eee262013-11-16 00:53:35 +00002024 // Now add any that the user explicitly requested on the command line,
2025 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002026 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002027}
2028
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002029void Clang::AddX86TargetArgs(const ArgList &Args,
2030 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002031 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002032 Args.hasArg(options::OPT_mkernel) ||
2033 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002034 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002035
Bob Wilson2616e2e2013-02-10 16:01:41 +00002036 // Default to avoid implicit floating-point for kernel/kext code, but allow
2037 // that to be overridden with -mno-soft-float.
2038 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2039 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002040 if (Arg *A = Args.getLastArg(
2041 options::OPT_msoft_float, options::OPT_mno_soft_float,
2042 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002043 const Option &O = A->getOption();
2044 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2045 O.matches(options::OPT_msoft_float));
2046 }
2047 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002048 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002049
2050 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2051 StringRef Value = A->getValue();
2052 if (Value == "intel" || Value == "att") {
2053 CmdArgs.push_back("-mllvm");
2054 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2055 } else {
2056 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2057 << A->getOption().getName() << Value;
2058 }
2059 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002060}
2061
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062void Clang::AddHexagonTargetArgs(const ArgList &Args,
2063 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002064 CmdArgs.push_back("-mqdsp6-compat");
2065 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002066
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002067 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2068 std::string N = llvm::utostr(G.getValue());
2069 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002070 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002071 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002072 }
2073
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002074 if (!Args.hasArg(options::OPT_fno_short_enums))
2075 CmdArgs.push_back("-fshort-enums");
2076 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002077 CmdArgs.push_back("-mllvm");
2078 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002079 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002080 CmdArgs.push_back("-mllvm");
2081 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002082}
2083
Dan Gohmane3d71e12016-01-07 01:00:21 +00002084void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2085 ArgStringList &CmdArgs) const {
2086 // Default to "hidden" visibility.
2087 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2088 options::OPT_fvisibility_ms_compat)) {
2089 CmdArgs.push_back("-fvisibility");
2090 CmdArgs.push_back("hidden");
2091 }
2092}
2093
Kevin Qin110db6f2014-07-18 07:03:22 +00002094// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002095static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 std::vector<const char *> &Features) {
2097 SmallVector<StringRef, 8> Split;
2098 text.split(Split, StringRef("+"), -1, false);
2099
Benjamin Kramer72e64312015-09-24 14:48:49 +00002100 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002101 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002102 .Case("fp", "+fp-armv8")
2103 .Case("simd", "+neon")
2104 .Case("crc", "+crc")
2105 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002106 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002107 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002108 .Case("nofp", "-fp-armv8")
2109 .Case("nosimd", "-neon")
2110 .Case("nocrc", "-crc")
2111 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002112 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002113 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 .Default(nullptr);
2115 if (result)
2116 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002117 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002118 D.Diag(diag::err_drv_no_neon_modifier);
2119 else
2120 return false;
2121 }
2122 return true;
2123}
2124
2125// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2126// decode CPU and feature.
2127static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2128 std::vector<const char *> &Features) {
2129 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2130 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002131 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002132 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002133 Features.push_back("+neon");
2134 Features.push_back("+crc");
2135 Features.push_back("+crypto");
2136 } else if (CPU == "generic") {
2137 Features.push_back("+neon");
2138 } else {
2139 return false;
2140 }
2141
2142 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2143 return false;
2144
2145 return true;
2146}
2147
2148static bool
2149getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2150 const ArgList &Args,
2151 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002152 std::string MarchLowerCase = March.lower();
2153 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002156 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002158 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002159 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2160 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002161 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002162 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002163 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002164
2165 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
2175 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002176 std::string McpuLowerCase = Mcpu.lower();
2177 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002178 return false;
2179
2180 return true;
2181}
2182
2183static bool
2184getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2185 const ArgList &Args,
2186 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002187 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002188 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002189 if (MtuneLowerCase == "native")
2190 MtuneLowerCase = llvm::sys::getHostCPUName();
2191 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002192 Features.push_back("+zcm");
2193 Features.push_back("+zcz");
2194 }
2195 return true;
2196}
2197
2198static bool
2199getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2200 const ArgList &Args,
2201 std::vector<const char *> &Features) {
2202 StringRef CPU;
2203 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002204 std::string McpuLowerCase = Mcpu.lower();
2205 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 return false;
2207
2208 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2209}
2210
Justin Bognerf9052562015-11-13 23:07:31 +00002211static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002212 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002213 Arg *A;
2214 bool success = true;
2215 // Enable NEON by default.
2216 Features.push_back("+neon");
2217 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2218 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2219 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2220 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002221 else if (Args.hasArg(options::OPT_arch))
2222 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2223 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002224
2225 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2226 success =
2227 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2228 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2229 success =
2230 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002231 else if (Args.hasArg(options::OPT_arch))
2232 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2233 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002234
2235 if (!success)
2236 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002237
2238 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2239 Features.push_back("-fp-armv8");
2240 Features.push_back("-crypto");
2241 Features.push_back("-neon");
2242 }
Bradley Smith418c5932014-05-02 15:17:51 +00002243
2244 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002246 if (A->getOption().matches(options::OPT_mcrc))
2247 Features.push_back("+crc");
2248 else
2249 Features.push_back("-crc");
2250 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002251
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002252 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2253 options::OPT_munaligned_access))
2254 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2255 Features.push_back("+strict-align");
2256
Justin Bognerf9052562015-11-13 23:07:31 +00002257 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002258 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002259}
2260
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002261static void getHexagonTargetFeatures(const ArgList &Args,
2262 std::vector<const char *> &Features) {
2263 bool HasHVX = false, HasHVXD = false;
2264
Eric Christopher49062a52015-12-22 03:12:34 +00002265 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2266 // doing dependent option handling here rather than in initFeatureMap or a
2267 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002268 for (auto &A : Args) {
2269 auto &Opt = A->getOption();
2270 if (Opt.matches(options::OPT_mhexagon_hvx))
2271 HasHVX = true;
2272 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2273 HasHVXD = HasHVX = false;
2274 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2275 HasHVXD = HasHVX = true;
2276 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2277 HasHVXD = false;
2278 else
2279 continue;
2280 A->claim();
2281 }
2282
2283 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2284 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2285}
2286
Dan Gohmanc2853072015-09-03 22:51:53 +00002287static void getWebAssemblyTargetFeatures(const ArgList &Args,
2288 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002289 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002290}
2291
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002292static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002293 const ArgList &Args, ArgStringList &CmdArgs,
2294 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002295 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002296 std::vector<const char *> Features;
2297 switch (Triple.getArch()) {
2298 default:
2299 break;
2300 case llvm::Triple::mips:
2301 case llvm::Triple::mipsel:
2302 case llvm::Triple::mips64:
2303 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002304 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002305 break;
2306
2307 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002308 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002309 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002310 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002311 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002312 break;
2313
2314 case llvm::Triple::ppc:
2315 case llvm::Triple::ppc64:
2316 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002317 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002318 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002319 case llvm::Triple::systemz:
2320 getSystemZTargetFeatures(Args, Features);
2321 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002322 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002323 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002324 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 break;
2326 case llvm::Triple::x86:
2327 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002328 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002329 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002330 case llvm::Triple::hexagon:
2331 getHexagonTargetFeatures(Args, Features);
2332 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002333 case llvm::Triple::wasm32:
2334 case llvm::Triple::wasm64:
2335 getWebAssemblyTargetFeatures(Args, Features);
2336 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002337 }
Rafael Espindola43964802013-08-21 17:34:32 +00002338
2339 // Find the last of each feature.
2340 llvm::StringMap<unsigned> LastOpt;
2341 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2342 const char *Name = Features[I];
2343 assert(Name[0] == '-' || Name[0] == '+');
2344 LastOpt[Name + 1] = I;
2345 }
2346
2347 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2348 // If this feature was overridden, ignore it.
2349 const char *Name = Features[I];
2350 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2351 assert(LastI != LastOpt.end());
2352 unsigned Last = LastI->second;
2353 if (Last != I)
2354 continue;
2355
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002356 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002357 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002358 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002359}
2360
David Majnemerae394812014-12-09 00:12:30 +00002361static bool
2362shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2363 const llvm::Triple &Triple) {
2364 // We use the zero-cost exception tables for Objective-C if the non-fragile
2365 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2366 // later.
2367 if (runtime.isNonFragile())
2368 return true;
2369
2370 if (!Triple.isMacOSX())
2371 return false;
2372
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002373 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002374 (Triple.getArch() == llvm::Triple::x86_64 ||
2375 Triple.getArch() == llvm::Triple::arm));
2376}
2377
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002378/// Adds exception related arguments to the driver command arguments. There's a
2379/// master flag, -fexceptions and also language specific flags to enable/disable
2380/// C++ and Objective-C exceptions. This makes it possible to for example
2381/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002382static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002383 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002384 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002385 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002386 const Driver &D = TC.getDriver();
2387 const llvm::Triple &Triple = TC.getTriple();
2388
Chad Rosier4fab82c2012-03-26 22:04:46 +00002389 if (KernelOrKext) {
2390 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2391 // arguments now to avoid warnings about unused arguments.
2392 Args.ClaimAllArgs(options::OPT_fexceptions);
2393 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2395 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2396 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2397 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002398 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002399 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002400
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002401 // See if the user explicitly enabled exceptions.
2402 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2403 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002404
David Majnemerae394812014-12-09 00:12:30 +00002405 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2406 // is not necessarily sensible, but follows GCC.
2407 if (types::isObjC(InputType) &&
2408 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002409 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002410 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002411
David Majnemerae394812014-12-09 00:12:30 +00002412 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002413 }
2414
2415 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002416 // Disable C++ EH by default on XCore, PS4, and MSVC.
2417 // FIXME: Remove MSVC from this list once things work.
2418 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2419 !Triple.isPS4CPU() &&
2420 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002421 Arg *ExceptionArg = Args.getLastArg(
2422 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2423 options::OPT_fexceptions, options::OPT_fno_exceptions);
2424 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002425 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002426 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2427 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002428
2429 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002430 if (Triple.isPS4CPU()) {
2431 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2432 assert(ExceptionArg &&
2433 "On the PS4 exceptions should only be enabled if passing "
2434 "an argument");
2435 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2436 const Arg *RTTIArg = TC.getRTTIArg();
2437 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2438 D.Diag(diag::err_drv_argument_not_allowed_with)
2439 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2440 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2441 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2442 } else
2443 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2444
Anders Carlssone96ab552011-02-28 02:27:16 +00002445 CmdArgs.push_back("-fcxx-exceptions");
2446
David Majnemer8de68642014-12-05 08:11:58 +00002447 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002448 }
2449 }
2450
David Majnemer8de68642014-12-05 08:11:58 +00002451 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002452 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002453}
2454
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002455static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002456 bool Default = true;
2457 if (TC.getTriple().isOSDarwin()) {
2458 // The native darwin assembler doesn't support the linker_option directives,
2459 // so we disable them if we think the .s file will be passed to it.
2460 Default = TC.useIntegratedAs();
2461 }
2462 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2463 Default);
2464}
2465
Ted Kremenek62093662013-03-12 17:02:12 +00002466static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2467 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002468 bool UseDwarfDirectory =
2469 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2470 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002471 return !UseDwarfDirectory;
2472}
2473
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002474/// \brief Check whether the given input tree contains any compilation actions.
2475static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002476 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002477 return true;
2478
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002479 for (const auto &Act : *A)
2480 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002481 return true;
2482
2483 return false;
2484}
2485
2486/// \brief Check if -relax-all should be passed to the internal assembler.
2487/// This is done by default when compiling non-assembler source with -O0.
2488static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2489 bool RelaxDefault = true;
2490
2491 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2492 RelaxDefault = A->getOption().matches(options::OPT_O0);
2493
2494 if (RelaxDefault) {
2495 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002496 for (const auto &Act : C.getActions()) {
2497 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002498 RelaxDefault = true;
2499 break;
2500 }
2501 }
2502 }
2503
2504 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002505 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002506}
2507
Paul Robinson0334a042015-12-19 19:41:48 +00002508// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2509// to the corresponding DebugInfoKind.
2510static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2511 assert(A.getOption().matches(options::OPT_gN_Group) &&
2512 "Not a -g option that specifies a debug-info level");
2513 if (A.getOption().matches(options::OPT_g0) ||
2514 A.getOption().matches(options::OPT_ggdb0))
2515 return CodeGenOptions::NoDebugInfo;
2516 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2517 A.getOption().matches(options::OPT_ggdb1))
2518 return CodeGenOptions::DebugLineTablesOnly;
2519 return CodeGenOptions::LimitedDebugInfo;
2520}
2521
Douglas Katzman3459ce22015-10-08 04:24:12 +00002522// Extract the integer N from a string spelled "-dwarf-N", returning 0
2523// on mismatch. The StringRef input (rather than an Arg) allows
2524// for use by the "-Xassembler" option parser.
2525static unsigned DwarfVersionNum(StringRef ArgValue) {
2526 return llvm::StringSwitch<unsigned>(ArgValue)
2527 .Case("-gdwarf-2", 2)
2528 .Case("-gdwarf-3", 3)
2529 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002530 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002531 .Default(0);
2532}
2533
2534static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2535 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002536 unsigned DwarfVersion,
2537 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002538 switch (DebugInfoKind) {
2539 case CodeGenOptions::DebugLineTablesOnly:
2540 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2541 break;
2542 case CodeGenOptions::LimitedDebugInfo:
2543 CmdArgs.push_back("-debug-info-kind=limited");
2544 break;
2545 case CodeGenOptions::FullDebugInfo:
2546 CmdArgs.push_back("-debug-info-kind=standalone");
2547 break;
2548 default:
2549 break;
2550 }
2551 if (DwarfVersion > 0)
2552 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002553 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002554 switch (DebuggerTuning) {
2555 case llvm::DebuggerKind::GDB:
2556 CmdArgs.push_back("-debugger-tuning=gdb");
2557 break;
2558 case llvm::DebuggerKind::LLDB:
2559 CmdArgs.push_back("-debugger-tuning=lldb");
2560 break;
2561 case llvm::DebuggerKind::SCE:
2562 CmdArgs.push_back("-debugger-tuning=sce");
2563 break;
2564 default:
2565 break;
2566 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002567}
2568
David Blaikie9260ed62013-07-25 21:19:01 +00002569static void CollectArgsForIntegratedAssembler(Compilation &C,
2570 const ArgList &Args,
2571 ArgStringList &CmdArgs,
2572 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 if (UseRelaxAll(C, Args))
2574 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002575
David Majnemer2b9349d2015-12-21 22:09:34 +00002576 // Only default to -mincremental-linker-compatible if we think we are
2577 // targeting the MSVC linker.
2578 bool DefaultIncrementalLinkerCompatible =
2579 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2580 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2581 options::OPT_mno_incremental_linker_compatible,
2582 DefaultIncrementalLinkerCompatible))
2583 CmdArgs.push_back("-mincremental-linker-compatible");
2584
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002585 // When passing -I arguments to the assembler we sometimes need to
2586 // unconditionally take the next argument. For example, when parsing
2587 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2588 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2589 // arg after parsing the '-I' arg.
2590 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002592 // When using an integrated assembler, translate -Wa, and -Xassembler
2593 // options.
2594 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002595 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002596 for (const Arg *A :
2597 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2598 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002599
Benjamin Kramer72e64312015-09-24 14:48:49 +00002600 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002601 if (TakeNextArg) {
2602 CmdArgs.push_back(Value.data());
2603 TakeNextArg = false;
2604 continue;
2605 }
David Blaikie9260ed62013-07-25 21:19:01 +00002606
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002607 switch (C.getDefaultToolChain().getArch()) {
2608 default:
2609 break;
2610 case llvm::Triple::mips:
2611 case llvm::Triple::mipsel:
2612 case llvm::Triple::mips64:
2613 case llvm::Triple::mips64el:
2614 if (Value == "--trap") {
2615 CmdArgs.push_back("-target-feature");
2616 CmdArgs.push_back("+use-tcc-in-div");
2617 continue;
2618 }
2619 if (Value == "--break") {
2620 CmdArgs.push_back("-target-feature");
2621 CmdArgs.push_back("-use-tcc-in-div");
2622 continue;
2623 }
2624 if (Value.startswith("-msoft-float")) {
2625 CmdArgs.push_back("-target-feature");
2626 CmdArgs.push_back("+soft-float");
2627 continue;
2628 }
2629 if (Value.startswith("-mhard-float")) {
2630 CmdArgs.push_back("-target-feature");
2631 CmdArgs.push_back("-soft-float");
2632 continue;
2633 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002634
2635 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2636 .Case("-mips1", "+mips1")
2637 .Case("-mips2", "+mips2")
2638 .Case("-mips3", "+mips3")
2639 .Case("-mips4", "+mips4")
2640 .Case("-mips5", "+mips5")
2641 .Case("-mips32", "+mips32")
2642 .Case("-mips32r2", "+mips32r2")
2643 .Case("-mips32r3", "+mips32r3")
2644 .Case("-mips32r5", "+mips32r5")
2645 .Case("-mips32r6", "+mips32r6")
2646 .Case("-mips64", "+mips64")
2647 .Case("-mips64r2", "+mips64r2")
2648 .Case("-mips64r3", "+mips64r3")
2649 .Case("-mips64r5", "+mips64r5")
2650 .Case("-mips64r6", "+mips64r6")
2651 .Default(nullptr);
2652 if (MipsTargetFeature)
2653 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002654 }
2655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 if (Value == "-force_cpusubtype_ALL") {
2657 // Do nothing, this is the default and we don't support anything else.
2658 } else if (Value == "-L") {
2659 CmdArgs.push_back("-msave-temp-labels");
2660 } else if (Value == "--fatal-warnings") {
2661 CmdArgs.push_back("-massembler-fatal-warnings");
2662 } else if (Value == "--noexecstack") {
2663 CmdArgs.push_back("-mnoexecstack");
2664 } else if (Value == "-compress-debug-sections" ||
2665 Value == "--compress-debug-sections") {
2666 CompressDebugSections = true;
2667 } else if (Value == "-nocompress-debug-sections" ||
2668 Value == "--nocompress-debug-sections") {
2669 CompressDebugSections = false;
2670 } else if (Value.startswith("-I")) {
2671 CmdArgs.push_back(Value.data());
2672 // We need to consume the next argument if the current arg is a plain
2673 // -I. The next arg will be the include directory.
2674 if (Value == "-I")
2675 TakeNextArg = true;
2676 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002677 // "-gdwarf-N" options are not cc1as options.
2678 unsigned DwarfVersion = DwarfVersionNum(Value);
2679 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2680 CmdArgs.push_back(Value.data());
2681 } else {
2682 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002683 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2684 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002685 }
Renato Golin7c542b42015-07-27 23:44:45 +00002686 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2687 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2688 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689 } else {
2690 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002691 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002692 }
2693 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002694 }
2695 if (CompressDebugSections) {
2696 if (llvm::zlib::isAvailable())
2697 CmdArgs.push_back("-compress-debug-sections");
2698 else
2699 D.Diag(diag::warn_debug_compression_unavailable);
2700 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002701 if (MipsTargetFeature != nullptr) {
2702 CmdArgs.push_back("-target-feature");
2703 CmdArgs.push_back(MipsTargetFeature);
2704 }
David Blaikie9260ed62013-07-25 21:19:01 +00002705}
2706
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002707// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002708// FIXME: Make sure we can also emit shared objects if they're requested
2709// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002710static void addClangRT(const ToolChain &TC, const ArgList &Args,
2711 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002712 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002713}
2714
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002715namespace {
2716enum OpenMPRuntimeKind {
2717 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2718 /// without knowing what runtime to target.
2719 OMPRT_Unknown,
2720
2721 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2722 /// the default for Clang.
2723 OMPRT_OMP,
2724
2725 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2726 /// this runtime but can swallow the pragmas, and find and link against the
2727 /// runtime library itself.
2728 OMPRT_GOMP,
2729
Chandler Carruthc6625c62015-05-28 21:10:31 +00002730 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002731 /// OpenMP runtime. We support this mode for users with existing dependencies
2732 /// on this runtime library name.
2733 OMPRT_IOMP5
2734};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002735}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002736
2737/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002738static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2739 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002740 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2741
2742 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2743 if (A)
2744 RuntimeName = A->getValue();
2745
2746 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002747 .Case("libomp", OMPRT_OMP)
2748 .Case("libgomp", OMPRT_GOMP)
2749 .Case("libiomp5", OMPRT_IOMP5)
2750 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002751
2752 if (RT == OMPRT_Unknown) {
2753 if (A)
2754 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002755 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002756 else
2757 // FIXME: We could use a nicer diagnostic here.
2758 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2759 }
2760
2761 return RT;
2762}
2763
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002764static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2765 const ArgList &Args) {
2766 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2767 options::OPT_fno_openmp, false))
2768 return;
2769
2770 switch (getOpenMPRuntime(TC, Args)) {
2771 case OMPRT_OMP:
2772 CmdArgs.push_back("-lomp");
2773 break;
2774 case OMPRT_GOMP:
2775 CmdArgs.push_back("-lgomp");
2776 break;
2777 case OMPRT_IOMP5:
2778 CmdArgs.push_back("-liomp5");
2779 break;
2780 case OMPRT_Unknown:
2781 // Already diagnosed.
2782 break;
2783 }
2784}
2785
Alexey Samsonov52550342014-09-15 19:58:40 +00002786static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2787 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002788 bool IsShared, bool IsWhole) {
2789 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002790 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002791 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002792 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002793 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002794}
2795
Alexey Samsonov52550342014-09-15 19:58:40 +00002796// Tries to use a file with the list of dynamic symbols that need to be exported
2797// from the runtime library. Returns true if the file was found.
2798static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2799 ArgStringList &CmdArgs,
2800 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002801 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002802 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2803 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002804 return true;
2805 }
2806 return false;
2807}
2808
2809static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2810 ArgStringList &CmdArgs) {
2811 // Force linking against the system libraries sanitizers depends on
2812 // (see PR15823 why this is necessary).
2813 CmdArgs.push_back("--no-as-needed");
2814 CmdArgs.push_back("-lpthread");
2815 CmdArgs.push_back("-lrt");
2816 CmdArgs.push_back("-lm");
2817 // There's no libdl on FreeBSD.
2818 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2819 CmdArgs.push_back("-ldl");
2820}
2821
2822static void
2823collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2824 SmallVectorImpl<StringRef> &SharedRuntimes,
2825 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002826 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2827 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2828 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002829 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2830 // Collect shared runtimes.
2831 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2832 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002833 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002834 // The stats_client library is also statically linked into DSOs.
2835 if (SanArgs.needsStatsRt())
2836 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002837
Alexey Samsonov52550342014-09-15 19:58:40 +00002838 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002839 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002840 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002841 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002842 }
2843 if (SanArgs.needsAsanRt()) {
2844 if (SanArgs.needsSharedAsanRt()) {
2845 HelperStaticRuntimes.push_back("asan-preinit");
2846 } else {
2847 StaticRuntimes.push_back("asan");
2848 if (SanArgs.linkCXXRuntimes())
2849 StaticRuntimes.push_back("asan_cxx");
2850 }
2851 }
2852 if (SanArgs.needsDfsanRt())
2853 StaticRuntimes.push_back("dfsan");
2854 if (SanArgs.needsLsanRt())
2855 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002856 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002857 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002858 if (SanArgs.linkCXXRuntimes())
2859 StaticRuntimes.push_back("msan_cxx");
2860 }
2861 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002862 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002863 if (SanArgs.linkCXXRuntimes())
2864 StaticRuntimes.push_back("tsan_cxx");
2865 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002866 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002867 StaticRuntimes.push_back("ubsan_standalone");
2868 if (SanArgs.linkCXXRuntimes())
2869 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002870 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002871 if (SanArgs.needsSafeStackRt())
2872 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002873 if (SanArgs.needsCfiRt())
2874 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002875 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002876 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002877 if (SanArgs.linkCXXRuntimes())
2878 StaticRuntimes.push_back("ubsan_standalone_cxx");
2879 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002880 if (SanArgs.needsStatsRt()) {
2881 NonWholeStaticRuntimes.push_back("stats");
2882 RequiredSymbols.push_back("__sanitizer_stats_register");
2883 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002884}
2885
Alexey Samsonov52550342014-09-15 19:58:40 +00002886// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2887// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2888static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002889 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002890 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002892 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002893 NonWholeStaticRuntimes, HelperStaticRuntimes,
2894 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002895 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002896 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002898 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002899 bool AddExportDynamic = false;
2900 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002901 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002902 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2903 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002904 for (auto RT : NonWholeStaticRuntimes) {
2905 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2906 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2907 }
2908 for (auto S : RequiredSymbols) {
2909 CmdArgs.push_back("-u");
2910 CmdArgs.push_back(Args.MakeArgString(S));
2911 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002912 // If there is a static runtime with no dynamic list, force all the symbols
2913 // to be dynamic to be sure we export sanitizer interface functions.
2914 if (AddExportDynamic)
2915 CmdArgs.push_back("-export-dynamic");
2916 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002917}
2918
Reid Kleckner86ea7702015-02-04 23:45:07 +00002919static bool areOptimizationsEnabled(const ArgList &Args) {
2920 // Find the last -O arg and see if it is non-zero.
2921 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2922 return !A->getOption().matches(options::OPT_O0);
2923 // Defaults to -O0.
2924 return false;
2925}
2926
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002927static bool shouldUseFramePointerForTarget(const ArgList &Args,
2928 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002929 switch (Triple.getArch()) {
2930 case llvm::Triple::xcore:
2931 case llvm::Triple::wasm32:
2932 case llvm::Triple::wasm64:
2933 // XCore never wants frame pointers, regardless of OS.
2934 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002935 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002936 default:
2937 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002938 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002939
2940 if (Triple.isOSLinux()) {
2941 switch (Triple.getArch()) {
2942 // Don't use a frame pointer on linux if optimizing for certain targets.
2943 case llvm::Triple::mips64:
2944 case llvm::Triple::mips64el:
2945 case llvm::Triple::mips:
2946 case llvm::Triple::mipsel:
2947 case llvm::Triple::systemz:
2948 case llvm::Triple::x86:
2949 case llvm::Triple::x86_64:
2950 return !areOptimizationsEnabled(Args);
2951 default:
2952 return true;
2953 }
2954 }
2955
2956 if (Triple.isOSWindows()) {
2957 switch (Triple.getArch()) {
2958 case llvm::Triple::x86:
2959 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002960 case llvm::Triple::arm:
2961 case llvm::Triple::thumb:
2962 // Windows on ARM builds with FPO disabled to aid fast stack walking
2963 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002964 default:
2965 // All other supported Windows ISAs use xdata unwind information, so frame
2966 // pointers are not generally useful.
2967 return false;
2968 }
2969 }
2970
2971 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002972}
2973
Rafael Espindola224dd632011-12-14 21:02:23 +00002974static bool shouldUseFramePointer(const ArgList &Args,
2975 const llvm::Triple &Triple) {
2976 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2977 options::OPT_fomit_frame_pointer))
2978 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002979 if (Args.hasArg(options::OPT_pg))
2980 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002981
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002982 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002983}
2984
Eric Christopherb7d97e92013-04-03 01:58:53 +00002985static bool shouldUseLeafFramePointer(const ArgList &Args,
2986 const llvm::Triple &Triple) {
2987 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2988 options::OPT_momit_leaf_frame_pointer))
2989 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002990 if (Args.hasArg(options::OPT_pg))
2991 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002992
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002993 if (Triple.isPS4CPU())
2994 return false;
2995
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002996 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002997}
2998
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002999/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003000static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003001 SmallString<128> cwd;
3002 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003003 CmdArgs.push_back("-fdebug-compilation-dir");
3004 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003005 }
3006}
3007
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003008static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003009 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3010 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3011 SmallString<128> T(FinalOutput->getValue());
3012 llvm::sys::path::replace_extension(T, "dwo");
3013 return Args.MakeArgString(T);
3014 } else {
3015 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003016 SmallString<128> T(
3017 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003018 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003019 llvm::sys::path::replace_extension(F, "dwo");
3020 T += F;
3021 return Args.MakeArgString(F);
3022 }
3023}
3024
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003025static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3026 const JobAction &JA, const ArgList &Args,
3027 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003028 ArgStringList ExtractArgs;
3029 ExtractArgs.push_back("--extract-dwo");
3030
3031 ArgStringList StripArgs;
3032 StripArgs.push_back("--strip-dwo");
3033
3034 // Grabbing the output of the earlier compile step.
3035 StripArgs.push_back(Output.getFilename());
3036 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003037 ExtractArgs.push_back(OutFile);
3038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003039 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003040 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003041
3042 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003043 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003044
3045 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003046 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003047}
3048
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003049/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003050/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3051static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003052 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003053 if (A->getOption().matches(options::OPT_O4) ||
3054 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003055 return true;
3056
3057 if (A->getOption().matches(options::OPT_O0))
3058 return false;
3059
3060 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3061
Rafael Espindola91780de2013-08-26 14:05:41 +00003062 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003063 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003064 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003065 return true;
3066
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003067 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003068 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003069 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003070
3071 unsigned OptLevel = 0;
3072 if (S.getAsInteger(10, OptLevel))
3073 return false;
3074
3075 return OptLevel > 1;
3076 }
3077
3078 return false;
3079}
3080
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003081/// Add -x lang to \p CmdArgs for \p Input.
3082static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3083 ArgStringList &CmdArgs) {
3084 // When using -verify-pch, we don't want to provide the type
3085 // 'precompiled-header' if it was inferred from the file extension
3086 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3087 return;
3088
3089 CmdArgs.push_back("-x");
3090 if (Args.hasArg(options::OPT_rewrite_objc))
3091 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3092 else
3093 CmdArgs.push_back(types::getTypeName(Input.getType()));
3094}
3095
David Majnemerc371ff02015-03-22 08:39:22 +00003096static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003097 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003098 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003099
3100 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003101 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003102
3103 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003104 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003105 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003106 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003107}
3108
Rafael Espindola577637a2015-01-03 00:06:04 +00003109// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003110// options that build systems might add but are unused when assembling or only
3111// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003112static void claimNoWarnArgs(const ArgList &Args) {
3113 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003114 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003115 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003116 Args.ClaimAllArgs(options::OPT_flto);
3117 Args.ClaimAllArgs(options::OPT_fno_lto);
3118}
3119
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003120static void appendUserToPath(SmallVectorImpl<char> &Result) {
3121#ifdef LLVM_ON_UNIX
3122 const char *Username = getenv("LOGNAME");
3123#else
3124 const char *Username = getenv("USERNAME");
3125#endif
3126 if (Username) {
3127 // Validate that LoginName can be used in a path, and get its length.
3128 size_t Len = 0;
3129 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003130 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003131 Username = nullptr;
3132 break;
3133 }
3134 }
3135
3136 if (Username && Len > 0) {
3137 Result.append(Username, Username + Len);
3138 return;
3139 }
3140 }
3141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003143#ifdef LLVM_ON_UNIX
3144 std::string UID = llvm::utostr(getuid());
3145#else
3146 // FIXME: Windows seems to have an 'SID' that might work.
3147 std::string UID = "9999";
3148#endif
3149 Result.append(UID.begin(), UID.end());
3150}
3151
David Majnemere11d3732015-06-08 00:22:46 +00003152VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3153 const llvm::Triple &Triple,
3154 const llvm::opt::ArgList &Args,
3155 bool IsWindowsMSVC) {
3156 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3157 IsWindowsMSVC) ||
3158 Args.hasArg(options::OPT_fmsc_version) ||
3159 Args.hasArg(options::OPT_fms_compatibility_version)) {
3160 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3161 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003162 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003163
3164 if (MSCVersion && MSCompatibilityVersion) {
3165 if (D)
3166 D->Diag(diag::err_drv_argument_not_allowed_with)
3167 << MSCVersion->getAsString(Args)
3168 << MSCompatibilityVersion->getAsString(Args);
3169 return VersionTuple();
3170 }
3171
3172 if (MSCompatibilityVersion) {
3173 VersionTuple MSVT;
3174 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3175 D->Diag(diag::err_drv_invalid_value)
3176 << MSCompatibilityVersion->getAsString(Args)
3177 << MSCompatibilityVersion->getValue();
3178 return MSVT;
3179 }
3180
3181 if (MSCVersion) {
3182 unsigned Version = 0;
3183 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3184 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3185 << MSCVersion->getValue();
3186 return getMSCompatibilityVersion(Version);
3187 }
3188
3189 unsigned Major, Minor, Micro;
3190 Triple.getEnvironmentVersion(Major, Minor, Micro);
3191 if (Major || Minor || Micro)
3192 return VersionTuple(Major, Minor, Micro);
3193
3194 return VersionTuple(18);
3195 }
3196 return VersionTuple();
3197}
3198
Diego Novilloa0545962015-07-10 18:00:07 +00003199static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3200 const InputInfo &Output, const ArgList &Args,
3201 ArgStringList &CmdArgs) {
3202 auto *ProfileGenerateArg = Args.getLastArg(
3203 options::OPT_fprofile_instr_generate,
3204 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003205 options::OPT_fprofile_generate_EQ,
3206 options::OPT_fno_profile_instr_generate);
3207 if (ProfileGenerateArg &&
3208 ProfileGenerateArg->getOption().matches(
3209 options::OPT_fno_profile_instr_generate))
3210 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003211
3212 auto *ProfileUseArg = Args.getLastArg(
3213 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003214 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3215 options::OPT_fno_profile_instr_use);
3216 if (ProfileUseArg &&
3217 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3218 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003219
3220 if (ProfileGenerateArg && ProfileUseArg)
3221 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003222 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003223
Diego Novillo758f3f52015-08-05 21:49:51 +00003224 if (ProfileGenerateArg) {
3225 if (ProfileGenerateArg->getOption().matches(
3226 options::OPT_fprofile_instr_generate_EQ))
3227 ProfileGenerateArg->render(Args, CmdArgs);
3228 else if (ProfileGenerateArg->getOption().matches(
3229 options::OPT_fprofile_generate_EQ)) {
3230 SmallString<128> Path(ProfileGenerateArg->getValue());
3231 llvm::sys::path::append(Path, "default.profraw");
3232 CmdArgs.push_back(
3233 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3234 } else
3235 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3236 }
Diego Novilloa0545962015-07-10 18:00:07 +00003237
Diego Novillo758f3f52015-08-05 21:49:51 +00003238 if (ProfileUseArg) {
3239 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3240 ProfileUseArg->render(Args, CmdArgs);
3241 else if ((ProfileUseArg->getOption().matches(
3242 options::OPT_fprofile_use_EQ) ||
3243 ProfileUseArg->getOption().matches(
3244 options::OPT_fprofile_instr_use))) {
3245 SmallString<128> Path(
3246 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3247 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3248 llvm::sys::path::append(Path, "default.profdata");
3249 CmdArgs.push_back(
3250 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3251 }
Diego Novilloa0545962015-07-10 18:00:07 +00003252 }
3253
3254 if (Args.hasArg(options::OPT_ftest_coverage) ||
3255 Args.hasArg(options::OPT_coverage))
3256 CmdArgs.push_back("-femit-coverage-notes");
3257 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3258 false) ||
3259 Args.hasArg(options::OPT_coverage))
3260 CmdArgs.push_back("-femit-coverage-data");
3261
Diego Novilloc4b94da2015-08-05 23:27:40 +00003262 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3263 options::OPT_fno_coverage_mapping, false) &&
3264 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003265 D.Diag(diag::err_drv_argument_only_allowed_with)
3266 << "-fcoverage-mapping"
3267 << "-fprofile-instr-generate";
3268
Diego Novilloc4b94da2015-08-05 23:27:40 +00003269 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3270 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003271 CmdArgs.push_back("-fcoverage-mapping");
3272
3273 if (C.getArgs().hasArg(options::OPT_c) ||
3274 C.getArgs().hasArg(options::OPT_S)) {
3275 if (Output.isFilename()) {
3276 CmdArgs.push_back("-coverage-file");
3277 SmallString<128> CoverageFilename;
3278 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3279 CoverageFilename = FinalOutput->getValue();
3280 } else {
3281 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3282 }
3283 if (llvm::sys::path::is_relative(CoverageFilename)) {
3284 SmallString<128> Pwd;
3285 if (!llvm::sys::fs::current_path(Pwd)) {
3286 llvm::sys::path::append(Pwd, CoverageFilename);
3287 CoverageFilename.swap(Pwd);
3288 }
3289 }
3290 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3291 }
3292 }
3293}
3294
Paul Robinsond083b9a2015-12-16 17:25:27 +00003295static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3296 ArgStringList &CmdArgs) {
3297 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3298 false) ||
3299 Args.hasFlag(options::OPT_fprofile_generate,
3300 options::OPT_fno_profile_instr_generate, false) ||
3301 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3302 options::OPT_fno_profile_instr_generate, false) ||
3303 Args.hasFlag(options::OPT_fprofile_instr_generate,
3304 options::OPT_fno_profile_instr_generate, false) ||
3305 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3306 options::OPT_fno_profile_instr_generate, false) ||
3307 Args.hasArg(options::OPT_fcreate_profile) ||
3308 Args.hasArg(options::OPT_coverage)))
3309 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3310}
3311
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003312/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3313/// smooshes them together with platform defaults, to decide whether
3314/// this compile should be using PIC mode or not. Returns a tuple of
3315/// (RelocationModel, PICLevel, IsPIE).
3316static std::tuple<llvm::Reloc::Model, unsigned, bool>
3317ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3318 const ArgList &Args) {
3319 // FIXME: why does this code...and so much everywhere else, use both
3320 // ToolChain.getTriple() and Triple?
3321 bool PIE = ToolChain.isPIEDefault();
3322 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003323 // The Darwin/MachO default to use PIC does not apply when using -static.
3324 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3325 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003326 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003327 bool IsPICLevelTwo = PIC;
3328
3329 bool KernelOrKext =
3330 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3331
3332 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003333 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003334 switch (ToolChain.getArch()) {
3335 case llvm::Triple::arm:
3336 case llvm::Triple::armeb:
3337 case llvm::Triple::thumb:
3338 case llvm::Triple::thumbeb:
3339 case llvm::Triple::aarch64:
3340 case llvm::Triple::mips:
3341 case llvm::Triple::mipsel:
3342 case llvm::Triple::mips64:
3343 case llvm::Triple::mips64el:
3344 PIC = true; // "-fpic"
3345 break;
3346
3347 case llvm::Triple::x86:
3348 case llvm::Triple::x86_64:
3349 PIC = true; // "-fPIC"
3350 IsPICLevelTwo = true;
3351 break;
3352
3353 default:
3354 break;
3355 }
3356 }
3357
3358 // OpenBSD-specific defaults for PIE
3359 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3360 switch (ToolChain.getArch()) {
3361 case llvm::Triple::mips64:
3362 case llvm::Triple::mips64el:
3363 case llvm::Triple::sparcel:
3364 case llvm::Triple::x86:
3365 case llvm::Triple::x86_64:
3366 IsPICLevelTwo = false; // "-fpie"
3367 break;
3368
3369 case llvm::Triple::ppc:
3370 case llvm::Triple::sparc:
3371 case llvm::Triple::sparcv9:
3372 IsPICLevelTwo = true; // "-fPIE"
3373 break;
3374
3375 default:
3376 break;
3377 }
3378 }
3379
3380 // The last argument relating to either PIC or PIE wins, and no
3381 // other argument is used. If the last argument is any flavor of the
3382 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3383 // option implicitly enables PIC at the same level.
3384 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3385 options::OPT_fpic, options::OPT_fno_pic,
3386 options::OPT_fPIE, options::OPT_fno_PIE,
3387 options::OPT_fpie, options::OPT_fno_pie);
3388 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3389 // is forced, then neither PIC nor PIE flags will have no effect.
3390 if (!ToolChain.isPICDefaultForced()) {
3391 if (LastPICArg) {
3392 Option O = LastPICArg->getOption();
3393 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3394 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3395 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3396 PIC =
3397 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3398 IsPICLevelTwo =
3399 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3400 } else {
3401 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003402 if (Triple.isPS4CPU()) {
3403 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3404 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3405 if (Model != "kernel") {
3406 PIC = true;
3407 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3408 << LastPICArg->getSpelling();
3409 }
3410 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003411 }
3412 }
3413 }
3414
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003415 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3416 // PIC level would've been set to level 1, force it back to level 2 PIC
3417 // instead.
3418 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003419 IsPICLevelTwo |= ToolChain.isPICDefault();
3420
James Y Knightc4015d32015-08-21 04:14:55 +00003421 // This kernel flags are a trump-card: they will disable PIC/PIE
3422 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003423 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3424 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003425 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003426
3427 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3428 // This is a very special mode. It trumps the other modes, almost no one
3429 // uses it, and it isn't even valid on any OS but Darwin.
3430 if (!ToolChain.getTriple().isOSDarwin())
3431 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3432 << A->getSpelling() << ToolChain.getTriple().str();
3433
3434 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3435
3436 // Only a forced PIC mode can cause the actual compile to have PIC defines
3437 // etc., no flags are sufficient. This behavior was selected to closely
3438 // match that of llvm-gcc and Apple GCC before that.
3439 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3440
3441 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3442 }
3443
3444 if (PIC)
3445 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3446
3447 return std::make_tuple(llvm::Reloc::Static, 0, false);
3448}
3449
3450static const char *RelocationModelName(llvm::Reloc::Model Model) {
3451 switch (Model) {
3452 case llvm::Reloc::Default:
3453 return nullptr;
3454 case llvm::Reloc::Static:
3455 return "static";
3456 case llvm::Reloc::PIC_:
3457 return "pic";
3458 case llvm::Reloc::DynamicNoPIC:
3459 return "dynamic-no-pic";
3460 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003461 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003462}
3463
3464static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3465 ArgStringList &CmdArgs) {
3466 llvm::Reloc::Model RelocationModel;
3467 unsigned PICLevel;
3468 bool IsPIE;
3469 std::tie(RelocationModel, PICLevel, IsPIE) =
3470 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3471
3472 if (RelocationModel != llvm::Reloc::Static)
3473 CmdArgs.push_back("-KPIC");
3474}
3475
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003476void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 const InputInfo &Output, const InputInfoList &Inputs,
3478 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003479 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3480 const llvm::Triple Triple(TripleStr);
3481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003482 bool KernelOrKext =
3483 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003484 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003485 ArgStringList CmdArgs;
3486
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003487 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003488 bool IsWindowsCygnus =
3489 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003490 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003491 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003492
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003493 // Check number of inputs for sanity. We need at least one input.
3494 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003495 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003496 // CUDA compilation may have multiple inputs (source file + results of
3497 // device-side compilations). All other jobs are expected to have exactly one
3498 // input.
3499 bool IsCuda = types::isCuda(Input.getType());
3500 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003501
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003502 // Invoke ourselves in -cc1 mode.
3503 //
3504 // FIXME: Implement custom jobs for internal actions.
3505 CmdArgs.push_back("-cc1");
3506
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003507 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003508 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003509 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003510
Artem Belevichfa11ab52015-11-17 22:28:46 +00003511 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003512 if (IsCuda) {
3513 // FIXME: We need a (better) way to pass information about
3514 // particular compilation pass we're constructing here. For now we
3515 // can check which toolchain we're using and pick the other one to
3516 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003517 if (&getToolChain() == C.getCudaDeviceToolChain())
3518 AuxToolChain = C.getCudaHostToolChain();
3519 else if (&getToolChain() == C.getCudaHostToolChain())
3520 AuxToolChain = C.getCudaDeviceToolChain();
3521 else
3522 llvm_unreachable("Can't figure out CUDA compilation mode.");
3523 assert(AuxToolChain != nullptr && "No aux toolchain.");
3524 CmdArgs.push_back("-aux-triple");
3525 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003526 CmdArgs.push_back("-fcuda-target-overloads");
3527 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003528 }
3529
James Y Knight2db38f32015-08-15 03:45:25 +00003530 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3531 Triple.getArch() == llvm::Triple::thumb)) {
3532 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003533 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003534 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003535 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003536 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003537 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003538 }
3539
Tim Northover336f1892014-03-29 13:16:12 +00003540 // Push all default warning arguments that are specific to
3541 // the given target. These come before user provided warning options
3542 // are provided.
3543 getToolChain().addClangWarningOptions(CmdArgs);
3544
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003545 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003546 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003548 if (isa<AnalyzeJobAction>(JA)) {
3549 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3550 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003551 } else if (isa<MigrateJobAction>(JA)) {
3552 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003553 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003554 if (Output.getType() == types::TY_Dependencies)
3555 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003556 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003557 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003558 if (Args.hasArg(options::OPT_rewrite_objc) &&
3559 !Args.hasArg(options::OPT_g_Group))
3560 CmdArgs.push_back("-P");
3561 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003562 } else if (isa<AssembleJobAction>(JA)) {
3563 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003564
David Blaikie9260ed62013-07-25 21:19:01 +00003565 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003566
3567 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003568 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003569 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003570 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003571 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003572
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003573 if (JA.getType() == types::TY_Nothing)
3574 CmdArgs.push_back("-fsyntax-only");
3575 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003576 CmdArgs.push_back("-emit-pch");
3577 else
3578 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003579 } else if (isa<VerifyPCHJobAction>(JA)) {
3580 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003581 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003582 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3583 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003584 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003585 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003586 } else if (JA.getType() == types::TY_LLVM_IR ||
3587 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003588 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003589 } else if (JA.getType() == types::TY_LLVM_BC ||
3590 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003591 CmdArgs.push_back("-emit-llvm-bc");
3592 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003593 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003594 } else if (JA.getType() == types::TY_AST) {
3595 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003596 } else if (JA.getType() == types::TY_ModuleFile) {
3597 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003598 } else if (JA.getType() == types::TY_RewrittenObjC) {
3599 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003600 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003601 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3602 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003603 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003604 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003605 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003606 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003607
3608 // Preserve use-list order by default when emitting bitcode, so that
3609 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3610 // same result as running passes here. For LTO, we don't need to preserve
3611 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003612 if (JA.getType() == types::TY_LLVM_BC)
3613 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003614
3615 if (D.isUsingLTO())
3616 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003617 }
3618
Teresa Johnsonaff22322015-12-07 19:21:34 +00003619 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3620 if (!types::isLLVMIR(Input.getType()))
3621 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3622 << "-x ir";
3623 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3624 }
3625
Justin Bognera88f0122014-06-20 22:59:50 +00003626 // We normally speed up the clang process a bit by skipping destructors at
3627 // exit, but when we're generating diagnostics we can rely on some of the
3628 // cleanup.
3629 if (!C.isForDiagnostics())
3630 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003632// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003633#ifdef NDEBUG
3634 CmdArgs.push_back("-disable-llvm-verifier");
3635#endif
3636
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003637 // Set the main file name, so that debug info works even with
3638 // -save-temps.
3639 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003640 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003641
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003642 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003643 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003644 if (Args.hasArg(options::OPT_static))
3645 CmdArgs.push_back("-static-define");
3646
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003647 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003648 // Enable region store model by default.
3649 CmdArgs.push_back("-analyzer-store=region");
3650
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003651 // Treat blocks as analysis entry points.
3652 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3653
Ted Kremenek49c79792011-03-24 00:28:47 +00003654 CmdArgs.push_back("-analyzer-eagerly-assume");
3655
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003656 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003657 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003658 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003659
Devin Coughlin65c77082016-01-21 20:09:49 +00003660 if (!IsWindowsMSVC) {
3661 CmdArgs.push_back("-analyzer-checker=unix");
3662 } else {
3663 // Enable "unix" checkers that also work on Windows.
3664 CmdArgs.push_back("-analyzer-checker=unix.API");
3665 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3666 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3667 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3668 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3669 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3670 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003671
Sean Evesonb38c32b2016-01-06 10:03:58 +00003672 // Disable some unix checkers for PS4.
3673 if (IsPS4CPU) {
3674 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3675 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3676 }
3677
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003678 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003679 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003680
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003681 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003682
Artem Belevichba558952015-05-06 18:20:23 +00003683 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003684 CmdArgs.push_back("-analyzer-checker=cplusplus");
3685
Sean Evesonb38c32b2016-01-06 10:03:58 +00003686 if (!IsPS4CPU) {
3687 CmdArgs.push_back(
3688 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3694 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003695
3696 // Default nullability checks.
3697 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3698 CmdArgs.push_back(
3699 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003700 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003701
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003702 // Set the output format. The default is plist, for (lame) historical
3703 // reasons.
3704 CmdArgs.push_back("-analyzer-output");
3705 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003706 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003707 else
3708 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003709
Ted Kremenekfe449a22010-03-22 22:32:05 +00003710 // Disable the presentation of standard compiler warnings when
3711 // using --analyze. We only want to show static analyzer diagnostics
3712 // or frontend errors.
3713 CmdArgs.push_back("-w");
3714
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003715 // Add -Xanalyzer arguments when running as analyzer.
3716 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003717 }
3718
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003719 CheckCodeGenerationOptions(D, Args);
3720
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003721 llvm::Reloc::Model RelocationModel;
3722 unsigned PICLevel;
3723 bool IsPIE;
3724 std::tie(RelocationModel, PICLevel, IsPIE) =
3725 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003726
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003727 const char *RMName = RelocationModelName(RelocationModel);
3728 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003729 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003730 CmdArgs.push_back(RMName);
3731 }
3732 if (PICLevel > 0) {
3733 CmdArgs.push_back("-pic-level");
3734 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3735 if (IsPIE) {
3736 CmdArgs.push_back("-pie-level");
3737 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003738 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003739 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003740
Renato Golin4854d802015-11-09 12:40:41 +00003741 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3742 CmdArgs.push_back("-meabi");
3743 CmdArgs.push_back(A->getValue());
3744 }
3745
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003746 CmdArgs.push_back("-mthread-model");
3747 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3748 CmdArgs.push_back(A->getValue());
3749 else
3750 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3751
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003752 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3753
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003754 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3755 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003756 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003757
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003758 // LLVM Code Generator Options.
3759
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003760 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3761 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003762 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3763 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003764 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003765 CmdArgs.push_back(A->getValue());
3766 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003767 }
3768 }
3769
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003770 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3771 StringRef v = A->getValue();
3772 CmdArgs.push_back("-mllvm");
3773 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3774 A->claim();
3775 }
3776
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003777 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3778 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003779 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003780 }
3781
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003782 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3783 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003784 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003785 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003786 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003787 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3788 CmdArgs.push_back("-fpcc-struct-return");
3789 } else {
3790 assert(A->getOption().matches(options::OPT_freg_struct_return));
3791 CmdArgs.push_back("-freg-struct-return");
3792 }
3793 }
3794
Roman Divacky65b88cd2011-03-01 17:40:53 +00003795 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3796 CmdArgs.push_back("-mrtd");
3797
Rafael Espindola224dd632011-12-14 21:02:23 +00003798 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003799 CmdArgs.push_back("-mdisable-fp-elim");
3800 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3801 options::OPT_fno_zero_initialized_in_bss))
3802 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003803
3804 bool OFastEnabled = isOptimizationLevelFast(Args);
3805 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3806 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003807 OptSpecifier StrictAliasingAliasOption =
3808 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003809 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3810 // doesn't do any TBAA.
3811 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003812 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003813 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003814 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003815 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3816 options::OPT_fno_struct_path_tbaa))
3817 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003818 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3819 false))
3820 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003821 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3822 options::OPT_fno_strict_vtable_pointers,
3823 false))
3824 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003825 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3826 options::OPT_fno_optimize_sibling_calls))
3827 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003828
Eric Christopher006208c2013-04-04 06:29:47 +00003829 // Handle segmented stacks.
3830 if (Args.hasArg(options::OPT_fsplit_stack))
3831 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003832
3833 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3834 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003835 OptSpecifier FastMathAliasOption =
3836 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3837
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003838 // Handle various floating point optimization flags, mapping them to the
3839 // appropriate LLVM code generation flags. The pattern for all of these is to
3840 // default off the codegen optimizations, and if any flag enables them and no
3841 // flag disables them after the flag enabling them, enable the codegen
3842 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 if (Arg *A = Args.getLastArg(
3844 options::OPT_ffast_math, FastMathAliasOption,
3845 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3846 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3847 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003848 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3849 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003850 A->getOption().getID() != options::OPT_fhonor_infinities)
3851 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003852 if (Arg *A = Args.getLastArg(
3853 options::OPT_ffast_math, FastMathAliasOption,
3854 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3855 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3856 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003857 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3858 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003859 A->getOption().getID() != options::OPT_fhonor_nans)
3860 CmdArgs.push_back("-menable-no-nans");
3861
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003862 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3863 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003864 if (Arg *A =
3865 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3866 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3867 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003868 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3869 // However, turning *off* -ffast_math merely restores the toolchain default
3870 // (which may be false).
3871 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3872 A->getOption().getID() == options::OPT_ffast_math ||
3873 A->getOption().getID() == options::OPT_Ofast)
3874 MathErrno = false;
3875 else if (A->getOption().getID() == options::OPT_fmath_errno)
3876 MathErrno = true;
3877 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003878 if (MathErrno)
3879 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003880
3881 // There are several flags which require disabling very specific
3882 // optimizations. Any of these being disabled forces us to turn off the
3883 // entire set of LLVM optimizations, so collect them through all the flag
3884 // madness.
3885 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003886 if (Arg *A = Args.getLastArg(
3887 options::OPT_ffast_math, FastMathAliasOption,
3888 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3889 options::OPT_fno_unsafe_math_optimizations,
3890 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003891 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3892 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003893 A->getOption().getID() != options::OPT_fno_associative_math)
3894 AssociativeMath = true;
3895 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003896 if (Arg *A = Args.getLastArg(
3897 options::OPT_ffast_math, FastMathAliasOption,
3898 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3899 options::OPT_fno_unsafe_math_optimizations,
3900 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003901 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3902 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003903 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3904 ReciprocalMath = true;
3905 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 if (Arg *A = Args.getLastArg(
3907 options::OPT_ffast_math, FastMathAliasOption,
3908 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3909 options::OPT_fno_unsafe_math_optimizations,
3910 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003911 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3912 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003913 A->getOption().getID() != options::OPT_fsigned_zeros)
3914 SignedZeros = false;
3915 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003916 if (Arg *A = Args.getLastArg(
3917 options::OPT_ffast_math, FastMathAliasOption,
3918 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3919 options::OPT_fno_unsafe_math_optimizations,
3920 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003921 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3922 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003923 A->getOption().getID() != options::OPT_ftrapping_math)
3924 TrappingMath = false;
3925 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3926 !TrappingMath)
3927 CmdArgs.push_back("-menable-unsafe-fp-math");
3928
Sanjay Patel76c9e092015-01-23 16:40:50 +00003929 if (!SignedZeros)
3930 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003931
Sanjay Patel359b1052015-04-09 15:03:23 +00003932 if (ReciprocalMath)
3933 CmdArgs.push_back("-freciprocal-math");
3934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003935 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003936 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003937 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003938 options::OPT_ffp_contract)) {
3939 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003940 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003941 if (Val == "fast" || Val == "on" || Val == "off") {
3942 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3943 } else {
3944 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003946 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003947 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3948 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003949 // If fast-math is set then set the fp-contract mode to fast.
3950 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3951 }
3952 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953
Sanjay Patel2987c292015-06-11 14:53:41 +00003954 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003955
Bob Wilson6a039162012-07-19 03:52:53 +00003956 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3957 // and if we find them, tell the frontend to provide the appropriate
3958 // preprocessor macros. This is distinct from enabling any optimizations as
3959 // these options induce language changes which must survive serialization
3960 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003961 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3962 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003963 if (!A->getOption().matches(options::OPT_fno_fast_math))
3964 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003965 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3966 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003967 if (A->getOption().matches(options::OPT_ffinite_math_only))
3968 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003969
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003970 // Decide whether to use verbose asm. Verbose assembly is the default on
3971 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003972 bool IsIntegratedAssemblerDefault =
3973 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003974 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003975 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003976 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003977 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003978
Rafael Espindolab8a12932015-05-22 20:44:03 +00003979 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3980 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003981 CmdArgs.push_back("-no-integrated-as");
3982
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003983 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3984 CmdArgs.push_back("-mdebug-pass");
3985 CmdArgs.push_back("Structure");
3986 }
3987 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3988 CmdArgs.push_back("-mdebug-pass");
3989 CmdArgs.push_back("Arguments");
3990 }
3991
Justin Lebar710a35f2016-01-25 22:36:35 +00003992 // Enable -mconstructor-aliases except on darwin, where we have to work around
3993 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3994 // aliases aren't supported.
3995 if (!getToolChain().getTriple().isOSDarwin() &&
3996 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003997 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003998
John McCall7ef5cb32011-03-18 02:56:14 +00003999 // Darwin's kernel doesn't support guard variables; just die if we
4000 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004001 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004002 CmdArgs.push_back("-fforbid-guard-variables");
4003
Akira Hatanaka02028482015-11-12 17:21:22 +00004004 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4005 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004006 CmdArgs.push_back("-mms-bitfields");
4007 }
John McCall8517abc2010-02-19 02:45:38 +00004008
Daniel Dunbar306945d2009-09-16 06:17:29 +00004009 // This is a coarse approximation of what llvm-gcc actually does, both
4010 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4011 // complicated ways.
4012 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004013 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4014 options::OPT_fno_asynchronous_unwind_tables,
4015 (getToolChain().IsUnwindTablesDefault() ||
4016 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4017 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004018 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4019 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004020 CmdArgs.push_back("-munwind-tables");
4021
Chandler Carruth05fb5852012-11-21 23:40:23 +00004022 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004023
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004024 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4025 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004026 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004027 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004028
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004029 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004030 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004031
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004032 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004033 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004034 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004035 }
4036
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004037 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004038 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004039 if (!CPU.empty()) {
4040 CmdArgs.push_back("-target-cpu");
4041 CmdArgs.push_back(Args.MakeArgString(CPU));
4042 }
4043
Rafael Espindolaeb265472013-08-21 21:59:03 +00004044 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4045 CmdArgs.push_back("-mfpmath");
4046 CmdArgs.push_back(A->getValue());
4047 }
4048
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004049 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004050 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004051
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004052 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004053 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004054 default:
4055 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004056
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004057 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004058 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004059 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004060 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004061 // Use the effective triple, which takes into account the deployment target.
4062 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004063 break;
4064
Tim Northover573cbee2014-05-24 12:52:07 +00004065 case llvm::Triple::aarch64:
4066 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004067 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004068 break;
4069
Eric Christopher0b26a612010-03-02 02:41:08 +00004070 case llvm::Triple::mips:
4071 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004072 case llvm::Triple::mips64:
4073 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004074 AddMIPSTargetArgs(Args, CmdArgs);
4075 break;
4076
Ulrich Weigand8afad612014-07-28 13:17:52 +00004077 case llvm::Triple::ppc:
4078 case llvm::Triple::ppc64:
4079 case llvm::Triple::ppc64le:
4080 AddPPCTargetArgs(Args, CmdArgs);
4081 break;
4082
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004083 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004084 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004085 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004086 AddSparcTargetArgs(Args, CmdArgs);
4087 break;
4088
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004089 case llvm::Triple::x86:
4090 case llvm::Triple::x86_64:
4091 AddX86TargetArgs(Args, CmdArgs);
4092 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004093
4094 case llvm::Triple::hexagon:
4095 AddHexagonTargetArgs(Args, CmdArgs);
4096 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004097
4098 case llvm::Triple::wasm32:
4099 case llvm::Triple::wasm64:
4100 AddWebAssemblyTargetArgs(Args, CmdArgs);
4101 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004102 }
4103
Douglas Katzman3459ce22015-10-08 04:24:12 +00004104 // The 'g' groups options involve a somewhat intricate sequence of decisions
4105 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004106 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004107 // * what level of debug info to generate
4108 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004109 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004110 // This avoids having to monkey around further in cc1 other than to disable
4111 // codeview if not running in a Windows environment. Perhaps even that
4112 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004113 unsigned DwarfVersion = 0;
4114 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4115 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004116 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4117 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004118 bool EmitCodeView = false;
4119
Hans Wennborg75958c42013-08-08 00:17:41 +00004120 // Add clang-cl arguments.
4121 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004122 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004123
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004124 // Pass the linker version in use.
4125 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4126 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004127 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004128 }
4129
Eric Christopherb7d97e92013-04-03 01:58:53 +00004130 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004131 CmdArgs.push_back("-momit-leaf-frame-pointer");
4132
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004133 // Explicitly error on some things we know we don't support and can't just
4134 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004135 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004136 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4137 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004138 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004139 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004140 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4141 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004142 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004143 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004144 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004145 }
4146
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004147 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004148 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004149 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004150 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004151 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4152 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004153 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004154 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004155 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004156
Chad Rosierbe10f982011-08-02 17:58:04 +00004157 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004158 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004159 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4160 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004161 }
4162
Rafael Espindola08a692a2010-03-07 04:46:18 +00004163 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004164 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004165 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004166 // If the last option explicitly specified a debug-info level, use it.
4167 if (A->getOption().matches(options::OPT_gN_Group)) {
4168 DebugInfoKind = DebugLevelToInfoKind(*A);
4169 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4170 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4171 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4172 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4173 A->getIndex() > SplitDwarfArg->getIndex())
4174 SplitDwarfArg = nullptr;
4175 } else
4176 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004177 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004178 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004179
Paul Robinson0334a042015-12-19 19:41:48 +00004180 // If a debugger tuning argument appeared, remember it.
4181 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4182 options::OPT_ggdbN_Group)) {
4183 if (A->getOption().matches(options::OPT_glldb))
4184 DebuggerTuning = llvm::DebuggerKind::LLDB;
4185 else if (A->getOption().matches(options::OPT_gsce))
4186 DebuggerTuning = llvm::DebuggerKind::SCE;
4187 else
4188 DebuggerTuning = llvm::DebuggerKind::GDB;
4189 }
4190
4191 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004192 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004193 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004194 DwarfVersion = DwarfVersionNum(A->getSpelling());
4195
Reid Kleckner124955a2015-08-05 18:51:13 +00004196 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004197 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4198 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4199 // DwarfVersion remains at 0 if no explicit choice was made.
4200 CmdArgs.push_back("-gcodeview");
4201 } else if (DwarfVersion == 0 &&
4202 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4203 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4204 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004205
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004206 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4207 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004208
4209 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004210 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004211 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004212 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004213
Eric Christopher138c32b2013-09-13 22:37:55 +00004214 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004215 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004216 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004217 CmdArgs.push_back("-dwarf-ext-refs");
4218 CmdArgs.push_back("-fmodule-format=obj");
4219 }
4220
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004221 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4222 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004223 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004224 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004225 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004226 CmdArgs.push_back("-backend-option");
4227 CmdArgs.push_back("-split-dwarf=Enable");
4228 }
4229
Douglas Katzman3459ce22015-10-08 04:24:12 +00004230 // After we've dealt with all combinations of things that could
4231 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4232 // figure out if we need to "upgrade" it to standalone debug info.
4233 // We parse these two '-f' options whether or not they will be used,
4234 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4235 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4236 options::OPT_fno_standalone_debug,
4237 getToolChain().GetDefaultStandaloneDebug());
4238 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4239 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004240 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4241 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004242
Eric Christopher138c32b2013-09-13 22:37:55 +00004243 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4244 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4245 CmdArgs.push_back("-backend-option");
4246 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4247 }
Eric Christophereec89c22013-06-18 00:03:50 +00004248
Eric Christopher0d403d22014-02-14 01:27:03 +00004249 // -gdwarf-aranges turns on the emission of the aranges section in the
4250 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004251 // Always enabled on the PS4.
4252 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004253 CmdArgs.push_back("-backend-option");
4254 CmdArgs.push_back("-generate-arange-section");
4255 }
4256
David Blaikief36d9ba2014-01-27 18:52:43 +00004257 if (Args.hasFlag(options::OPT_fdebug_types_section,
4258 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004259 CmdArgs.push_back("-backend-option");
4260 CmdArgs.push_back("-generate-type-units");
4261 }
Eric Christophereec89c22013-06-18 00:03:50 +00004262
Dan Gohmana5b804b2016-01-07 00:50:27 +00004263 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4264 // default.
4265 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4266 Triple.getArch() == llvm::Triple::wasm32 ||
4267 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004268
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004269 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004270 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004271 CmdArgs.push_back("-ffunction-sections");
4272 }
4273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004274 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4275 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004276 CmdArgs.push_back("-fdata-sections");
4277 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004278
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004279 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004280 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004281 CmdArgs.push_back("-fno-unique-section-names");
4282
Chris Lattner3c77a352010-06-22 00:03:40 +00004283 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4284
Diego Novilloa0545962015-07-10 18:00:07 +00004285 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004286
Paul Robinsond083b9a2015-12-16 17:25:27 +00004287 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4288 if (getToolChain().getTriple().isPS4CPU())
4289 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4290
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004291 // Pass options for controlling the default header search paths.
4292 if (Args.hasArg(options::OPT_nostdinc)) {
4293 CmdArgs.push_back("-nostdsysteminc");
4294 CmdArgs.push_back("-nobuiltininc");
4295 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004296 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004297 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004298 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4299 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4300 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004301
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004302 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004303 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004304 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004305
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004306 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4307
Ted Kremenekf7639e12012-03-06 20:06:33 +00004308 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004309 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004310 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004311 options::OPT_ccc_arcmt_modify,
4312 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004313 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004314 switch (A->getOption().getID()) {
4315 default:
4316 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004317 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004318 CmdArgs.push_back("-arcmt-check");
4319 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004320 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004321 CmdArgs.push_back("-arcmt-modify");
4322 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004323 case options::OPT_ccc_arcmt_migrate:
4324 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004325 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004326 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004327
4328 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4329 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004330 break;
John McCalld70fb982011-06-15 23:25:17 +00004331 }
4332 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004333 } else {
4334 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4335 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4336 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004337 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004338
Ted Kremenekf7639e12012-03-06 20:06:33 +00004339 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4340 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004341 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4342 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004343 }
4344 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004345 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004346
4347 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004348 options::OPT_objcmt_migrate_subscripting,
4349 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004350 // None specified, means enable them all.
4351 CmdArgs.push_back("-objcmt-migrate-literals");
4352 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004353 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004354 } else {
4355 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4356 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004357 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004358 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004359 } else {
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004374 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004375 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004376 }
4377
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004378 // Add preprocessing options like -I, -D, etc. if we are using the
4379 // preprocessor.
4380 //
4381 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004382 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004383 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4384 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004385
Rafael Espindolaa7431922011-07-21 23:40:37 +00004386 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4387 // that "The compiler can only warn and ignore the option if not recognized".
4388 // When building with ccache, it will pass -D options to clang even on
4389 // preprocessed inputs and configure concludes that -fPIC is not supported.
4390 Args.ClaimAllArgs(options::OPT_D);
4391
Alp Toker7874bdc2013-11-15 20:40:58 +00004392 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004393 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4394 if (A->getOption().matches(options::OPT_O4)) {
4395 CmdArgs.push_back("-O3");
4396 D.Diag(diag::warn_O4_is_O3);
4397 } else {
4398 A->render(Args, CmdArgs);
4399 }
4400 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004401
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004402 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004403 for (const Arg *A :
4404 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4405 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004406 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004407 }
4408
Rafael Espindola577637a2015-01-03 00:06:04 +00004409 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004410
Richard Smith3be1cb22014-08-07 00:24:21 +00004411 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004412 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004413 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4414 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004415 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004416 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004417
4418 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004419 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004420 //
4421 // If a std is supplied, only add -trigraphs if it follows the
4422 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004423 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004424 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4425 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004426 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004427 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004428 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004429 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004430 else
4431 Std->render(Args, CmdArgs);
4432
Nico Weber00721502014-12-23 22:32:37 +00004433 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004434 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004435 options::OPT_ftrigraphs,
4436 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004437 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004438 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004439 } else {
4440 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004441 //
4442 // FIXME: Clang doesn't correctly handle -std= when the input language
4443 // doesn't match. For the time being just ignore this for C++ inputs;
4444 // eventually we want to do all the standard defaulting here instead of
4445 // splitting it between the driver and clang -cc1.
4446 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004447 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4448 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004449 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004450 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004451
Nico Weber00721502014-12-23 22:32:37 +00004452 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4453 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004454 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004455
Richard Smith282b4492013-09-04 22:50:31 +00004456 // GCC's behavior for -Wwrite-strings is a bit strange:
4457 // * In C, this "warning flag" changes the types of string literals from
4458 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4459 // for the discarded qualifier.
4460 // * In C++, this is just a normal warning flag.
4461 //
4462 // Implementing this warning correctly in C is hard, so we follow GCC's
4463 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4464 // a non-const char* in C, rather than using this crude hack.
4465 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004466 // FIXME: This should behave just like a warning flag, and thus should also
4467 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4468 Arg *WriteStrings =
4469 Args.getLastArg(options::OPT_Wwrite_strings,
4470 options::OPT_Wno_write_strings, options::OPT_w);
4471 if (WriteStrings &&
4472 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004473 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004474 }
4475
Chandler Carruth61fbf622011-04-23 09:27:53 +00004476 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004477 // during C++ compilation, which it is by default. GCC keeps this define even
4478 // in the presence of '-w', match this behavior bug-for-bug.
4479 if (types::isCXX(InputType) &&
4480 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4481 true)) {
4482 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004483 }
4484
Chandler Carruthe0391482010-05-22 02:21:53 +00004485 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4486 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4487 if (Asm->getOption().matches(options::OPT_fasm))
4488 CmdArgs.push_back("-fgnu-keywords");
4489 else
4490 CmdArgs.push_back("-fno-gnu-keywords");
4491 }
4492
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004493 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4494 CmdArgs.push_back("-fno-dwarf-directory-asm");
4495
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004496 if (ShouldDisableAutolink(Args, getToolChain()))
4497 CmdArgs.push_back("-fno-autolink");
4498
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004499 // Add in -fdebug-compilation-dir if necessary.
4500 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004501
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004502 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4503 StringRef Map = A->getValue();
4504 if (Map.find('=') == StringRef::npos)
4505 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4506 else
4507 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4508 A->claim();
4509 }
4510
Richard Smith9a568822011-11-21 19:36:32 +00004511 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4512 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004513 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004514 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004515 }
4516
Richard Smith79c927b2013-11-06 19:31:51 +00004517 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4518 CmdArgs.push_back("-foperator-arrow-depth");
4519 CmdArgs.push_back(A->getValue());
4520 }
4521
Richard Smith9a568822011-11-21 19:36:32 +00004522 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4523 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004524 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004525 }
4526
Richard Smitha3d3bd22013-05-08 02:12:03 +00004527 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4528 CmdArgs.push_back("-fconstexpr-steps");
4529 CmdArgs.push_back(A->getValue());
4530 }
4531
Richard Smithb3a14522013-02-22 01:59:51 +00004532 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4533 CmdArgs.push_back("-fbracket-depth");
4534 CmdArgs.push_back(A->getValue());
4535 }
4536
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004537 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4538 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004539 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004540 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004541 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4542 } else
4543 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004544 }
4545
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004546 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004547 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004548
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004549 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4550 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004551 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004552 }
David Chisnall5778fce2009-08-31 16:41:57 +00004553
Chris Lattnere23003d2010-01-09 21:54:33 +00004554 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4555 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004556 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004557 }
4558
Chris Lattnerb35583d2010-04-07 20:49:23 +00004559 CmdArgs.push_back("-ferror-limit");
4560 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004561 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004562 else
4563 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004564
Chandler Carrutha77a7272010-05-06 04:55:18 +00004565 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4566 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004567 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004568 }
4569
4570 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4571 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004572 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004573 }
4574
Richard Smithf6f003a2011-12-16 19:06:07 +00004575 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4576 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004577 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004578 }
4579
Nick Lewycky24653262014-12-16 21:39:02 +00004580 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4581 CmdArgs.push_back("-fspell-checking-limit");
4582 CmdArgs.push_back(A->getValue());
4583 }
4584
Daniel Dunbar2c978472009-11-04 06:24:47 +00004585 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004586 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004587 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004588 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004589 } else {
4590 // If -fmessage-length=N was not specified, determine whether this is a
4591 // terminal and, if so, implicitly define -fmessage-length appropriately.
4592 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004593 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004594 }
4595
John McCallb4a99d32013-02-19 01:57:35 +00004596 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4597 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4598 options::OPT_fvisibility_ms_compat)) {
4599 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4600 CmdArgs.push_back("-fvisibility");
4601 CmdArgs.push_back(A->getValue());
4602 } else {
4603 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4604 CmdArgs.push_back("-fvisibility");
4605 CmdArgs.push_back("hidden");
4606 CmdArgs.push_back("-ftype-visibility");
4607 CmdArgs.push_back("default");
4608 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004609 }
4610
Douglas Gregor08329632010-06-15 17:05:35 +00004611 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004612
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004613 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4614
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004615 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004616 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4617 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004618 CmdArgs.push_back("-ffreestanding");
4619
Daniel Dunbare357d562009-12-03 18:42:11 +00004620 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004621 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004622 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004623 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004624 // Emulated TLS is enabled by default on Android, and can be enabled manually
4625 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004626 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004627 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4628 EmulatedTLSDefault))
4629 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004630 // AltiVec-like language extensions aren't relevant for assembling.
4631 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004632 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004633 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4634 }
Richard Trieu91844232012-06-26 18:18:47 +00004635 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4636 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004637
Alexey Bataevdb390212015-05-20 04:24:19 +00004638 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004639 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4640 options::OPT_fno_openmp, false))
4641 switch (getOpenMPRuntime(getToolChain(), Args)) {
4642 case OMPRT_OMP:
4643 case OMPRT_IOMP5:
4644 // Clang can generate useful OpenMP code for these two runtime libraries.
4645 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004646
4647 // If no option regarding the use of TLS in OpenMP codegeneration is
4648 // given, decide a default based on the target. Otherwise rely on the
4649 // options and pass the right information to the frontend.
4650 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004651 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004652 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004653 break;
4654 default:
4655 // By default, if Clang doesn't know how to generate useful OpenMP code
4656 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4657 // down to the actual compilation.
4658 // FIXME: It would be better to have a mode which *only* omits IR
4659 // generation based on the OpenMP support so that we get consistent
4660 // semantic analysis, etc.
4661 break;
4662 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004663
Peter Collingbourne32701642013-11-01 18:16:25 +00004664 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004665 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004666
Eric Christopher459d2712013-02-19 06:16:53 +00004667 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004668 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4669 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4670 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4671 Arch == llvm::Triple::ppc64le))
4672 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4673 << "ppc/ppc64/ppc64le";
4674 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004675
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004676 // -fzvector is incompatible with -faltivec.
4677 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4678 if (Args.hasArg(options::OPT_faltivec))
4679 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4680 << "-faltivec";
4681
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004682 if (getToolChain().SupportsProfiling())
4683 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004684
4685 // -flax-vector-conversions is default.
4686 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4687 options::OPT_fno_lax_vector_conversions))
4688 CmdArgs.push_back("-fno-lax-vector-conversions");
4689
John Brawna7b4ec02015-08-10 11:11:28 +00004690 if (Args.getLastArg(options::OPT_fapple_kext) ||
4691 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004692 CmdArgs.push_back("-fapple-kext");
4693
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004694 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004695 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004696 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004697 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4698 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004699
4700 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4701 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004702 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004703 }
4704
Bob Wilson14adb362012-02-03 06:27:22 +00004705 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004706
Chandler Carruth6e501032011-03-27 00:04:55 +00004707 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4708 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004709 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004710 if (A->getOption().matches(options::OPT_fwrapv))
4711 CmdArgs.push_back("-fwrapv");
4712 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4713 options::OPT_fno_strict_overflow)) {
4714 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4715 CmdArgs.push_back("-fwrapv");
4716 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004717
4718 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4719 options::OPT_fno_reroll_loops))
4720 if (A->getOption().matches(options::OPT_freroll_loops))
4721 CmdArgs.push_back("-freroll-loops");
4722
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004723 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004724 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4725 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004726
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004727 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4728
Daniel Dunbar4930e332009-11-17 08:07:36 +00004729 // -stack-protector=0 is default.
4730 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004731 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4732 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4733 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4734 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4735 Args.ClaimAllArgs(options::OPT_fstack_protector);
4736 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004737 options::OPT_fstack_protector_all,
4738 options::OPT_fstack_protector_strong,
4739 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004740 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004741 StackProtectorLevel = std::max<unsigned>(
4742 LangOptions::SSPOn,
4743 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004744 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004745 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004746 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004747 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004748 } else {
4749 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004750 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004751 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004752 if (StackProtectorLevel) {
4753 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004754 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004755 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004756
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004757 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004758 for (const Arg *A : Args.filtered(options::OPT__param)) {
4759 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004760 if (Str.startswith("ssp-buffer-size=")) {
4761 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004762 CmdArgs.push_back("-stack-protector-buffer-size");
4763 // FIXME: Verify the argument is a valid integer.
4764 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004765 }
Sean Silva14facf32015-06-09 01:57:17 +00004766 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004767 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004768 }
4769
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004770 // Translate -mstackrealign
4771 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004772 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004773 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004774
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004775 if (Args.hasArg(options::OPT_mstack_alignment)) {
4776 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4777 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004778 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004779
Hans Wennborg77dc2362015-01-20 19:45:50 +00004780 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4781 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4782
4783 if (!Size.empty())
4784 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4785 else
4786 CmdArgs.push_back("-mstack-probe-size=0");
4787 }
4788
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004789 switch (getToolChain().getArch()) {
4790 case llvm::Triple::aarch64:
4791 case llvm::Triple::aarch64_be:
4792 case llvm::Triple::arm:
4793 case llvm::Triple::armeb:
4794 case llvm::Triple::thumb:
4795 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004796 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004797 break;
4798
4799 default:
4800 break;
4801 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004802
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004803 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4804 options::OPT_mno_restrict_it)) {
4805 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4806 CmdArgs.push_back("-backend-option");
4807 CmdArgs.push_back("-arm-restrict-it");
4808 } else {
4809 CmdArgs.push_back("-backend-option");
4810 CmdArgs.push_back("-arm-no-restrict-it");
4811 }
James Y Knight2db38f32015-08-15 03:45:25 +00004812 } else if (Triple.isOSWindows() &&
4813 (Triple.getArch() == llvm::Triple::arm ||
4814 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004815 // Windows on ARM expects restricted IT blocks
4816 CmdArgs.push_back("-backend-option");
4817 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004818 }
4819
Daniel Dunbard18049a2009-04-07 21:16:11 +00004820 // Forward -f options with positive and negative forms; we translate
4821 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004822 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4823 StringRef fname = A->getValue();
4824 if (!llvm::sys::fs::exists(fname))
4825 D.Diag(diag::err_drv_no_such_file) << fname;
4826 else
4827 A->render(Args, CmdArgs);
4828 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004829
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004830 // -fbuiltin is default unless -mkernel is used.
4831 bool UseBuiltins =
4832 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4833 !Args.hasArg(options::OPT_mkernel));
4834 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004835 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004836
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004837 // -ffreestanding implies -fno-builtin.
4838 if (Args.hasArg(options::OPT_ffreestanding))
4839 UseBuiltins = false;
4840
4841 // Process the -fno-builtin-* options.
4842 for (const auto &Arg : Args) {
4843 const Option &O = Arg->getOption();
4844 if (!O.matches(options::OPT_fno_builtin_))
4845 continue;
4846
4847 Arg->claim();
4848 // If -fno-builtin is specified, then there's no need to pass the option to
4849 // the frontend.
4850 if (!UseBuiltins)
4851 continue;
4852
4853 StringRef FuncName = Arg->getValue();
4854 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4855 }
4856
Nuno Lopes13c88c72009-12-16 16:59:22 +00004857 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4858 options::OPT_fno_assume_sane_operator_new))
4859 CmdArgs.push_back("-fno-assume-sane-operator-new");
4860
Daniel Dunbar4930e332009-11-17 08:07:36 +00004861 // -fblocks=0 is default.
4862 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004863 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004864 (Args.hasArg(options::OPT_fgnu_runtime) &&
4865 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4866 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004867 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004869 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004870 !getToolChain().hasBlocksRuntime())
4871 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004872 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004873
Richard Smith47972af2015-06-16 00:08:24 +00004874 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004875 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004876 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004877 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004878 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4880 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004881 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004882 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004883 HaveModules = true;
4884 }
4885 }
4886
Richard Smith47972af2015-06-16 00:08:24 +00004887 // -fmodule-maps enables implicit reading of module map files. By default,
4888 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004889 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4890 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004891 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004892 }
4893
Daniel Jasperac42b752013-10-21 06:34:34 +00004894 // -fmodules-decluse checks that modules used are declared so (off by
4895 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004896 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004897 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004898 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004899 }
4900
Daniel Jasper962b38e2014-04-11 11:47:45 +00004901 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4902 // all #included headers are part of modules.
4903 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004904 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004905 CmdArgs.push_back("-fmodules-strict-decluse");
4906 }
4907
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004908 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4909 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4910 options::OPT_fno_implicit_modules)) {
4911 CmdArgs.push_back("-fno-implicit-modules");
4912 }
4913
Daniel Jasperac42b752013-10-21 06:34:34 +00004914 // -fmodule-name specifies the module that is currently being built (or
4915 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004916 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004917
Richard Smith9887d792014-10-17 01:42:53 +00004918 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004919 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004920 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004921
Richard Smithe842a472014-10-22 02:05:46 +00004922 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004923 if (HaveModules)
4924 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4925 else
4926 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004927
4928 // -fmodule-cache-path specifies where our implicitly-built module files
4929 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004930 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004931 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004932 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004933 if (HaveModules) {
4934 if (C.isForDiagnostics()) {
4935 // When generating crash reports, we want to emit the modules along with
4936 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004937 Path = Output.getFilename();
4938 llvm::sys::path::replace_extension(Path, ".cache");
4939 llvm::sys::path::append(Path, "modules");
4940 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004941 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004942 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004943 llvm::sys::path::append(Path, "org.llvm.clang.");
4944 appendUserToPath(Path);
4945 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004946 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004947 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004948 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4949 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004950 }
4951
4952 // When building modules and generating crashdumps, we need to dump a module
4953 // dependency VFS alongside the output.
4954 if (HaveModules && C.isForDiagnostics()) {
4955 SmallString<128> VFSDir(Output.getFilename());
4956 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004957 // Add the cache directory as a temp so the crash diagnostics pick it up.
4958 C.addTempFile(Args.MakeArgString(VFSDir));
4959
Justin Bognera88f0122014-06-20 22:59:50 +00004960 llvm::sys::path::append(VFSDir, "vfs");
4961 CmdArgs.push_back("-module-dependency-dir");
4962 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004963 }
4964
Richard Smith9887d792014-10-17 01:42:53 +00004965 if (HaveModules)
4966 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004967
Douglas Gregor35b04d62013-02-07 19:01:24 +00004968 // Pass through all -fmodules-ignore-macro arguments.
4969 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004970 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4971 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004972
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004973 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4974
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004975 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4976 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4977 D.Diag(diag::err_drv_argument_not_allowed_with)
4978 << A->getAsString(Args) << "-fbuild-session-timestamp";
4979
4980 llvm::sys::fs::file_status Status;
4981 if (llvm::sys::fs::status(A->getValue(), Status))
4982 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004983 CmdArgs.push_back(Args.MakeArgString(
4984 "-fbuild-session-timestamp=" +
4985 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004986 }
4987
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004988 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004989 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4990 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004991 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4992
4993 Args.AddLastArg(CmdArgs,
4994 options::OPT_fmodules_validate_once_per_build_session);
4995 }
4996
Ben Langmuirdcf73862014-03-12 00:06:17 +00004997 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4998
John McCalldfea9982010-04-09 19:12:06 +00004999 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005000 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005001 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005002 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005003
Anders Carlssond470fef2010-11-21 00:09:52 +00005004 // -felide-constructors is the default.
5005 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005006 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005007 CmdArgs.push_back("-fno-elide-constructors");
5008
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005009 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005010
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005011 if (KernelOrKext || (types::isCXX(InputType) &&
5012 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5013 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005014 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005015
Tony Linthicum76329bf2011-12-12 21:14:55 +00005016 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005017 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5018 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005019 CmdArgs.push_back("-fshort-enums");
5020
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005021 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005022 if (Arg *A = Args.getLastArg(
5023 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5024 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5025 if (A->getOption().matches(options::OPT_funsigned_char) ||
5026 A->getOption().matches(options::OPT_fno_signed_char)) {
5027 CmdArgs.push_back("-fno-signed-char");
5028 }
5029 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005030 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005031 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005032
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005033 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005034 if (!Args.hasFlag(
5035 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5036 !IsWindowsCygnus && !IsWindowsGNU &&
5037 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5038 getToolChain().getArch() != llvm::Triple::hexagon &&
5039 getToolChain().getArch() != llvm::Triple::xcore &&
5040 ((getToolChain().getTriple().getVendor() !=
5041 llvm::Triple::MipsTechnologies) ||
5042 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005043 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005044 CmdArgs.push_back("-fno-use-cxa-atexit");
5045
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005046 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005047 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005048 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005049 CmdArgs.push_back("-fms-extensions");
5050
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005051 // -fno-use-line-directives is default.
5052 if (Args.hasFlag(options::OPT_fuse_line_directives,
5053 options::OPT_fno_use_line_directives, false))
5054 CmdArgs.push_back("-fuse-line-directives");
5055
Francois Pichet1b4f1632011-09-17 04:32:15 +00005056 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005057 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005058 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005059 (IsWindowsMSVC &&
5060 Args.hasFlag(options::OPT_fms_extensions,
5061 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005062 CmdArgs.push_back("-fms-compatibility");
5063
David Majnemerc371ff02015-03-22 08:39:22 +00005064 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005065 VersionTuple MSVT = visualstudio::getMSVCVersion(
5066 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5067 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005068 CmdArgs.push_back(
5069 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005070
David Majnemer8db91762015-05-18 04:49:30 +00005071 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5072 if (ImplyVCPPCXXVer) {
5073 if (IsMSVC2015Compatible)
5074 CmdArgs.push_back("-std=c++14");
5075 else
5076 CmdArgs.push_back("-std=c++11");
5077 }
5078
Eric Christopher5ecce122013-02-18 00:38:31 +00005079 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005080 if (Args.hasFlag(options::OPT_fborland_extensions,
5081 options::OPT_fno_borland_extensions, false))
5082 CmdArgs.push_back("-fborland-extensions");
5083
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005084 // -fno-declspec is default, except for PS4.
5085 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5086 getToolChain().getTriple().isPS4()))
5087 CmdArgs.push_back("-fdeclspec");
5088 else if (Args.hasArg(options::OPT_fno_declspec))
5089 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5090
David Majnemerc371ff02015-03-22 08:39:22 +00005091 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5092 // than 19.
5093 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5094 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005095 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005096 CmdArgs.push_back("-fno-threadsafe-statics");
5097
Francois Pichet02744872011-09-01 16:38:08 +00005098 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5099 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005100 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005101 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005102 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005103
Chandler Carruthe03aa552010-04-17 20:17:31 +00005104 // -fgnu-keywords default varies depending on language; only pass if
5105 // specified.
5106 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005107 options::OPT_fno_gnu_keywords))
5108 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005109
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005110 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005111 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005112 CmdArgs.push_back("-fgnu89-inline");
5113
Chad Rosier9c76d242012-03-15 22:31:42 +00005114 if (Args.hasArg(options::OPT_fno_inline))
5115 CmdArgs.push_back("-fno-inline");
5116
Chad Rosier64d6be92012-03-06 21:17:19 +00005117 if (Args.hasArg(options::OPT_fno_inline_functions))
5118 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005119
John McCall5fb5df92012-06-20 06:18:46 +00005120 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005121
John McCall5fb5df92012-06-20 06:18:46 +00005122 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005123 // legacy is the default. Except for deployment taget of 10.5,
5124 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5125 // gets ignored silently.
5126 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005127 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5128 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005129 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005130 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005131 if (getToolChain().UseObjCMixedDispatch())
5132 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5133 else
5134 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5135 }
5136 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005137
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005138 // When ObjectiveC legacy runtime is in effect on MacOSX,
5139 // turn on the option to do Array/Dictionary subscripting
5140 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005141 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005142 getToolChain().getTriple().isMacOSX() &&
5143 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5144 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005145 objcRuntime.isNeXTFamily())
5146 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005147
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005148 // -fencode-extended-block-signature=1 is default.
5149 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5150 CmdArgs.push_back("-fencode-extended-block-signature");
5151 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005152
John McCall24fc0de2011-07-06 00:26:06 +00005153 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5154 // NOTE: This logic is duplicated in ToolChains.cpp.
5155 bool ARC = isObjCAutoRefCount(Args);
5156 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005157 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005158
John McCall24fc0de2011-07-06 00:26:06 +00005159 CmdArgs.push_back("-fobjc-arc");
5160
Chandler Carruth491db322011-11-04 07:34:47 +00005161 // FIXME: It seems like this entire block, and several around it should be
5162 // wrapped in isObjC, but for now we just use it here as this is where it
5163 // was being used previously.
5164 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5165 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5166 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5167 else
5168 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5169 }
5170
John McCall24fc0de2011-07-06 00:26:06 +00005171 // Allow the user to enable full exceptions code emission.
5172 // We define off for Objective-CC, on for Objective-C++.
5173 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5174 options::OPT_fno_objc_arc_exceptions,
5175 /*default*/ types::isCXX(InputType)))
5176 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005177
John McCall24fc0de2011-07-06 00:26:06 +00005178 }
5179
5180 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5181 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005182 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005183 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005184
John McCall24fc0de2011-07-06 00:26:06 +00005185 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5186 // takes precedence.
5187 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5188 if (!GCArg)
5189 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5190 if (GCArg) {
5191 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005193 } else if (getToolChain().SupportsObjCGC()) {
5194 GCArg->render(Args, CmdArgs);
5195 } else {
5196 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005197 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005198 }
5199 }
5200
John McCallfbe5ed72015-11-05 19:19:56 +00005201 // Pass down -fobjc-weak or -fno-objc-weak if present.
5202 if (types::isObjC(InputType)) {
5203 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5204 options::OPT_fno_objc_weak);
5205 if (!WeakArg) {
5206 // nothing to do
5207 } else if (GCArg) {
5208 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5209 D.Diag(diag::err_objc_weak_with_gc);
5210 } else if (!objcRuntime.allowsWeak()) {
5211 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5212 D.Diag(diag::err_objc_weak_unsupported);
5213 } else {
5214 WeakArg->render(Args, CmdArgs);
5215 }
5216 }
5217
Bob Wilsonb111ec92015-03-02 19:01:14 +00005218 if (Args.hasFlag(options::OPT_fapplication_extension,
5219 options::OPT_fno_application_extension, false))
5220 CmdArgs.push_back("-fapplication-extension");
5221
Reid Klecknerc542d372014-06-27 17:02:02 +00005222 // Handle GCC-style exception args.
5223 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005224 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5225 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005226
Tim Northovere931f9f2015-10-30 16:30:41 +00005227 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005228 CmdArgs.push_back("-fsjlj-exceptions");
5229
5230 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005231 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5232 options::OPT_fno_assume_sane_operator_new))
5233 CmdArgs.push_back("-fno-assume-sane-operator-new");
5234
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005235 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5236 // most platforms.
5237 if (Args.hasFlag(options::OPT_fsized_deallocation,
5238 options::OPT_fno_sized_deallocation, false))
5239 CmdArgs.push_back("-fsized-deallocation");
5240
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005241 // -fconstant-cfstrings is default, and may be subject to argument translation
5242 // on Darwin.
5243 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5244 options::OPT_fno_constant_cfstrings) ||
5245 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5246 options::OPT_mno_constant_cfstrings))
5247 CmdArgs.push_back("-fno-constant-cfstrings");
5248
John Thompsoned4e2952009-11-05 20:14:16 +00005249 // -fshort-wchar default varies depending on platform; only
5250 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005251 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5252 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005253 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005254
Hans Wennborg28c96312013-07-31 23:39:13 +00005255 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005256 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005258 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005259
Daniel Dunbar096ed292011-10-05 21:04:55 +00005260 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5261 // -fno-pack-struct doesn't apply to -fpack-struct=.
5262 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005263 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005264 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005265 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005266 } else if (Args.hasFlag(options::OPT_fpack_struct,
5267 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005268 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005269 }
5270
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005271 // Handle -fmax-type-align=N and -fno-type-align
5272 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5273 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5274 if (!SkipMaxTypeAlign) {
5275 std::string MaxTypeAlignStr = "-fmax-type-align=";
5276 MaxTypeAlignStr += A->getValue();
5277 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5278 }
5279 } else if (getToolChain().getTriple().isOSDarwin()) {
5280 if (!SkipMaxTypeAlign) {
5281 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5282 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5283 }
5284 }
5285
John Brawna7b4ec02015-08-10 11:11:28 +00005286 // -fcommon is the default unless compiling kernel code or the target says so
5287 bool NoCommonDefault =
5288 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5289 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5290 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005291 CmdArgs.push_back("-fno-common");
5292
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005293 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005294 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005295 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005296 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005297 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005299
Daniel Dunbar6358d682010-10-15 22:30:42 +00005300 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005301 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005302 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005304
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005305 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005306 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5307 StringRef value = inputCharset->getValue();
5308 if (value != "UTF-8")
5309 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5310 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005311 }
5312
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005313 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005314 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5315 StringRef value = execCharset->getValue();
5316 if (value != "UTF-8")
5317 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5318 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005319 }
5320
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005321 // -fcaret-diagnostics is default.
5322 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5323 options::OPT_fno_caret_diagnostics, true))
5324 CmdArgs.push_back("-fno-caret-diagnostics");
5325
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005326 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005327 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005328 options::OPT_fno_diagnostics_fixit_info))
5329 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005330
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005331 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005332 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005333 options::OPT_fno_diagnostics_show_option))
5334 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005335
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005336 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005337 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005338 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005339 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005340 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005341
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005342 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005343 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005344 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005345 }
5346
Chandler Carruthb6766f02011-03-27 01:50:55 +00005347 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005348 options::OPT_fdiagnostics_show_note_include_stack,
5349 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005350 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005351 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005352 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5353 else
5354 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5355 }
5356
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005357 // Color diagnostics are the default, unless the terminal doesn't support
5358 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005359 // Support both clang's -f[no-]color-diagnostics and gcc's
5360 // -f[no-]diagnostics-colors[=never|always|auto].
5361 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005362 for (const auto &Arg : Args) {
5363 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005364 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5365 !O.matches(options::OPT_fdiagnostics_color) &&
5366 !O.matches(options::OPT_fno_color_diagnostics) &&
5367 !O.matches(options::OPT_fno_diagnostics_color) &&
5368 !O.matches(options::OPT_fdiagnostics_color_EQ))
5369 continue;
5370
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005371 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005372 if (O.matches(options::OPT_fcolor_diagnostics) ||
5373 O.matches(options::OPT_fdiagnostics_color)) {
5374 ShowColors = Colors_On;
5375 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5376 O.matches(options::OPT_fno_diagnostics_color)) {
5377 ShowColors = Colors_Off;
5378 } else {
5379 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005380 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005381 if (value == "always")
5382 ShowColors = Colors_On;
5383 else if (value == "never")
5384 ShowColors = Colors_Off;
5385 else if (value == "auto")
5386 ShowColors = Colors_Auto;
5387 else
5388 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005389 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005390 }
5391 }
5392 if (ShowColors == Colors_On ||
5393 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005394 CmdArgs.push_back("-fcolor-diagnostics");
5395
Nico Rieck7857d462013-09-11 00:38:02 +00005396 if (Args.hasArg(options::OPT_fansi_escape_codes))
5397 CmdArgs.push_back("-fansi-escape-codes");
5398
Daniel Dunbardb097022009-06-08 21:13:54 +00005399 if (!Args.hasFlag(options::OPT_fshow_source_location,
5400 options::OPT_fno_show_source_location))
5401 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005402
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005404 true))
5405 CmdArgs.push_back("-fno-show-column");
5406
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005407 if (!Args.hasFlag(options::OPT_fspell_checking,
5408 options::OPT_fno_spell_checking))
5409 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005410
Chad Rosierc8e56e82012-12-05 21:08:21 +00005411 // -fno-asm-blocks is default.
5412 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5413 false))
5414 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005415
Steven Wucb0d13f2015-01-16 23:05:28 +00005416 // -fgnu-inline-asm is default.
5417 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5418 options::OPT_fno_gnu_inline_asm, true))
5419 CmdArgs.push_back("-fno-gnu-inline-asm");
5420
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005421 // Enable vectorization per default according to the optimization level
5422 // selected. For optimization levels that want vectorization we use the alias
5423 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005424 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005425 OptSpecifier VectorizeAliasOption =
5426 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005427 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005428 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005429 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005430
Chad Rosier136d67d2014-04-28 19:30:57 +00005431 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005432 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005433 OptSpecifier SLPVectAliasOption =
5434 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005435 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005436 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005437 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005438
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005439 // -fno-slp-vectorize-aggressive is default.
5440 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005441 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005442 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005443
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005444 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5445 A->render(Args, CmdArgs);
5446
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005447 // -fdollars-in-identifiers default varies depending on platform and
5448 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005449 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005450 options::OPT_fno_dollars_in_identifiers)) {
5451 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005452 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005453 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005454 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005455 }
5456
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005457 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5458 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005459 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005460 options::OPT_fno_unit_at_a_time)) {
5461 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005462 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005463 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005464
Eli Friedman055c9702011-11-02 01:53:16 +00005465 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5466 options::OPT_fno_apple_pragma_pack, false))
5467 CmdArgs.push_back("-fapple-pragma-pack");
5468
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005470 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5471 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005472 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005473 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005474 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005475
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005476// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5477//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005478// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005479#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005480 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005481 (getToolChain().getArch() == llvm::Triple::arm ||
5482 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005483 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5484 CmdArgs.push_back("-fno-builtin-strcat");
5485 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5486 CmdArgs.push_back("-fno-builtin-strcpy");
5487 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005488#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005489
Justin Bognera88f0122014-06-20 22:59:50 +00005490 // Enable rewrite includes if the user's asked for it or if we're generating
5491 // diagnostics.
5492 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5493 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005494 if (Args.hasFlag(options::OPT_frewrite_includes,
5495 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005496 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005497 CmdArgs.push_back("-frewrite-includes");
5498
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005499 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005500 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005501 options::OPT_traditional_cpp)) {
5502 if (isa<PreprocessJobAction>(JA))
5503 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005504 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005505 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005506 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005507
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005508 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005509 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005510
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005511 // Handle serialized diagnostics.
5512 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5513 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005514 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005515 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005516
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005517 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5518 CmdArgs.push_back("-fretain-comments-from-system-headers");
5519
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005520 // Forward -fcomment-block-commands to -cc1.
5521 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005522 // Forward -fparse-all-comments to -cc1.
5523 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005524
John Brawnad31ace2015-09-23 13:55:40 +00005525 // Turn -fplugin=name.so into -load name.so
5526 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5527 CmdArgs.push_back("-load");
5528 CmdArgs.push_back(A->getValue());
5529 A->claim();
5530 }
5531
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005532 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5533 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005534 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005535 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5536 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005537
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005538 // We translate this by hand to the -cc1 argument, since nightly test uses
5539 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005540 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005541 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005542 } else
Sean Silva14facf32015-06-09 01:57:17 +00005543 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005544 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005545
Bob Wilson23a55f12014-12-21 07:00:00 +00005546 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005547 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5548 // by the frontend.
5549 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5550 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005551
Daniel Dunbard67a3222009-03-30 06:36:42 +00005552 if (Output.getType() == types::TY_Dependencies) {
5553 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005554 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005555 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005556 CmdArgs.push_back(Output.getFilename());
5557 } else {
5558 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005559 }
5560
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005561 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005562
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005563 if (Input.isFilename())
5564 CmdArgs.push_back(Input.getFilename());
5565 else
5566 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005567
Chris Lattnere9d7d782009-11-03 19:50:27 +00005568 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5569
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005570 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005571
5572 // Optionally embed the -cc1 level arguments into the debug info, for build
5573 // analysis.
5574 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005575 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005576 for (const auto &Arg : Args)
5577 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005578
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005579 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005580 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005581 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005582 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005583 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005584 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005585 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005586 }
5587 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005588 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005589 }
5590
Eric Christopherd3804002013-02-22 20:12:52 +00005591 // Add the split debug info name to the command lines here so we
5592 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005593 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005594 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5595 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005596 const char *SplitDwarfOut;
5597 if (SplitDwarf) {
5598 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005599 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005600 CmdArgs.push_back(SplitDwarfOut);
5601 }
5602
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005603 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5604 // Include them with -fcuda-include-gpubinary.
5605 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005606 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005607 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005608 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005609 }
5610
Eric Christopherd3804002013-02-22 20:12:52 +00005611 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005612 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005613 Output.getType() == types::TY_Object &&
5614 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005615 auto CLCommand =
5616 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005617 C.addCommand(llvm::make_unique<FallbackCommand>(
5618 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005619 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005620 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005621 }
5622
Eric Christopherf1545832013-02-22 23:50:16 +00005623 // Handle the debug info splitting at object creation time if we're
5624 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005625 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005626 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005627 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005628
Roman Divacky178e01602011-02-10 16:52:03 +00005629 if (Arg *A = Args.getLastArg(options::OPT_pg))
5630 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005631 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5632 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005633
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005634 // Claim some arguments which clang supports automatically.
5635
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005636 // -fpch-preprocess is used with gcc to add a special marker in the output to
5637 // include the PCH file. Clang's PTH solution is completely transparent, so we
5638 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005639 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005640
Daniel Dunbar17731772009-03-23 19:03:36 +00005641 // Claim some arguments which clang doesn't support, but we don't
5642 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005643 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5644 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005645
Rafael Espindolab0092d72013-09-04 19:37:35 +00005646 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005647 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005648}
5649
John McCall5fb5df92012-06-20 06:18:46 +00005650/// Add options related to the Objective-C runtime/ABI.
5651///
5652/// Returns true if the runtime is non-fragile.
5653ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5654 ArgStringList &cmdArgs,
5655 RewriteKind rewriteKind) const {
5656 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005657 Arg *runtimeArg =
5658 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5659 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005660
5661 // Just forward -fobjc-runtime= to the frontend. This supercedes
5662 // options about fragility.
5663 if (runtimeArg &&
5664 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5665 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005666 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005667 if (runtime.tryParse(value)) {
5668 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005669 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005670 }
5671
5672 runtimeArg->render(args, cmdArgs);
5673 return runtime;
5674 }
5675
5676 // Otherwise, we'll need the ABI "version". Version numbers are
5677 // slightly confusing for historical reasons:
5678 // 1 - Traditional "fragile" ABI
5679 // 2 - Non-fragile ABI, version 1
5680 // 3 - Non-fragile ABI, version 2
5681 unsigned objcABIVersion = 1;
5682 // If -fobjc-abi-version= is present, use that to set the version.
5683 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005684 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005685 if (value == "1")
5686 objcABIVersion = 1;
5687 else if (value == "2")
5688 objcABIVersion = 2;
5689 else if (value == "3")
5690 objcABIVersion = 3;
5691 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005692 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005693 } else {
5694 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005695 bool nonFragileABIIsDefault =
5696 (rewriteKind == RK_NonFragile ||
5697 (rewriteKind == RK_None &&
5698 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005699 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5700 options::OPT_fno_objc_nonfragile_abi,
5701 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005703#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5704 unsigned nonFragileABIVersion = 1;
5705#else
5706 unsigned nonFragileABIVersion = 2;
5707#endif
5708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005709 if (Arg *abiArg =
5710 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005711 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005712 if (value == "1")
5713 nonFragileABIVersion = 1;
5714 else if (value == "2")
5715 nonFragileABIVersion = 2;
5716 else
5717 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005718 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005719 }
5720
5721 objcABIVersion = 1 + nonFragileABIVersion;
5722 } else {
5723 objcABIVersion = 1;
5724 }
5725 }
5726
5727 // We don't actually care about the ABI version other than whether
5728 // it's non-fragile.
5729 bool isNonFragile = objcABIVersion != 1;
5730
5731 // If we have no runtime argument, ask the toolchain for its default runtime.
5732 // However, the rewriter only really supports the Mac runtime, so assume that.
5733 ObjCRuntime runtime;
5734 if (!runtimeArg) {
5735 switch (rewriteKind) {
5736 case RK_None:
5737 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5738 break;
5739 case RK_Fragile:
5740 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5741 break;
5742 case RK_NonFragile:
5743 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5744 break;
5745 }
5746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005747 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005748 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5749 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005750 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005751 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5752
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005753 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005754 } else {
5755 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5756 }
5757
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005758 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005759 } else {
5760 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005761 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005762 // non-fragile mode or the GCC runtime in fragile mode.
5763 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005764 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005765 else
5766 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005767 }
5768
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005769 cmdArgs.push_back(
5770 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005771 return runtime;
5772}
5773
Reid Klecknerc542d372014-06-27 17:02:02 +00005774static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5775 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5776 I += HaveDash;
5777 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005778}
Reid Klecknerc542d372014-06-27 17:02:02 +00005779
Benjamin Kramere003ca22015-10-28 13:54:16 +00005780namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005781struct EHFlags {
5782 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5783 bool Synch;
5784 bool Asynch;
5785 bool NoExceptC;
5786};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005787} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005788
5789/// /EH controls whether to run destructor cleanups when exceptions are
5790/// thrown. There are three modifiers:
5791/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5792/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5793/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5794/// - c: Assume that extern "C" functions are implicitly noexcept. This
5795/// modifier is an optimization, so we ignore it for now.
5796/// The default is /EHs-c-, meaning cleanups are disabled.
5797static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5798 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005800 std::vector<std::string> EHArgs =
5801 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005802 for (auto EHVal : EHArgs) {
5803 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5804 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005805 case 'a':
5806 EH.Asynch = maybeConsumeDash(EHVal, I);
5807 continue;
5808 case 'c':
5809 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5810 continue;
5811 case 's':
5812 EH.Synch = maybeConsumeDash(EHVal, I);
5813 continue;
5814 default:
5815 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005816 }
5817 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5818 break;
5819 }
5820 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005821
Reid Klecknerc542d372014-06-27 17:02:02 +00005822 return EH;
5823}
5824
Douglas Katzman3459ce22015-10-08 04:24:12 +00005825void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5826 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5827 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005828 unsigned RTOptionID = options::OPT__SLASH_MT;
5829
Hans Wennborgf1a74252013-09-10 20:18:04 +00005830 if (Args.hasArg(options::OPT__SLASH_LDd))
5831 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5832 // but defining _DEBUG is sticky.
5833 RTOptionID = options::OPT__SLASH_MTd;
5834
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005835 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005836 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005837
David Majnemere2afb472015-07-24 06:49:13 +00005838 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005839 switch (RTOptionID) {
5840 case options::OPT__SLASH_MD:
5841 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005842 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 CmdArgs.push_back("-D_MT");
5844 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005845 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 break;
5847 case options::OPT__SLASH_MDd:
5848 CmdArgs.push_back("-D_DEBUG");
5849 CmdArgs.push_back("-D_MT");
5850 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005851 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005852 break;
5853 case options::OPT__SLASH_MT:
5854 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005855 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005857 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005858 break;
5859 case options::OPT__SLASH_MTd:
5860 CmdArgs.push_back("-D_DEBUG");
5861 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005862 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005863 break;
5864 default:
5865 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005866 }
5867
David Majnemere2afb472015-07-24 06:49:13 +00005868 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5869 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5870 } else {
5871 CmdArgs.push_back(FlagForCRT.data());
5872
5873 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5874 // users want. The /Za flag to cl.exe turns this off, but it's not
5875 // implemented in clang.
5876 CmdArgs.push_back("--dependent-lib=oldnames");
5877 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005878
Hans Wennborg8858a032014-07-21 23:42:07 +00005879 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5880 // would produce interleaved output, so ignore /showIncludes in such cases.
5881 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5882 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5883 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005884
David Majnemerf6072342014-07-01 22:24:56 +00005885 // This controls whether or not we emit RTTI data for polymorphic types.
5886 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5887 /*default=*/false))
5888 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005889
Reid Kleckner124955a2015-08-05 18:51:13 +00005890 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005891 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005892 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5893 // If we are emitting CV but not DWARF, don't build information that LLVM
5894 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005895 if (*EmitCodeView && !EmitDwarf)
5896 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5897 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005898 CmdArgs.push_back("-gcodeview");
5899
Reid Klecknerc542d372014-06-27 17:02:02 +00005900 const Driver &D = getToolChain().getDriver();
5901 EHFlags EH = parseClangCLEHFlags(D, Args);
5902 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005903 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005904 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005905 CmdArgs.push_back("-fexceptions");
5906 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005907
Hans Wennborge50cec32014-06-13 20:59:54 +00005908 // /EP should expand to -E -P.
5909 if (Args.hasArg(options::OPT__SLASH_EP)) {
5910 CmdArgs.push_back("-E");
5911 CmdArgs.push_back("-P");
5912 }
5913
David Majnemera5b195a2015-02-14 01:35:12 +00005914 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005915 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5916 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005917 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5918 else
5919 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5920
5921 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5922 VolatileOptionID = A->getOption().getID();
5923
5924 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5925 CmdArgs.push_back("-fms-volatile");
5926
David Majnemer86c318f2014-02-11 21:05:00 +00005927 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5928 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5929 if (MostGeneralArg && BestCaseArg)
5930 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5931 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5932
5933 if (MostGeneralArg) {
5934 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5935 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5936 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5937
5938 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5939 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5940 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5941 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5942 << FirstConflict->getAsString(Args)
5943 << SecondConflict->getAsString(Args);
5944
5945 if (SingleArg)
5946 CmdArgs.push_back("-fms-memptr-rep=single");
5947 else if (MultipleArg)
5948 CmdArgs.push_back("-fms-memptr-rep=multiple");
5949 else
5950 CmdArgs.push_back("-fms-memptr-rep=virtual");
5951 }
5952
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005953 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5954 A->render(Args, CmdArgs);
5955
Hans Wennborg81f74482013-09-10 01:07:07 +00005956 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5957 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005958 if (Args.hasArg(options::OPT__SLASH_fallback))
5959 CmdArgs.push_back("msvc-fallback");
5960 else
5961 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005962 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005963}
5964
Douglas Katzman95354292015-06-23 20:42:09 +00005965visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005966 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005967 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005968 return CLFallback.get();
5969}
5970
Daniel Sanders7f933f42015-01-30 17:35:23 +00005971void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5972 ArgStringList &CmdArgs) const {
5973 StringRef CPUName;
5974 StringRef ABIName;
5975 const llvm::Triple &Triple = getToolChain().getTriple();
5976 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5977
5978 CmdArgs.push_back("-target-abi");
5979 CmdArgs.push_back(ABIName.data());
5980}
5981
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005982void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005984 const ArgList &Args,
5985 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005986 ArgStringList CmdArgs;
5987
5988 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5989 const InputInfo &Input = Inputs[0];
5990
James Y Knight2db38f32015-08-15 03:45:25 +00005991 std::string TripleStr =
5992 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5993 const llvm::Triple Triple(TripleStr);
5994
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005995 // Don't warn about "clang -w -c foo.s"
5996 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005997 // and "clang -emit-llvm -c foo.s"
5998 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005999
Rafael Espindola577637a2015-01-03 00:06:04 +00006000 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006001
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006002 // Invoke ourselves in -cc1as mode.
6003 //
6004 // FIXME: Implement custom jobs for internal actions.
6005 CmdArgs.push_back("-cc1as");
6006
6007 // Add the "effective" target triple.
6008 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006009 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6010
6011 // Set the output mode, we currently only expect to be used as a real
6012 // assembler.
6013 CmdArgs.push_back("-filetype");
6014 CmdArgs.push_back("obj");
6015
Eric Christopher45f2e712012-12-18 00:31:10 +00006016 // Set the main file name, so that debug info works even with
6017 // -save-temps or preprocessed assembly.
6018 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006019 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006020
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006021 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006022 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006023 if (!CPU.empty()) {
6024 CmdArgs.push_back("-target-cpu");
6025 CmdArgs.push_back(Args.MakeArgString(CPU));
6026 }
6027
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006028 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006029 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006030
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006031 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006032 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006033
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006034 // Pass along any -I options so we get proper .include search paths.
6035 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6036
Eric Christopherfc3ee562012-01-10 00:38:01 +00006037 // Determine the original source input.
6038 const Action *SourceAction = &JA;
6039 while (SourceAction->getKind() != Action::InputClass) {
6040 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6041 SourceAction = SourceAction->getInputs()[0];
6042 }
6043
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006044 // Forward -g and handle debug info related flags, assuming we are dealing
6045 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006046 if (SourceAction->getType() == types::TY_Asm ||
6047 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006048 bool WantDebug = false;
6049 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006050 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006051 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006052 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6053 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006054 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006055 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006056 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006057 if (DwarfVersion == 0)
6058 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006059 RenderDebugEnablingArgs(Args, CmdArgs,
6060 (WantDebug ? CodeGenOptions::LimitedDebugInfo
6061 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006062 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006063
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006064 // Add the -fdebug-compilation-dir flag if needed.
6065 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006066
6067 // Set the AT_producer to the clang version when using the integrated
6068 // assembler on assembly source files.
6069 CmdArgs.push_back("-dwarf-debug-producer");
6070 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006071
6072 // And pass along -I options
6073 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006074 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006075
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006076 // Handle -fPIC et al -- the relocation-model affects the assembler
6077 // for some targets.
6078 llvm::Reloc::Model RelocationModel;
6079 unsigned PICLevel;
6080 bool IsPIE;
6081 std::tie(RelocationModel, PICLevel, IsPIE) =
6082 ParsePICArgs(getToolChain(), Triple, Args);
6083
6084 const char *RMName = RelocationModelName(RelocationModel);
6085 if (RMName) {
6086 CmdArgs.push_back("-mrelocation-model");
6087 CmdArgs.push_back(RMName);
6088 }
6089
Kevin Enderby292dc082011-12-22 19:31:58 +00006090 // Optionally embed the -cc1as level arguments into the debug info, for build
6091 // analysis.
6092 if (getToolChain().UseDwarfDebugFlags()) {
6093 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006094 for (const auto &Arg : Args)
6095 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006096
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006097 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006098 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6099 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006100 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006101 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006102 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006103 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006104 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006105 }
6106 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006107 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006108 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006109
6110 // FIXME: Add -static support, once we have it.
6111
Daniel Sanders7f933f42015-01-30 17:35:23 +00006112 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006113 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006114 default:
6115 break;
6116
6117 case llvm::Triple::mips:
6118 case llvm::Triple::mipsel:
6119 case llvm::Triple::mips64:
6120 case llvm::Triple::mips64el:
6121 AddMIPSTargetArgs(Args, CmdArgs);
6122 break;
6123 }
6124
David Blaikie372d9502014-01-17 03:17:40 +00006125 // Consume all the warning flags. Usually this would be handled more
6126 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6127 // doesn't handle that so rather than warning about unused flags that are
6128 // actually used, we'll lie by omission instead.
6129 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006130 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006131
David Blaikie9260ed62013-07-25 21:19:01 +00006132 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6133 getToolChain().getDriver());
6134
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006135 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006136
6137 assert(Output.isFilename() && "Unexpected lipo output.");
6138 CmdArgs.push_back("-o");
6139 CmdArgs.push_back(Output.getFilename());
6140
Daniel Dunbarb440f562010-08-02 02:38:21 +00006141 assert(Input.isFilename() && "Invalid input.");
6142 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006143
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006144 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006145 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006146
6147 // Handle the debug info splitting at object creation time if we're
6148 // creating an object.
6149 // TODO: Currently only works on linux with newer objcopy.
6150 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006151 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006152 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006153 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006154}
6155
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006156void GnuTool::anchor() {}
6157
Daniel Dunbara3246a02009-03-18 08:07:30 +00006158void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006159 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006160 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006161 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006162 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006163 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006164
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006165 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006166 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006167 // It is unfortunate that we have to claim here, as this means
6168 // we will basically never report anything interesting for
6169 // platforms using a generic gcc, even if we are just using gcc
6170 // to get to the assembler.
6171 A->claim();
6172
Daniel Dunbar939c1212010-08-03 16:14:14 +00006173 // Don't forward any -g arguments to assembly steps.
6174 if (isa<AssembleJobAction>(JA) &&
6175 A->getOption().matches(options::OPT_g_Group))
6176 continue;
6177
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006178 // Don't forward any -W arguments to assembly and link steps.
6179 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6180 A->getOption().matches(options::OPT_W_Group))
6181 continue;
6182
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006183 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006184 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006185 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006186
Daniel Dunbar4e295052010-01-25 22:35:08 +00006187 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006188
6189 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006190 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006191 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006192 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006193 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006194 }
6195
Daniel Dunbar5716d872009-05-02 21:41:52 +00006196 // Try to force gcc to match the tool chain we want, if we recognize
6197 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006198 //
6199 // FIXME: The triple class should directly provide the information we want
6200 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006201 switch (getToolChain().getArch()) {
6202 default:
6203 break;
6204 case llvm::Triple::x86:
6205 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006206 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006207 break;
6208 case llvm::Triple::x86_64:
6209 case llvm::Triple::ppc64:
6210 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006211 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006212 break;
6213 case llvm::Triple::sparcel:
6214 CmdArgs.push_back("-EL");
6215 break;
6216 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006217
Daniel Dunbarb440f562010-08-02 02:38:21 +00006218 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006219 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006220 CmdArgs.push_back(Output.getFilename());
6221 } else {
6222 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006223 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006224 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006227
6228 // Only pass -x if gcc will understand it; otherwise hope gcc
6229 // understands the suffix correctly. The main use case this would go
6230 // wrong in is for linker inputs if they happened to have an odd
6231 // suffix; really the only way to get this to happen is a command
6232 // like '-x foobar a.c' which will treat a.c like a linker input.
6233 //
6234 // FIXME: For the linker case specifically, can we safely convert
6235 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006236 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006237 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006238 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006239 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006240 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006241 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006242 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006243 else if (II.getType() == types::TY_ModuleFile)
6244 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006245 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006246
Daniel Dunbara3246a02009-03-18 08:07:30 +00006247 if (types::canTypeBeUserSpecified(II.getType())) {
6248 CmdArgs.push_back("-x");
6249 CmdArgs.push_back(types::getTypeName(II.getType()));
6250 }
6251
Daniel Dunbarb440f562010-08-02 02:38:21 +00006252 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006253 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006254 else {
6255 const Arg &A = II.getInputArg();
6256
6257 // Reverse translate some rewritten options.
6258 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6259 CmdArgs.push_back("-lstdc++");
6260 continue;
6261 }
6262
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006263 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006264 A.render(Args, CmdArgs);
6265 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006266 }
6267
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006268 const std::string customGCCName = D.getCCCGenericGCCName();
6269 const char *GCCName;
6270 if (!customGCCName.empty())
6271 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006272 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006273 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006274 } else
6275 GCCName = "gcc";
6276
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006277 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006278 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006279}
6280
Douglas Katzman95354292015-06-23 20:42:09 +00006281void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6282 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006283 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006284}
6285
Douglas Katzman95354292015-06-23 20:42:09 +00006286void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6287 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006288 const Driver &D = getToolChain().getDriver();
6289
Eric Christophercc7ff502015-01-29 00:56:17 +00006290 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006291 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006292 case types::TY_LLVM_IR:
6293 case types::TY_LTO_IR:
6294 case types::TY_LLVM_BC:
6295 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006296 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006297 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006298 // We assume we've got an "integrated" assembler in that gcc will produce an
6299 // object file itself.
6300 case types::TY_Object:
6301 CmdArgs.push_back("-c");
6302 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006303 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006304 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006305 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006306 case types::TY_Nothing:
6307 CmdArgs.push_back("-fsyntax-only");
6308 break;
6309 default:
6310 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006311 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006312}
6313
Douglas Katzman95354292015-06-23 20:42:09 +00006314void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6315 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006316 // The types are (hopefully) good enough.
6317}
6318
Tony Linthicum76329bf2011-12-12 21:14:55 +00006319// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006320void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006321 ArgStringList &CmdArgs) const {
6322}
6323
Douglas Katzman95354292015-06-23 20:42:09 +00006324void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6325 const InputInfo &Output,
6326 const InputInfoList &Inputs,
6327 const ArgList &Args,
6328 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006329 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006330
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006331 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6332 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333 ArgStringList CmdArgs;
6334
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006335 std::string MArchString = "-march=hexagon";
6336 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006337
6338 RenderExtraToolArgs(JA, CmdArgs);
6339
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006340 std::string AsName = "hexagon-llvm-mc";
6341 std::string MCpuString = "-mcpu=hexagon" +
6342 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6343 CmdArgs.push_back("-filetype=obj");
6344 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6345
Tony Linthicum76329bf2011-12-12 21:14:55 +00006346 if (Output.isFilename()) {
6347 CmdArgs.push_back("-o");
6348 CmdArgs.push_back(Output.getFilename());
6349 } else {
6350 assert(Output.isNothing() && "Unexpected output");
6351 CmdArgs.push_back("-fsyntax-only");
6352 }
6353
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006354 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6355 std::string N = llvm::utostr(G.getValue());
6356 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6357 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006359 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006360
Tony Linthicum76329bf2011-12-12 21:14:55 +00006361 // Only pass -x if gcc will understand it; otherwise hope gcc
6362 // understands the suffix correctly. The main use case this would go
6363 // wrong in is for linker inputs if they happened to have an odd
6364 // suffix; really the only way to get this to happen is a command
6365 // like '-x foobar a.c' which will treat a.c like a linker input.
6366 //
6367 // FIXME: For the linker case specifically, can we safely convert
6368 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006369 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006370 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006371 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006372 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006373 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006374 else if (II.getType() == types::TY_AST)
6375 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006376 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006377 else if (II.getType() == types::TY_ModuleFile)
6378 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006379 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006380
6381 if (II.isFilename())
6382 CmdArgs.push_back(II.getFilename());
6383 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006384 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006385 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006386 II.getInputArg().render(Args, CmdArgs);
6387 }
6388
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006389 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006390 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006391}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006392
Douglas Katzman95354292015-06-23 20:42:09 +00006393void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6394 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006395}
6396
Douglas Katzman54366072015-07-27 16:53:08 +00006397static void
6398constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006399 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006400 const InputInfo &Output, const InputInfoList &Inputs,
6401 const ArgList &Args, ArgStringList &CmdArgs,
6402 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006403
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006404 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006405
Matthew Curtise689b052012-12-06 15:46:07 +00006406 //----------------------------------------------------------------------------
6407 //
6408 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006409 bool IsStatic = Args.hasArg(options::OPT_static);
6410 bool IsShared = Args.hasArg(options::OPT_shared);
6411 bool IsPIE = Args.hasArg(options::OPT_pie);
6412 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6413 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6414 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6415 bool UseG0 = false;
6416 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006417
Matthew Curtise689b052012-12-06 15:46:07 +00006418 //----------------------------------------------------------------------------
6419 // Silence warnings for various options
6420 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006421 Args.ClaimAllArgs(options::OPT_g_Group);
6422 Args.ClaimAllArgs(options::OPT_emit_llvm);
6423 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6424 // handled somewhere else.
6425 Args.ClaimAllArgs(options::OPT_static_libgcc);
6426
6427 //----------------------------------------------------------------------------
6428 //
6429 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006430 if (Args.hasArg(options::OPT_s))
6431 CmdArgs.push_back("-s");
6432
6433 if (Args.hasArg(options::OPT_r))
6434 CmdArgs.push_back("-r");
6435
6436 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006437 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006438
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006439 CmdArgs.push_back("-march=hexagon");
6440 std::string CpuVer =
6441 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6442 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6443 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006444
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006445 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006446 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447 // The following should be the default, but doing as hexagon-gcc does.
6448 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006449 }
6450
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006452 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006453
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006455 CmdArgs.push_back("-pie");
6456
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6458 std::string N = llvm::utostr(G.getValue());
6459 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6460 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006461 }
6462
Matthew Curtise689b052012-12-06 15:46:07 +00006463 //----------------------------------------------------------------------------
6464 //
6465 //----------------------------------------------------------------------------
6466 CmdArgs.push_back("-o");
6467 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006468
Matthew Curtise689b052012-12-06 15:46:07 +00006469 //----------------------------------------------------------------------------
6470 // moslib
6471 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006472 std::vector<std::string> OsLibs;
6473 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006474
Sean Silva14facf32015-06-09 01:57:17 +00006475 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6476 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006477 OsLibs.emplace_back(A->getValue());
6478 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006480 if (OsLibs.empty()) {
6481 OsLibs.push_back("standalone");
6482 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006483 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006484
Matthew Curtise689b052012-12-06 15:46:07 +00006485 //----------------------------------------------------------------------------
6486 // Start Files
6487 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006488 const std::string MCpuSuffix = "/" + CpuVer;
6489 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6490 const std::string RootDir =
6491 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6492 const std::string StartSubDir =
6493 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006494
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006495 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6496 const char *Name) -> std::string {
6497 std::string RelName = SubDir + Name;
6498 std::string P = HTC.GetFilePath(RelName.c_str());
6499 if (llvm::sys::fs::exists(P))
6500 return P;
6501 return RootDir + RelName;
6502 };
6503
6504 if (IncStdLib && IncStartFiles) {
6505 if (!IsShared) {
6506 if (HasStandalone) {
6507 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6508 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006509 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6511 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006512 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006513 std::string Init = UseShared
6514 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6515 : Find(RootDir, StartSubDir, "/init.o");
6516 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006517 }
6518
6519 //----------------------------------------------------------------------------
6520 // Library Search Paths
6521 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006522 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6523 for (const auto &LibPath : LibPaths)
6524 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006525
6526 //----------------------------------------------------------------------------
6527 //
6528 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006529 Args.AddAllArgs(CmdArgs,
6530 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6531 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006532
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006534
6535 //----------------------------------------------------------------------------
6536 // Libraries
6537 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006538 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006539 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006540 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006541 CmdArgs.push_back("-lm");
6542 }
6543
6544 CmdArgs.push_back("--start-group");
6545
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006546 if (!IsShared) {
6547 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006548 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006549 CmdArgs.push_back("-lc");
6550 }
6551 CmdArgs.push_back("-lgcc");
6552
6553 CmdArgs.push_back("--end-group");
6554 }
6555
6556 //----------------------------------------------------------------------------
6557 // End files
6558 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006559 if (IncStdLib && IncStartFiles) {
6560 std::string Fini = UseShared
6561 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6562 : Find(RootDir, StartSubDir, "/fini.o");
6563 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006564 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006565}
6566
Douglas Katzman95354292015-06-23 20:42:09 +00006567void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6568 const InputInfo &Output,
6569 const InputInfoList &Inputs,
6570 const ArgList &Args,
6571 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006572 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006573
6574 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006576 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006577
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006579 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006580 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006581}
6582// Hexagon tools end.
6583
Tom Stellard8fa33092015-07-18 01:49:05 +00006584void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6585 const InputInfo &Output,
6586 const InputInfoList &Inputs,
6587 const ArgList &Args,
6588 const char *LinkingOutput) const {
6589
6590 std::string Linker = getToolChain().GetProgramPath(getShortName());
6591 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006592 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6593 CmdArgs.push_back("-o");
6594 CmdArgs.push_back(Output.getFilename());
6595 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6596 CmdArgs, Inputs));
6597}
6598// AMDGPU tools end.
6599
Dan Gohman52816862015-12-16 23:30:41 +00006600wasm::Linker::Linker(const ToolChain &TC)
6601 : GnuTool("wasm::Linker", "lld", TC) {}
6602
6603bool wasm::Linker::isLinkJob() const {
6604 return true;
6605}
6606
6607bool wasm::Linker::hasIntegratedCPP() const {
6608 return false;
6609}
6610
6611void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6612 const InputInfo &Output,
6613 const InputInfoList &Inputs,
6614 const ArgList &Args,
6615 const char *LinkingOutput) const {
6616 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6617 ArgStringList CmdArgs;
6618 CmdArgs.push_back("-flavor");
6619 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006620
6621 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006622 // size is of particular importance. This is significantly facilitated by
6623 // the enabling of -ffunction-sections and -fdata-sections in
6624 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006625 if (areOptimizationsEnabled(Args))
6626 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006627
Dan Gohman52816862015-12-16 23:30:41 +00006628 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6629 CmdArgs.push_back("-o");
6630 CmdArgs.push_back(Output.getFilename());
6631 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6632}
6633
Renato Golin7c542b42015-07-27 23:44:45 +00006634const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006635 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006636 if (!Arch.empty())
6637 MArch = Arch;
6638 else
Bernard Ogden31561762013-12-12 13:27:11 +00006639 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006640 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006641
6642 // Handle -march=native.
6643 if (MArch == "native") {
6644 std::string CPU = llvm::sys::getHostCPUName();
6645 if (CPU != "generic") {
6646 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006647 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006648 // If there is no valid architecture suffix for this CPU we don't know how
6649 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006650 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006651 MArch = "";
6652 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006653 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006654 }
6655 }
6656
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006657 return MArch;
6658}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006659
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006660/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006661StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006662 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006663 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6664 // here means an -march=native that we can't handle, so instead return no CPU.
6665 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006666 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006667
John Brawna95c1a82015-05-08 12:52:18 +00006668 // We need to return an empty string here on invalid MArch values as the
6669 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006670 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006671}
6672
6673/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006674std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006675 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006676 // FIXME: Warn on inconsistent use of -mcpu and -march.
6677 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006678 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006679 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006680 // Handle -mcpu=native.
6681 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006682 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006683 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006684 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006685 }
6686
Renato Goline17c5802015-07-27 23:44:42 +00006687 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006688}
6689
6690/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006691/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006692// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006693StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6694 const llvm::Triple &Triple) {
6695 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006696 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006697 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006698 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006699 if (ArchKind == llvm::ARM::AK_INVALID)
6700 // In case of generic Arch, i.e. "arm",
6701 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006702 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006703 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006704 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6705 // armv7k triple if it's actually been specified via "-arch armv7k".
6706 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006707 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006708 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006709 }
Renato Golin3c007252015-05-28 15:05:53 +00006710 if (ArchKind == llvm::ARM::AK_INVALID)
6711 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006712 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006713}
6714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006715void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006716 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006717 if (Args.hasArg(options::OPT_r))
6718 return;
6719
John Brawn94fd9632015-05-21 12:19:49 +00006720 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6721 // to generate BE-8 executables.
6722 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6723 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006724}
6725
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006726mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006727 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6728 // was first introduced in Release 3. However, other compilers have
6729 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006730 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6731 .Case("mips1", NanLegacy)
6732 .Case("mips2", NanLegacy)
6733 .Case("mips3", NanLegacy)
6734 .Case("mips4", NanLegacy)
6735 .Case("mips5", NanLegacy)
6736 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006737 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006738 .Case("mips32r3", NanLegacy | Nan2008)
6739 .Case("mips32r5", NanLegacy | Nan2008)
6740 .Case("mips32r6", Nan2008)
6741 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006742 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006743 .Case("mips64r3", NanLegacy | Nan2008)
6744 .Case("mips64r5", NanLegacy | Nan2008)
6745 .Case("mips64r6", Nan2008)
6746 .Default(NanLegacy);
6747}
6748
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006749bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6750 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6751 return A && (A->getValue() == StringRef(Value));
6752}
6753
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006754bool mips::isUCLibc(const ArgList &Args) {
6755 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006756 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006757}
6758
Daniel Sanders2bf13662014-07-10 14:40:57 +00006759bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006760 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6761 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006762 .Case("2008", true)
6763 .Case("legacy", false)
6764 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006765
6766 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006767 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006768 .Cases("mips32r6", "mips64r6", true)
6769 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006770
6771 return false;
6772}
6773
Daniel Sanders379d44b2014-07-16 11:52:23 +00006774bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006775 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006776 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006777 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006778 return false;
6779
6780 if (ABIName != "32")
6781 return false;
6782
Toma Tabacu94ea6862015-06-16 13:54:13 +00006783 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6784 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006785 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006786 return false;
6787
Daniel Sanders379d44b2014-07-16 11:52:23 +00006788 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006789 .Cases("mips2", "mips3", "mips4", "mips5", true)
6790 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6791 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6792 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006793}
6794
Toma Tabacu94ea6862015-06-16 13:54:13 +00006795bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6796 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006797 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006798 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6799
6800 // FPXX shouldn't be used if -msingle-float is present.
6801 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6802 options::OPT_mdouble_float))
6803 if (A->getOption().matches(options::OPT_msingle_float))
6804 UseFPXX = false;
6805
6806 return UseFPXX;
6807}
6808
Tim Northover157d9112014-01-16 08:48:16 +00006809llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006810 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6811 // archs which Darwin doesn't use.
6812
6813 // The matching this routine does is fairly pointless, since it is neither the
6814 // complete architecture list, nor a reasonable subset. The problem is that
6815 // historically the driver driver accepts this and also ties its -march=
6816 // handling to the architecture name, so we need to be careful before removing
6817 // support for it.
6818
6819 // This code must be kept in sync with Clang's Darwin specific argument
6820 // translation.
6821
6822 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006823 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6824 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6825 .Case("ppc64", llvm::Triple::ppc64)
6826 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6827 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6828 llvm::Triple::x86)
6829 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6830 // This is derived from the driver driver.
6831 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6832 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6833 .Cases("armv7s", "xscale", llvm::Triple::arm)
6834 .Case("arm64", llvm::Triple::aarch64)
6835 .Case("r600", llvm::Triple::r600)
6836 .Case("amdgcn", llvm::Triple::amdgcn)
6837 .Case("nvptx", llvm::Triple::nvptx)
6838 .Case("nvptx64", llvm::Triple::nvptx64)
6839 .Case("amdil", llvm::Triple::amdil)
6840 .Case("spir", llvm::Triple::spir)
6841 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006842}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006843
Tim Northover157d9112014-01-16 08:48:16 +00006844void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006845 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006846 T.setArch(Arch);
6847
6848 if (Str == "x86_64h")
6849 T.setArchName(Str);
6850 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6851 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006852 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006853 }
6854}
6855
Bob Wilsondecc03e2012-11-23 06:14:39 +00006856const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006857 const InputInfo &Input) {
6858 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006859}
6860
Bob Wilsondecc03e2012-11-23 06:14:39 +00006861const char *Clang::getBaseInputStem(const ArgList &Args,
6862 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006863 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006864
Chris Lattner906bb902011-01-16 08:14:11 +00006865 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006866 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006867
6868 return Str;
6869}
6870
Bob Wilsondecc03e2012-11-23 06:14:39 +00006871const char *Clang::getDependencyFileName(const ArgList &Args,
6872 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006873 // FIXME: Think about this more.
6874 std::string Res;
6875
6876 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006877 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006878 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006879 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006880 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006881 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006882 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006883}
6884
Douglas Katzman95354292015-06-23 20:42:09 +00006885void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6886 const InputInfo &Output,
6887 const InputInfoList &Inputs,
6888 const ArgList &Args,
6889 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006890 const ToolChain &ToolChain = getToolChain();
6891 const Driver &D = ToolChain.getDriver();
6892 ArgStringList CmdArgs;
6893
6894 // Silence warning for "clang -g foo.o -o foo"
6895 Args.ClaimAllArgs(options::OPT_g_Group);
6896 // and "clang -emit-llvm foo.o -o foo"
6897 Args.ClaimAllArgs(options::OPT_emit_llvm);
6898 // and for "clang -w foo.o -o foo". Other warning options are already
6899 // handled somewhere else.
6900 Args.ClaimAllArgs(options::OPT_w);
6901
6902 if (!D.SysRoot.empty())
6903 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6904
6905 // CloudABI only supports static linkage.
6906 CmdArgs.push_back("-Bstatic");
6907 CmdArgs.push_back("--eh-frame-hdr");
6908 CmdArgs.push_back("--gc-sections");
6909
6910 if (Output.isFilename()) {
6911 CmdArgs.push_back("-o");
6912 CmdArgs.push_back(Output.getFilename());
6913 } else {
6914 assert(Output.isNothing() && "Invalid output.");
6915 }
6916
Douglas Katzman78b37b02015-11-17 20:28:07 +00006917 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006918 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6919 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6920 }
6921
6922 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006923 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006924 Args.AddAllArgs(CmdArgs,
6925 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6926 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006927
Teresa Johnson945bc502015-10-15 20:35:53 +00006928 if (D.isUsingLTO())
6929 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006930
6931 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6932
Douglas Katzman78b37b02015-11-17 20:28:07 +00006933 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006934 if (D.CCCIsCXX())
6935 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6936 CmdArgs.push_back("-lc");
6937 CmdArgs.push_back("-lcompiler_rt");
6938 }
6939
Douglas Katzman78b37b02015-11-17 20:28:07 +00006940 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006941 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6942
6943 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006944 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006945}
6946
Douglas Katzman95354292015-06-23 20:42:09 +00006947void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6948 const InputInfo &Output,
6949 const InputInfoList &Inputs,
6950 const ArgList &Args,
6951 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006952 ArgStringList CmdArgs;
6953
6954 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6955 const InputInfo &Input = Inputs[0];
6956
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006957 // Determine the original source input.
6958 const Action *SourceAction = &JA;
6959 while (SourceAction->getKind() != Action::InputClass) {
6960 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6961 SourceAction = SourceAction->getInputs()[0];
6962 }
6963
Eric Christopherf5a8f492015-12-08 00:10:10 +00006964 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006965 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006966 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6967 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006968 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006969 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006970 const llvm::Triple &T(getToolChain().getTriple());
6971 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006972 CmdArgs.push_back("-Q");
6973 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006974
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006975 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006976 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006977 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006978 if (Args.hasArg(options::OPT_gstabs))
6979 CmdArgs.push_back("--gstabs");
6980 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006981 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006982 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006983
Daniel Dunbarbe220842009-03-20 16:06:39 +00006984 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006985 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006986
Daniel Dunbar6d484762010-07-22 01:47:22 +00006987 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006988 if (getToolChain().getArch() == llvm::Triple::x86 ||
6989 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006990 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6991 CmdArgs.push_back("-force_cpusubtype_ALL");
6992
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006993 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006994 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006995 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006996 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006997 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006998 CmdArgs.push_back("-static");
6999
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007000 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007001
7002 assert(Output.isFilename() && "Unexpected lipo output.");
7003 CmdArgs.push_back("-o");
7004 CmdArgs.push_back(Output.getFilename());
7005
Daniel Dunbarb440f562010-08-02 02:38:21 +00007006 assert(Input.isFilename() && "Invalid input.");
7007 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007008
7009 // asm_final spec is empty.
7010
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007011 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007012 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007013}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007014
Tim Northover157d9112014-01-16 08:48:16 +00007015void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007016
Tim Northover157d9112014-01-16 08:48:16 +00007017void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7018 ArgStringList &CmdArgs) const {
7019 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007020
Daniel Dunbarc1964212009-03-26 16:23:12 +00007021 // Derived from darwin_arch spec.
7022 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007023 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007024
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007025 // FIXME: Is this needed anymore?
7026 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007027 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007028}
7029
Douglas Katzman95354292015-06-23 20:42:09 +00007030bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007031 // We only need to generate a temp path for LTO if we aren't compiling object
7032 // files. When compiling source files, we run 'dsymutil' after linking. We
7033 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007034 for (const auto &Input : Inputs)
7035 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007036 return true;
7037
7038 return false;
7039}
7040
Douglas Katzman95354292015-06-23 20:42:09 +00007041void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7042 ArgStringList &CmdArgs,
7043 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007044 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007045 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007047 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007048 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7049 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007050 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7051 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007052 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007053 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007054 }
7055
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007056 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007057 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007058 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7059 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007060
Bob Wilson3d27dad2013-08-02 22:25:34 +00007061 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7062 CmdArgs.push_back("-export_dynamic");
7063
Bob Wilsonb111ec92015-03-02 19:01:14 +00007064 // If we are using App Extension restrictions, pass a flag to the linker
7065 // telling it that the compiled code has been audited.
7066 if (Args.hasFlag(options::OPT_fapplication_extension,
7067 options::OPT_fno_application_extension, false))
7068 CmdArgs.push_back("-application_extension");
7069
Teresa Johnson945bc502015-10-15 20:35:53 +00007070 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007071 // If we are using LTO, then automatically create a temporary file path for
7072 // the linker to use, so that it's lifetime will extend past a possible
7073 // dsymutil step.
7074 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7075 const char *TmpPath = C.getArgs().MakeArgString(
7076 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7077 C.addTempFile(TmpPath);
7078 CmdArgs.push_back("-object_path_lto");
7079 CmdArgs.push_back(TmpPath);
7080 }
7081
7082 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7083 // it in clang installed libraries. If not found, the option is not used
7084 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7085 if (Version[0] >= 133) {
7086 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7087 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7088 SmallString<128> LibLTOPath(P);
7089 llvm::sys::path::append(LibLTOPath, "lib");
7090 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7091 if (llvm::sys::fs::exists(LibLTOPath)) {
7092 CmdArgs.push_back("-lto_library");
7093 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7094 } else {
7095 D.Diag(diag::warn_drv_lto_libpath);
7096 }
7097 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007098 }
7099
Daniel Dunbarc1964212009-03-26 16:23:12 +00007100 // Derived from the "link" spec.
7101 Args.AddAllArgs(CmdArgs, options::OPT_static);
7102 if (!Args.hasArg(options::OPT_static))
7103 CmdArgs.push_back("-dynamic");
7104 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7105 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7106 // here. How do we wish to handle such things?
7107 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007108
Daniel Dunbarc1964212009-03-26 16:23:12 +00007109 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007110 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007111 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007112 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007113
7114 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7115 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7116 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7117
7118 Arg *A;
7119 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7120 (A = Args.getLastArg(options::OPT_current__version)) ||
7121 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007122 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7123 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007124
7125 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7126 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7127 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7128 } else {
7129 CmdArgs.push_back("-dylib");
7130
7131 Arg *A;
7132 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7133 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7134 (A = Args.getLastArg(options::OPT_client__name)) ||
7135 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7136 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7137 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007138 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7139 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007140
Daniel Dunbarc1964212009-03-26 16:23:12 +00007141 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7142 "-dylib_compatibility_version");
7143 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7144 "-dylib_current_version");
7145
Tim Northover157d9112014-01-16 08:48:16 +00007146 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007147
7148 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7149 "-dylib_install_name");
7150 }
7151
7152 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7153 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7154 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007155 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007156 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007157 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7158 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7159 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7160 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7161 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7162 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007163 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007164 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7165 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7166 Args.AddAllArgs(CmdArgs, options::OPT_init);
7167
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007168 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007169 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007170
Daniel Dunbarc1964212009-03-26 16:23:12 +00007171 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7172 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7173 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7174 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7175 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007177 if (const Arg *A =
7178 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7179 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007180 if (A->getOption().matches(options::OPT_fpie) ||
7181 A->getOption().matches(options::OPT_fPIE))
7182 CmdArgs.push_back("-pie");
7183 else
7184 CmdArgs.push_back("-no_pie");
7185 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007186
7187 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7188 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7189 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7190 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7191 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7192 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7193 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7194 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7195 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7196 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7197 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7198 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7199 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7200 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7201 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7202 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007203
Daniel Dunbar84384642011-05-02 21:03:47 +00007204 // Give --sysroot= preference, over the Apple specific behavior to also use
7205 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007206 StringRef sysroot = C.getSysRoot();
7207 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007208 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007209 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007210 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7211 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007212 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007213 }
7214
Daniel Dunbarc1964212009-03-26 16:23:12 +00007215 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7216 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7217 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7218 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7219 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007220 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007221 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7222 Args.AddAllArgs(CmdArgs, options::OPT_y);
7223 Args.AddLastArg(CmdArgs, options::OPT_w);
7224 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7225 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7226 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7227 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7228 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7229 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7230 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7231 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7232 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7233 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7234 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7235 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7236}
7237
Douglas Katzman95354292015-06-23 20:42:09 +00007238void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7239 const InputInfo &Output,
7240 const InputInfoList &Inputs,
7241 const ArgList &Args,
7242 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007243 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007244
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007245 // If the number of arguments surpasses the system limits, we will encode the
7246 // input files in a separate file, shortening the command line. To this end,
7247 // build a list of input file names that can be passed via a file with the
7248 // -filelist linker option.
7249 llvm::opt::ArgStringList InputFileList;
7250
Daniel Dunbarc1964212009-03-26 16:23:12 +00007251 // The logic here is derived from gcc's behavior; most of which
7252 // comes from specs (starting with link_command). Consult gcc for
7253 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007254 ArgStringList CmdArgs;
7255
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007256 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7257 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7258 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007259 for (const auto &Arg : Args)
7260 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007261 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007262 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007263 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007264 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007265 return;
7266 }
7267
Daniel Dunbarc1964212009-03-26 16:23:12 +00007268 // I'm not sure why this particular decomposition exists in gcc, but
7269 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007270 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007271
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007272 // It seems that the 'e' option is completely ignored for dynamic executables
7273 // (the default), and with static executables, the last one wins, as expected.
7274 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7275 options::OPT_Z_Flag, options::OPT_u_Group,
7276 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007277
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007278 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7279 // members of static archive libraries which implement Objective-C classes or
7280 // categories.
7281 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7282 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007283
Daniel Dunbarc1964212009-03-26 16:23:12 +00007284 CmdArgs.push_back("-o");
7285 CmdArgs.push_back(Output.getFilename());
7286
Douglas Katzman78b37b02015-11-17 20:28:07 +00007287 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007288 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007289
Peter Collingbournec4122c12015-06-15 21:08:13 +00007290 // SafeStack requires its own runtime libraries
7291 // These libraries should be linked first, to make sure the
7292 // __safestack_init constructor executes before everything else
7293 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7294 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7295 "libclang_rt.safestack_osx.a",
7296 /*AlwaysLink=*/true);
7297 }
7298
Daniel Dunbarc1964212009-03-26 16:23:12 +00007299 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007300
Douglas Gregor9295df02012-05-15 21:00:27 +00007301 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007302 // Build the input file for -filelist (list of linker input files) in case we
7303 // need it later
7304 for (const auto &II : Inputs) {
7305 if (!II.isFilename()) {
7306 // This is a linker input argument.
7307 // We cannot mix input arguments and file names in a -filelist input, thus
7308 // we prematurely stop our list (remaining files shall be passed as
7309 // arguments).
7310 if (InputFileList.size() > 0)
7311 break;
7312
7313 continue;
7314 }
7315
7316 InputFileList.push_back(II.getFilename());
7317 }
7318
Douglas Katzman78b37b02015-11-17 20:28:07 +00007319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007320 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7321
Douglas Katzman78b37b02015-11-17 20:28:07 +00007322 if (isObjCRuntimeLinked(Args) &&
7323 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007324 // We use arclite library for both ARC and subscripting support.
7325 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7326
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007327 CmdArgs.push_back("-framework");
7328 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007329 // Link libobj.
7330 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007331 }
John McCall31168b02011-06-15 23:02:42 +00007332
Daniel Dunbarc1964212009-03-26 16:23:12 +00007333 if (LinkingOutput) {
7334 CmdArgs.push_back("-arch_multiple");
7335 CmdArgs.push_back("-final_output");
7336 CmdArgs.push_back(LinkingOutput);
7337 }
7338
Daniel Dunbarc1964212009-03-26 16:23:12 +00007339 if (Args.hasArg(options::OPT_fnested_functions))
7340 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007341
Justin Bognerc7701242015-05-12 05:44:36 +00007342 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7343
Douglas Katzman78b37b02015-11-17 20:28:07 +00007344 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007345 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007346 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007347
Daniel Dunbarc1964212009-03-26 16:23:12 +00007348 // link_ssp spec is empty.
7349
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007350 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007351 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007352 }
7353
Douglas Katzman78b37b02015-11-17 20:28:07 +00007354 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007355 // endfile_spec is empty.
7356 }
7357
7358 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7359 Args.AddAllArgs(CmdArgs, options::OPT_F);
7360
Steven Wu3ffb61b2015-02-06 18:08:29 +00007361 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007362 for (const Arg *A : Args.filtered(options::OPT_iframework))
7363 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007364
Douglas Katzman78b37b02015-11-17 20:28:07 +00007365 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007366 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7367 if (A->getValue() == StringRef("Accelerate")) {
7368 CmdArgs.push_back("-framework");
7369 CmdArgs.push_back("Accelerate");
7370 }
7371 }
7372 }
7373
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007374 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007375 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007376 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007377 Cmd->setInputFileList(std::move(InputFileList));
7378 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007379}
7380
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007381void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007382 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007383 const InputInfoList &Inputs,
7384 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007385 const char *LinkingOutput) const {
7386 ArgStringList CmdArgs;
7387
7388 CmdArgs.push_back("-create");
7389 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007390
7391 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007392 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007393
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007394 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007395 assert(II.isFilename() && "Unexpected lipo input.");
7396 CmdArgs.push_back(II.getFilename());
7397 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007398
7399 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007400 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007401}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007402
Daniel Dunbar88299622010-06-04 18:28:36 +00007403void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007404 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007405 const InputInfoList &Inputs,
7406 const ArgList &Args,
7407 const char *LinkingOutput) const {
7408 ArgStringList CmdArgs;
7409
Daniel Dunbareb86b042011-05-09 17:23:16 +00007410 CmdArgs.push_back("-o");
7411 CmdArgs.push_back(Output.getFilename());
7412
Daniel Dunbar88299622010-06-04 18:28:36 +00007413 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7414 const InputInfo &Input = Inputs[0];
7415 assert(Input.isFilename() && "Unexpected dsymutil input.");
7416 CmdArgs.push_back(Input.getFilename());
7417
Daniel Dunbar88299622010-06-04 18:28:36 +00007418 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007419 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007421}
7422
Eric Christopher551ef452011-08-23 17:56:55 +00007423void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007424 const InputInfo &Output,
7425 const InputInfoList &Inputs,
7426 const ArgList &Args,
7427 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007428 ArgStringList CmdArgs;
7429 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007430 CmdArgs.push_back("--debug-info");
7431 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007432 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007433
7434 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7435 const InputInfo &Input = Inputs[0];
7436 assert(Input.isFilename() && "Unexpected verify input");
7437
7438 // Grabbing the output of the earlier dsymutil run.
7439 CmdArgs.push_back(Input.getFilename());
7440
7441 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007442 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007444}
7445
Douglas Katzman95354292015-06-23 20:42:09 +00007446void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007447 const InputInfo &Output,
7448 const InputInfoList &Inputs,
7449 const ArgList &Args,
7450 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007451 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007452 ArgStringList CmdArgs;
7453
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007454 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007455
7456 CmdArgs.push_back("-o");
7457 CmdArgs.push_back(Output.getFilename());
7458
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007459 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007460 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007461
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007462 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007463 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007464}
7465
Douglas Katzman95354292015-06-23 20:42:09 +00007466void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7467 const InputInfo &Output,
7468 const InputInfoList &Inputs,
7469 const ArgList &Args,
7470 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007471 ArgStringList CmdArgs;
7472
David Chisnall272a0712012-02-29 15:06:12 +00007473 // Demangle C++ names in errors
7474 CmdArgs.push_back("-C");
7475
Douglas Katzman78b37b02015-11-17 20:28:07 +00007476 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007477 CmdArgs.push_back("-e");
7478 CmdArgs.push_back("_start");
7479 }
7480
7481 if (Args.hasArg(options::OPT_static)) {
7482 CmdArgs.push_back("-Bstatic");
7483 CmdArgs.push_back("-dn");
7484 } else {
7485 CmdArgs.push_back("-Bdynamic");
7486 if (Args.hasArg(options::OPT_shared)) {
7487 CmdArgs.push_back("-shared");
7488 } else {
7489 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007490 CmdArgs.push_back(
7491 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007492 }
7493 }
7494
7495 if (Output.isFilename()) {
7496 CmdArgs.push_back("-o");
7497 CmdArgs.push_back(Output.getFilename());
7498 } else {
7499 assert(Output.isNothing() && "Invalid output.");
7500 }
7501
Douglas Katzman78b37b02015-11-17 20:28:07 +00007502 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007503 if (!Args.hasArg(options::OPT_shared))
7504 CmdArgs.push_back(
7505 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7506
7507 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7508 CmdArgs.push_back(
7509 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7510 CmdArgs.push_back(
7511 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007512 }
7513
Douglas Katzman6059ef92015-11-17 17:41:23 +00007514 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007515
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007516 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7517 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007518
7519 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7520
Douglas Katzman78b37b02015-11-17 20:28:07 +00007521 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007522 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007523 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007524 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007525 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007526 if (!Args.hasArg(options::OPT_shared)) {
7527 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007528 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007529 }
David Chisnallf571cde2012-02-15 13:39:01 +00007530 }
7531
Douglas Katzman78b37b02015-11-17 20:28:07 +00007532 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007533 CmdArgs.push_back(
7534 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007535 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007537
Xinliang David Li69306c02015-10-22 06:15:31 +00007538 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007539
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007540 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007541 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007542}
7543
Douglas Katzman95354292015-06-23 20:42:09 +00007544void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7545 const InputInfo &Output,
7546 const InputInfoList &Inputs,
7547 const ArgList &Args,
7548 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007549 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007550 ArgStringList CmdArgs;
7551
Rafael Espindolacc126272014-02-28 01:55:21 +00007552 switch (getToolChain().getArch()) {
7553 case llvm::Triple::x86:
7554 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7555 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007556 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007557 break;
7558
7559 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007560 CmdArgs.push_back("-mppc");
7561 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007562 break;
7563
7564 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007565 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007566 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007567 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7568 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7569 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007570 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007571 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007572
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007573 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007574 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007575 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7576 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7577 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007578 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007579 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007580
7581 case llvm::Triple::mips64:
7582 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007583 StringRef CPUName;
7584 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007585 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007586
7587 CmdArgs.push_back("-mabi");
7588 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7589
7590 if (getToolChain().getArch() == llvm::Triple::mips64)
7591 CmdArgs.push_back("-EB");
7592 else
7593 CmdArgs.push_back("-EL");
7594
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007595 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007596 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007597 }
7598
Rafael Espindolacc126272014-02-28 01:55:21 +00007599 default:
7600 break;
7601 }
7602
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007603 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007604
7605 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007606 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007607
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007608 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007609 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007610
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007611 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007612 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007613}
7614
Douglas Katzman95354292015-06-23 20:42:09 +00007615void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7616 const InputInfo &Output,
7617 const InputInfoList &Inputs,
7618 const ArgList &Args,
7619 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007620 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007621 ArgStringList CmdArgs;
7622
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007623 // Silence warning for "clang -g foo.o -o foo"
7624 Args.ClaimAllArgs(options::OPT_g_Group);
7625 // and "clang -emit-llvm foo.o -o foo"
7626 Args.ClaimAllArgs(options::OPT_emit_llvm);
7627 // and for "clang -w foo.o -o foo". Other warning options are already
7628 // handled somewhere else.
7629 Args.ClaimAllArgs(options::OPT_w);
7630
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007631 if (getToolChain().getArch() == llvm::Triple::mips64)
7632 CmdArgs.push_back("-EB");
7633 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7634 CmdArgs.push_back("-EL");
7635
Douglas Katzman78b37b02015-11-17 20:28:07 +00007636 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007637 CmdArgs.push_back("-e");
7638 CmdArgs.push_back("__start");
7639 }
7640
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007641 if (Args.hasArg(options::OPT_static)) {
7642 CmdArgs.push_back("-Bstatic");
7643 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007644 if (Args.hasArg(options::OPT_rdynamic))
7645 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007646 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007647 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007648 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007649 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007650 } else {
7651 CmdArgs.push_back("-dynamic-linker");
7652 CmdArgs.push_back("/usr/libexec/ld.so");
7653 }
7654 }
7655
Rafael Espindola044f7832013-06-05 04:28:55 +00007656 if (Args.hasArg(options::OPT_nopie))
7657 CmdArgs.push_back("-nopie");
7658
Daniel Dunbarb440f562010-08-02 02:38:21 +00007659 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007660 CmdArgs.push_back("-o");
7661 CmdArgs.push_back(Output.getFilename());
7662 } else {
7663 assert(Output.isNothing() && "Invalid output.");
7664 }
7665
Douglas Katzman78b37b02015-11-17 20:28:07 +00007666 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007667 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007668 if (Args.hasArg(options::OPT_pg))
7669 CmdArgs.push_back(
7670 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007671 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7674 CmdArgs.push_back(
7675 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007676 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007677 CmdArgs.push_back(
7678 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007679 }
7680 }
7681
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007682 std::string Triple = getToolChain().getTripleString();
7683 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007684 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007685 CmdArgs.push_back(
7686 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007687
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007688 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7689 options::OPT_e, options::OPT_s, options::OPT_t,
7690 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007691
Daniel Dunbar54423b22010-09-17 00:24:54 +00007692 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007693
Douglas Katzman78b37b02015-11-17 20:28:07 +00007694 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007695 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007696 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007697 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007698 CmdArgs.push_back("-lm_p");
7699 else
7700 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007701 }
7702
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007703 // FIXME: For some reason GCC passes -lgcc before adding
7704 // the default system libraries. Just mimic this for now.
7705 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007706
Eric Christopher17674ec2012-09-13 06:32:34 +00007707 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007708 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7709 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007710 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007711 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007712 }
7713
Chandler Carruth45661652011-12-17 22:32:42 +00007714 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007715 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007716 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007717 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007718 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007719 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007720
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007721 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007722 }
7723
Douglas Katzman78b37b02015-11-17 20:28:07 +00007724 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007725 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007726 CmdArgs.push_back(
7727 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007728 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007729 CmdArgs.push_back(
7730 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007731 }
7732
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007733 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007734 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007735}
Ed Schoutene33194b2009-04-02 19:13:12 +00007736
Douglas Katzman95354292015-06-23 20:42:09 +00007737void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7738 const InputInfo &Output,
7739 const InputInfoList &Inputs,
7740 const ArgList &Args,
7741 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007742 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007743 ArgStringList CmdArgs;
7744
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007745 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007746
7747 CmdArgs.push_back("-o");
7748 CmdArgs.push_back(Output.getFilename());
7749
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007750 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007751 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007752
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007753 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007754 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007755}
7756
Douglas Katzman95354292015-06-23 20:42:09 +00007757void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7758 const InputInfo &Output,
7759 const InputInfoList &Inputs,
7760 const ArgList &Args,
7761 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007762 const Driver &D = getToolChain().getDriver();
7763 ArgStringList CmdArgs;
7764
Douglas Katzman78b37b02015-11-17 20:28:07 +00007765 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007766 CmdArgs.push_back("-e");
7767 CmdArgs.push_back("__start");
7768 }
7769
7770 if (Args.hasArg(options::OPT_static)) {
7771 CmdArgs.push_back("-Bstatic");
7772 } else {
7773 if (Args.hasArg(options::OPT_rdynamic))
7774 CmdArgs.push_back("-export-dynamic");
7775 CmdArgs.push_back("--eh-frame-hdr");
7776 CmdArgs.push_back("-Bdynamic");
7777 if (Args.hasArg(options::OPT_shared)) {
7778 CmdArgs.push_back("-shared");
7779 } else {
7780 CmdArgs.push_back("-dynamic-linker");
7781 CmdArgs.push_back("/usr/libexec/ld.so");
7782 }
7783 }
7784
7785 if (Output.isFilename()) {
7786 CmdArgs.push_back("-o");
7787 CmdArgs.push_back(Output.getFilename());
7788 } else {
7789 assert(Output.isNothing() && "Invalid output.");
7790 }
7791
Douglas Katzman78b37b02015-11-17 20:28:07 +00007792 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007793 if (!Args.hasArg(options::OPT_shared)) {
7794 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007795 CmdArgs.push_back(
7796 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007797 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007798 CmdArgs.push_back(
7799 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7800 CmdArgs.push_back(
7801 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007802 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007803 CmdArgs.push_back(
7804 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007805 }
7806 }
7807
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007808 Args.AddAllArgs(CmdArgs,
7809 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007810
7811 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7812
Douglas Katzman78b37b02015-11-17 20:28:07 +00007813 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007814 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007815 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7816 if (Args.hasArg(options::OPT_pg))
7817 CmdArgs.push_back("-lm_p");
7818 else
7819 CmdArgs.push_back("-lm");
7820 }
7821
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007822 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007823 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007824 CmdArgs.push_back("-lpthread_p");
7825 else
7826 CmdArgs.push_back("-lpthread");
7827 }
7828
Eli Friedman9fa28852012-08-08 23:57:20 +00007829 if (!Args.hasArg(options::OPT_shared)) {
7830 if (Args.hasArg(options::OPT_pg))
7831 CmdArgs.push_back("-lc_p");
7832 else
7833 CmdArgs.push_back("-lc");
7834 }
7835
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007836 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007837 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007838 case llvm::Triple::arm:
7839 MyArch = "arm";
7840 break;
7841 case llvm::Triple::x86:
7842 MyArch = "i386";
7843 break;
7844 case llvm::Triple::x86_64:
7845 MyArch = "amd64";
7846 break;
7847 default:
7848 llvm_unreachable("Unsupported architecture");
7849 }
7850 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007851 }
7852
Douglas Katzman78b37b02015-11-17 20:28:07 +00007853 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007854 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007855 CmdArgs.push_back(
7856 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007857 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007858 CmdArgs.push_back(
7859 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007860 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007861
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007862 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007863 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007864}
7865
Douglas Katzman95354292015-06-23 20:42:09 +00007866void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7867 const InputInfo &Output,
7868 const InputInfoList &Inputs,
7869 const ArgList &Args,
7870 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007871 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007872 ArgStringList CmdArgs;
7873
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007874 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7875 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007876 switch (getToolChain().getArch()) {
7877 default:
7878 break;
7879 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007880 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007881 break;
7882 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007883 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007884 break;
7885 case llvm::Triple::mips:
7886 case llvm::Triple::mipsel:
7887 case llvm::Triple::mips64:
7888 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007889 StringRef CPUName;
7890 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007891 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007892
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007893 CmdArgs.push_back("-march");
7894 CmdArgs.push_back(CPUName.data());
7895
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007896 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007897 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007898
7899 if (getToolChain().getArch() == llvm::Triple::mips ||
7900 getToolChain().getArch() == llvm::Triple::mips64)
7901 CmdArgs.push_back("-EB");
7902 else
7903 CmdArgs.push_back("-EL");
7904
Dimitry Andric46f338c2015-12-27 10:36:44 +00007905 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7906 StringRef v = A->getValue();
7907 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7908 A->claim();
7909 }
7910
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007911 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007912 break;
7913 }
7914 case llvm::Triple::arm:
7915 case llvm::Triple::armeb:
7916 case llvm::Triple::thumb:
7917 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007918 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007919
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007920 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007921 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007922 else
Renato Golinf4421f72014-02-19 10:44:07 +00007923 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007924
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007925 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007926 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007927 case llvm::Triple::GNUEABI:
7928 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007929 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007930 break;
7931
7932 default:
7933 CmdArgs.push_back("-matpcs");
7934 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007935 break;
7936 }
7937 case llvm::Triple::sparc:
7938 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007939 case llvm::Triple::sparcv9: {
7940 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7941 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007942 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007943 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007944 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007945 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007947 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007948
7949 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007950 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007951
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007952 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007953 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007954
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007955 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007956 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007957}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007958
Douglas Katzman95354292015-06-23 20:42:09 +00007959void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7960 const InputInfo &Output,
7961 const InputInfoList &Inputs,
7962 const ArgList &Args,
7963 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007964 const toolchains::FreeBSD &ToolChain =
7965 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007966 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007967 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007968 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007969 !Args.hasArg(options::OPT_shared) &&
7970 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007971 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007972
7973 // Silence warning for "clang -g foo.o -o foo"
7974 Args.ClaimAllArgs(options::OPT_g_Group);
7975 // and "clang -emit-llvm foo.o -o foo"
7976 Args.ClaimAllArgs(options::OPT_emit_llvm);
7977 // and for "clang -w foo.o -o foo". Other warning options are already
7978 // handled somewhere else.
7979 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007980
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007981 if (!D.SysRoot.empty())
7982 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7983
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007984 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007985 CmdArgs.push_back("-pie");
7986
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007987 if (Args.hasArg(options::OPT_static)) {
7988 CmdArgs.push_back("-Bstatic");
7989 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007990 if (Args.hasArg(options::OPT_rdynamic))
7991 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007992 CmdArgs.push_back("--eh-frame-hdr");
7993 if (Args.hasArg(options::OPT_shared)) {
7994 CmdArgs.push_back("-Bshareable");
7995 } else {
7996 CmdArgs.push_back("-dynamic-linker");
7997 CmdArgs.push_back("/libexec/ld-elf.so.1");
7998 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007999 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008000 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8001 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8002 CmdArgs.push_back("--hash-style=both");
8003 }
8004 }
8005 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008006 }
8007
8008 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8009 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008010 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008011 CmdArgs.push_back("-m");
8012 CmdArgs.push_back("elf_i386_fbsd");
8013 }
8014
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008015 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008016 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008017 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008018 }
8019
Dimitry Andric904895f2015-12-27 06:47:09 +00008020 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8021 if (ToolChain.getArch() == llvm::Triple::mips ||
8022 ToolChain.getArch() == llvm::Triple::mipsel ||
8023 ToolChain.getArch() == llvm::Triple::mips64 ||
8024 ToolChain.getArch() == llvm::Triple::mips64el) {
8025 StringRef v = A->getValue();
8026 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8027 A->claim();
8028 }
8029 }
8030
Daniel Dunbarb440f562010-08-02 02:38:21 +00008031 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008032 CmdArgs.push_back("-o");
8033 CmdArgs.push_back(Output.getFilename());
8034 } else {
8035 assert(Output.isNothing() && "Invalid output.");
8036 }
8037
Douglas Katzman78b37b02015-11-17 20:28:07 +00008038 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008039 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008040 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008041 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008042 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008043 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008044 crt1 = "Scrt1.o";
8045 else
8046 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008047 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008048 if (crt1)
8049 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8050
8051 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8052
Craig Topper92fc2df2014-05-17 16:56:41 +00008053 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008054 if (Args.hasArg(options::OPT_static))
8055 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008056 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008057 crtbegin = "crtbeginS.o";
8058 else
8059 crtbegin = "crtbegin.o";
8060
8061 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008062 }
8063
8064 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008065 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008066 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8067 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008068 Args.AddAllArgs(CmdArgs, options::OPT_s);
8069 Args.AddAllArgs(CmdArgs, options::OPT_t);
8070 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8071 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008072
Teresa Johnson945bc502015-10-15 20:35:53 +00008073 if (D.isUsingLTO())
8074 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008075
Alexey Samsonov52550342014-09-15 19:58:40 +00008076 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008077 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008078
Douglas Katzman78b37b02015-11-17 20:28:07 +00008079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008080 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008081 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008082 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008083 if (Args.hasArg(options::OPT_pg))
8084 CmdArgs.push_back("-lm_p");
8085 else
8086 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008087 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008088 if (NeedsSanitizerDeps)
8089 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008090 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8091 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008092 if (Args.hasArg(options::OPT_pg))
8093 CmdArgs.push_back("-lgcc_p");
8094 else
8095 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008096 if (Args.hasArg(options::OPT_static)) {
8097 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008098 } else if (Args.hasArg(options::OPT_pg)) {
8099 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008100 } else {
8101 CmdArgs.push_back("--as-needed");
8102 CmdArgs.push_back("-lgcc_s");
8103 CmdArgs.push_back("--no-as-needed");
8104 }
8105
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008106 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008107 if (Args.hasArg(options::OPT_pg))
8108 CmdArgs.push_back("-lpthread_p");
8109 else
8110 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008111 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008112
Roman Divacky66f22762011-02-10 16:59:40 +00008113 if (Args.hasArg(options::OPT_pg)) {
8114 if (Args.hasArg(options::OPT_shared))
8115 CmdArgs.push_back("-lc");
8116 else
8117 CmdArgs.push_back("-lc_p");
8118 CmdArgs.push_back("-lgcc_p");
8119 } else {
8120 CmdArgs.push_back("-lc");
8121 CmdArgs.push_back("-lgcc");
8122 }
8123
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008124 if (Args.hasArg(options::OPT_static)) {
8125 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008126 } else if (Args.hasArg(options::OPT_pg)) {
8127 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008128 } else {
8129 CmdArgs.push_back("--as-needed");
8130 CmdArgs.push_back("-lgcc_s");
8131 CmdArgs.push_back("--no-as-needed");
8132 }
8133 }
8134
Douglas Katzman78b37b02015-11-17 20:28:07 +00008135 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008136 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008138 else
8139 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008141 }
8142
Xinliang David Li69306c02015-10-22 06:15:31 +00008143 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008145 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008147}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008148
Douglas Katzman95354292015-06-23 20:42:09 +00008149void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008150 const InputInfo &Output,
8151 const InputInfoList &Inputs,
8152 const ArgList &Args,
8153 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008154 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008155 ArgStringList CmdArgs;
8156
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008157 // GNU as needs different flags for creating the correct output format
8158 // on architectures with different ABIs or optional feature sets.
8159 switch (getToolChain().getArch()) {
8160 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008161 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008162 break;
8163 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008164 case llvm::Triple::armeb:
8165 case llvm::Triple::thumb:
8166 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008167 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008168 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8169 std::string Arch =
8170 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008171 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008172 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008173 }
8174
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008175 case llvm::Triple::mips:
8176 case llvm::Triple::mipsel:
8177 case llvm::Triple::mips64:
8178 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008179 StringRef CPUName;
8180 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008181 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008182
8183 CmdArgs.push_back("-march");
8184 CmdArgs.push_back(CPUName.data());
8185
8186 CmdArgs.push_back("-mabi");
8187 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8188
8189 if (getToolChain().getArch() == llvm::Triple::mips ||
8190 getToolChain().getArch() == llvm::Triple::mips64)
8191 CmdArgs.push_back("-EB");
8192 else
8193 CmdArgs.push_back("-EL");
8194
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008195 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008196 break;
8197 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008198
8199 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008200 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008201 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008202 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8203 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008204 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008205 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008206 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008207
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008208 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008209 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008210 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8211 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008212 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008213 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008214 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008215
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008216 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008217 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008218 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008219
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008220 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008221
8222 CmdArgs.push_back("-o");
8223 CmdArgs.push_back(Output.getFilename());
8224
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008225 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008226 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008227
David Chisnallddbd68f2011-09-27 22:03:18 +00008228 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008229 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008230}
8231
Douglas Katzman95354292015-06-23 20:42:09 +00008232void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8233 const InputInfo &Output,
8234 const InputInfoList &Inputs,
8235 const ArgList &Args,
8236 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008237 const Driver &D = getToolChain().getDriver();
8238 ArgStringList CmdArgs;
8239
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008240 if (!D.SysRoot.empty())
8241 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8242
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008243 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008244 if (Args.hasArg(options::OPT_static)) {
8245 CmdArgs.push_back("-Bstatic");
8246 } else {
8247 if (Args.hasArg(options::OPT_rdynamic))
8248 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008249 if (Args.hasArg(options::OPT_shared)) {
8250 CmdArgs.push_back("-Bshareable");
8251 } else {
8252 CmdArgs.push_back("-dynamic-linker");
8253 CmdArgs.push_back("/libexec/ld.elf_so");
8254 }
8255 }
8256
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008257 // Many NetBSD architectures support more than one ABI.
8258 // Determine the correct emulation for ld.
8259 switch (getToolChain().getArch()) {
8260 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008261 CmdArgs.push_back("-m");
8262 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008263 break;
8264 case llvm::Triple::arm:
8265 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008266 CmdArgs.push_back("-m");
8267 switch (getToolChain().getTriple().getEnvironment()) {
8268 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008269 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008270 CmdArgs.push_back("armelf_nbsd_eabi");
8271 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008272 case llvm::Triple::EABIHF:
8273 case llvm::Triple::GNUEABIHF:
8274 CmdArgs.push_back("armelf_nbsd_eabihf");
8275 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008276 default:
8277 CmdArgs.push_back("armelf_nbsd");
8278 break;
8279 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008280 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008281 case llvm::Triple::armeb:
8282 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008283 arm::appendEBLinkFlags(
8284 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008285 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008286 CmdArgs.push_back("-m");
8287 switch (getToolChain().getTriple().getEnvironment()) {
8288 case llvm::Triple::EABI:
8289 case llvm::Triple::GNUEABI:
8290 CmdArgs.push_back("armelfb_nbsd_eabi");
8291 break;
8292 case llvm::Triple::EABIHF:
8293 case llvm::Triple::GNUEABIHF:
8294 CmdArgs.push_back("armelfb_nbsd_eabihf");
8295 break;
8296 default:
8297 CmdArgs.push_back("armelfb_nbsd");
8298 break;
8299 }
8300 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008301 case llvm::Triple::mips64:
8302 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008303 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008304 CmdArgs.push_back("-m");
8305 if (getToolChain().getArch() == llvm::Triple::mips64)
8306 CmdArgs.push_back("elf32btsmip");
8307 else
8308 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008309 } else if (mips::hasMipsAbiArg(Args, "64")) {
8310 CmdArgs.push_back("-m");
8311 if (getToolChain().getArch() == llvm::Triple::mips64)
8312 CmdArgs.push_back("elf64btsmip");
8313 else
8314 CmdArgs.push_back("elf64ltsmip");
8315 }
8316 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008317 case llvm::Triple::ppc:
8318 CmdArgs.push_back("-m");
8319 CmdArgs.push_back("elf32ppc_nbsd");
8320 break;
8321
8322 case llvm::Triple::ppc64:
8323 case llvm::Triple::ppc64le:
8324 CmdArgs.push_back("-m");
8325 CmdArgs.push_back("elf64ppc");
8326 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008327
8328 case llvm::Triple::sparc:
8329 CmdArgs.push_back("-m");
8330 CmdArgs.push_back("elf32_sparc");
8331 break;
8332
8333 case llvm::Triple::sparcv9:
8334 CmdArgs.push_back("-m");
8335 CmdArgs.push_back("elf64_sparc");
8336 break;
8337
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008338 default:
8339 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008340 }
8341
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008342 if (Output.isFilename()) {
8343 CmdArgs.push_back("-o");
8344 CmdArgs.push_back(Output.getFilename());
8345 } else {
8346 assert(Output.isNothing() && "Invalid output.");
8347 }
8348
Douglas Katzman78b37b02015-11-17 20:28:07 +00008349 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008350 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008351 CmdArgs.push_back(
8352 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8353 CmdArgs.push_back(
8354 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8355 CmdArgs.push_back(
8356 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008357 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008358 CmdArgs.push_back(
8359 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8360 CmdArgs.push_back(
8361 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008362 }
8363 }
8364
8365 Args.AddAllArgs(CmdArgs, options::OPT_L);
8366 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8367 Args.AddAllArgs(CmdArgs, options::OPT_e);
8368 Args.AddAllArgs(CmdArgs, options::OPT_s);
8369 Args.AddAllArgs(CmdArgs, options::OPT_t);
8370 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8371 Args.AddAllArgs(CmdArgs, options::OPT_r);
8372
8373 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8374
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008375 unsigned Major, Minor, Micro;
8376 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8377 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008378 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008379 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008380 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008381 case llvm::Triple::arm:
8382 case llvm::Triple::armeb:
8383 case llvm::Triple::thumb:
8384 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008385 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008386 case llvm::Triple::ppc64:
8387 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008388 case llvm::Triple::x86:
8389 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008390 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008391 break;
8392 default:
8393 break;
8394 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008395 }
8396
Douglas Katzman78b37b02015-11-17 20:28:07 +00008397 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008398 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008399 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008400 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8401 CmdArgs.push_back("-lm");
8402 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008403 if (Args.hasArg(options::OPT_pthread))
8404 CmdArgs.push_back("-lpthread");
8405 CmdArgs.push_back("-lc");
8406
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008407 if (useLibgcc) {
8408 if (Args.hasArg(options::OPT_static)) {
8409 // libgcc_eh depends on libc, so resolve as much as possible,
8410 // pull in any new requirements from libc and then get the rest
8411 // of libgcc.
8412 CmdArgs.push_back("-lgcc_eh");
8413 CmdArgs.push_back("-lc");
8414 CmdArgs.push_back("-lgcc");
8415 } else {
8416 CmdArgs.push_back("-lgcc");
8417 CmdArgs.push_back("--as-needed");
8418 CmdArgs.push_back("-lgcc_s");
8419 CmdArgs.push_back("--no-as-needed");
8420 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 }
8422 }
8423
Douglas Katzman78b37b02015-11-17 20:28:07 +00008424 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008425 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008426 CmdArgs.push_back(
8427 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008428 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 CmdArgs.push_back(
8430 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8431 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008432 }
8433
Xinliang David Li69306c02015-10-22 06:15:31 +00008434 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008435
Logan Chieneb9162f2014-06-26 14:23:45 +00008436 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008438}
8439
Douglas Katzman95354292015-06-23 20:42:09 +00008440void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8441 const InputInfo &Output,
8442 const InputInfoList &Inputs,
8443 const ArgList &Args,
8444 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008445 claimNoWarnArgs(Args);
8446
James Y Knight2db38f32015-08-15 03:45:25 +00008447 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8448 llvm::Triple Triple = llvm::Triple(TripleStr);
8449
Rafael Espindola92b00932010-08-10 00:25:48 +00008450 ArgStringList CmdArgs;
8451
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008452 llvm::Reloc::Model RelocationModel;
8453 unsigned PICLevel;
8454 bool IsPIE;
8455 std::tie(RelocationModel, PICLevel, IsPIE) =
8456 ParsePICArgs(getToolChain(), Triple, Args);
8457
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008458 switch (getToolChain().getArch()) {
8459 default:
8460 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008461 // Add --32/--64 to make sure we get the format we want.
8462 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008463 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008464 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008465 break;
8466 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008467 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8468 CmdArgs.push_back("--x32");
8469 else
8470 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008471 break;
8472 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008473 CmdArgs.push_back("-a32");
8474 CmdArgs.push_back("-mppc");
8475 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008476 break;
8477 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008478 CmdArgs.push_back("-a64");
8479 CmdArgs.push_back("-mppc64");
8480 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008481 break;
8482 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008483 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008484 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008485 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008486 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008487 break;
8488 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008489 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008490 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008491 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8492 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8493 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008494 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008495 }
8496 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008497 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008498 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8499 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8500 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008501 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008502 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008503 case llvm::Triple::arm:
8504 case llvm::Triple::armeb:
8505 case llvm::Triple::thumb:
8506 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008507 const llvm::Triple &Triple2 = getToolChain().getTriple();
8508 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008509 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008510 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008511 break;
8512 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008513 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008514 break;
8515 default:
8516 break;
8517 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008518
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008519 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008520 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8521 case arm::FloatABI::Soft:
8522 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8523 break;
8524 case arm::FloatABI::SoftFP:
8525 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8526 break;
8527 case arm::FloatABI::Hard:
8528 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8529 break;
8530 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008531
8532 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008533
8534 // FIXME: remove krait check when GNU tools support krait cpu
8535 // for now replace it with -march=armv7-a to avoid a lower
8536 // march from being picked in the absence of a cpu flag.
8537 Arg *A;
8538 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008539 StringRef(A->getValue()).lower() == "krait")
8540 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008541 else
8542 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008543 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008544 break;
8545 }
8546 case llvm::Triple::mips:
8547 case llvm::Triple::mipsel:
8548 case llvm::Triple::mips64:
8549 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008550 StringRef CPUName;
8551 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008552 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008553 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008554
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008555 CmdArgs.push_back("-march");
8556 CmdArgs.push_back(CPUName.data());
8557
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008558 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008559 CmdArgs.push_back(ABIName.data());
8560
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008561 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8562 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008563 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008564 CmdArgs.push_back("-mno-shared");
8565
Daniel Sanders379d44b2014-07-16 11:52:23 +00008566 // LLVM doesn't support -mplt yet and acts as if it is always given.
8567 // However, -mplt has no effect with the N64 ABI.
8568 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008569
8570 if (getToolChain().getArch() == llvm::Triple::mips ||
8571 getToolChain().getArch() == llvm::Triple::mips64)
8572 CmdArgs.push_back("-EB");
8573 else
8574 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008575
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008576 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8577 if (StringRef(A->getValue()) == "2008")
8578 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8579 }
8580
Daniel Sanders379d44b2014-07-16 11:52:23 +00008581 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8582 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8583 options::OPT_mfp64)) {
8584 A->claim();
8585 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008586 } else if (mips::shouldUseFPXX(
8587 Args, getToolChain().getTriple(), CPUName, ABIName,
8588 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008589 CmdArgs.push_back("-mfpxx");
8590
8591 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8592 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008593 if (Arg *A =
8594 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008595 if (A->getOption().matches(options::OPT_mips16)) {
8596 A->claim();
8597 A->render(Args, CmdArgs);
8598 } else {
8599 A->claim();
8600 CmdArgs.push_back("-no-mips16");
8601 }
8602 }
8603
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008604 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8605 options::OPT_mno_micromips);
8606 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8607 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8608
Simon Atanasyanbd986632013-11-26 11:58:04 +00008609 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8610 // Do not use AddLastArg because not all versions of MIPS assembler
8611 // support -mmsa / -mno-msa options.
8612 if (A->getOption().matches(options::OPT_mmsa))
8613 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8614 }
8615
Daniel Sanders379d44b2014-07-16 11:52:23 +00008616 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8617 options::OPT_msoft_float);
8618
Toma Tabacub36d6102015-06-11 12:13:18 +00008619 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8620 options::OPT_msingle_float);
8621
Daniel Sanders379d44b2014-07-16 11:52:23 +00008622 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8623 options::OPT_mno_odd_spreg);
8624
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008626 break;
8627 }
8628 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008629 // Always pass an -march option, since our default of z10 is later
8630 // than the GNU assembler's default.
8631 StringRef CPUName = getSystemZTargetCPU(Args);
8632 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008633 break;
8634 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008635 }
8636
Renato Golina74bbc72015-07-22 15:32:36 +00008637 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008638 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008639
8640 CmdArgs.push_back("-o");
8641 CmdArgs.push_back(Output.getFilename());
8642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008643 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008644 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008645
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008646 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008648
8649 // Handle the debug info splitting at object creation time if we're
8650 // creating an object.
8651 // TODO: Currently only works on linux with newer objcopy.
8652 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008653 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008655 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008656}
8657
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008658static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008659 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008660 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008661 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008662 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8663 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008664 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008665 CmdArgs.push_back("-lgcc");
8666
Logan Chien3d3373c2012-11-19 12:04:11 +00008667 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008668 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008669 CmdArgs.push_back("-lgcc");
8670 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008671 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008672 CmdArgs.push_back("--as-needed");
8673 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008674 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008675 CmdArgs.push_back("--no-as-needed");
8676 }
8677
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008678 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008679 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008680 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008681 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008682
8683 // According to Android ABI, we have to link with libdl if we are
8684 // linking with non-static libgcc.
8685 //
8686 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8687 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8688 if (isAndroid && !StaticLibgcc)
8689 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008690}
8691
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008692static std::string getLinuxDynamicLinker(const ArgList &Args,
8693 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008694 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8695
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008696 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008697 if (ToolChain.getTriple().isArch64Bit())
8698 return "/system/bin/linker64";
8699 else
8700 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008701 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8702 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008703 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008704 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008705 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008706 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008707 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008708 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008709 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008710 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008711 return "/lib/ld-linux-armhf.so.3";
8712 else
8713 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008714 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8715 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008716 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008717 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008718 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008719 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008720 return "/lib/ld-linux.so.3";
8721 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8722 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008723 std::string LibDir =
8724 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008725 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008726 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008727 if (mips::isUCLibc(Args))
8728 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008729 else if (!ToolChain.getTriple().hasEnvironment()) {
8730 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8731 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8732 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8733 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008734 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008735
8736 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008737 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008738 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008739 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008740 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8741 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008742 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008743 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008744 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8745 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008746 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008747 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008748 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008749 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008750 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008751 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008752 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8753 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008754 else
8755 return "/lib64/ld-linux-x86-64.so.2";
8756}
8757
Renato Golinc4b49242014-02-13 10:01:16 +00008758static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008759 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008760 // Make use of compiler-rt if --rtlib option is used
8761 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8762
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008763 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008764 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008765 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008766 default:
8767 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008768 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008769 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008770 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008771 break;
8772 }
Renato Golinc4b49242014-02-13 10:01:16 +00008773 break;
8774 case ToolChain::RLT_Libgcc:
8775 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8776 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008777 }
8778}
8779
Rafael Espindola1e085772014-08-15 17:14:35 +00008780static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8781 switch (T.getArch()) {
8782 case llvm::Triple::x86:
8783 return "elf_i386";
8784 case llvm::Triple::aarch64:
8785 return "aarch64linux";
8786 case llvm::Triple::aarch64_be:
8787 return "aarch64_be_linux";
8788 case llvm::Triple::arm:
8789 case llvm::Triple::thumb:
8790 return "armelf_linux_eabi";
8791 case llvm::Triple::armeb:
8792 case llvm::Triple::thumbeb:
8793 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8794 case llvm::Triple::ppc:
8795 return "elf32ppclinux";
8796 case llvm::Triple::ppc64:
8797 return "elf64ppc";
8798 case llvm::Triple::ppc64le:
8799 return "elf64lppc";
8800 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008801 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008802 return "elf32_sparc";
8803 case llvm::Triple::sparcv9:
8804 return "elf64_sparc";
8805 case llvm::Triple::mips:
8806 return "elf32btsmip";
8807 case llvm::Triple::mipsel:
8808 return "elf32ltsmip";
8809 case llvm::Triple::mips64:
8810 if (mips::hasMipsAbiArg(Args, "n32"))
8811 return "elf32btsmipn32";
8812 return "elf64btsmip";
8813 case llvm::Triple::mips64el:
8814 if (mips::hasMipsAbiArg(Args, "n32"))
8815 return "elf32ltsmipn32";
8816 return "elf64ltsmip";
8817 case llvm::Triple::systemz:
8818 return "elf64_s390";
8819 case llvm::Triple::x86_64:
8820 if (T.getEnvironment() == llvm::Triple::GNUX32)
8821 return "elf32_x86_64";
8822 return "elf_x86_64";
8823 default:
8824 llvm_unreachable("Unexpected arch");
8825 }
8826}
8827
Douglas Katzman95354292015-06-23 20:42:09 +00008828void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8829 const InputInfo &Output,
8830 const InputInfoList &Inputs,
8831 const ArgList &Args,
8832 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008833 const toolchains::Linux &ToolChain =
8834 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008835 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008836
8837 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8838 llvm::Triple Triple = llvm::Triple(TripleStr);
8839
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008840 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008841 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008842 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008843 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8844 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008845 const bool HasCRTBeginEndFiles =
8846 ToolChain.getTriple().hasEnvironment() ||
8847 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008848
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008849 ArgStringList CmdArgs;
8850
Rafael Espindolad1002f62010-11-15 18:28:16 +00008851 // Silence warning for "clang -g foo.o -o foo"
8852 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008853 // and "clang -emit-llvm foo.o -o foo"
8854 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008855 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008856 // handled somewhere else.
8857 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008858
Peter Collingbourne39719a72015-11-20 20:49:39 +00008859 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8860 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008861 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008862 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008863 CmdArgs.push_back("-target");
8864 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8865 }
8866
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008867 if (!D.SysRoot.empty())
8868 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008869
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008870 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008871 CmdArgs.push_back("-pie");
8872
Rafael Espindola1c76c592010-11-07 22:57:16 +00008873 if (Args.hasArg(options::OPT_rdynamic))
8874 CmdArgs.push_back("-export-dynamic");
8875
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008876 if (Args.hasArg(options::OPT_s))
8877 CmdArgs.push_back("-s");
8878
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008879 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008880 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008881
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008882 for (const auto &Opt : ToolChain.ExtraOpts)
8883 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008884
8885 if (!Args.hasArg(options::OPT_static)) {
8886 CmdArgs.push_back("--eh-frame-hdr");
8887 }
8888
8889 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008890 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008891
8892 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008893 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8894 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008895 CmdArgs.push_back("-Bstatic");
8896 else
8897 CmdArgs.push_back("-static");
8898 } else if (Args.hasArg(options::OPT_shared)) {
8899 CmdArgs.push_back("-shared");
8900 }
8901
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008902 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8903 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008904 (!Args.hasArg(options::OPT_static) &&
8905 !Args.hasArg(options::OPT_shared))) {
8906 CmdArgs.push_back("-dynamic-linker");
8907 CmdArgs.push_back(Args.MakeArgString(
8908 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8909 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008910
8911 CmdArgs.push_back("-o");
8912 CmdArgs.push_back(Output.getFilename());
8913
Douglas Katzman78b37b02015-11-17 20:28:07 +00008914 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008915 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008916 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008917 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008918 if (Args.hasArg(options::OPT_pg))
8919 crt1 = "gcrt1.o";
8920 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008921 crt1 = "Scrt1.o";
8922 else
8923 crt1 = "crt1.o";
8924 }
8925 if (crt1)
8926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008927
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8929 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008930
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008931 const char *crtbegin;
8932 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008933 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008934 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008935 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008936 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008937 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008938 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008939 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008940
8941 if (HasCRTBeginEndFiles)
8942 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008943
8944 // Add crtfastmath.o if available and fast math is enabled.
8945 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008946 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008947
8948 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008949 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008950
Douglas Katzman6059ef92015-11-17 17:41:23 +00008951 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008952
Teresa Johnson945bc502015-10-15 20:35:53 +00008953 if (D.isUsingLTO())
8954 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008955
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008956 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8957 CmdArgs.push_back("--no-demangle");
8958
Alexey Samsonov52550342014-09-15 19:58:40 +00008959 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008960 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008961 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008962 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008963
Douglas Katzman78b37b02015-11-17 20:28:07 +00008964 if (D.CCCIsCXX() &&
8965 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008966 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008967 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008968 if (OnlyLibstdcxxStatic)
8969 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008970 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008971 if (OnlyLibstdcxxStatic)
8972 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008973 CmdArgs.push_back("-lm");
8974 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008975 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8976 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008977
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008978 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008979 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8980 if (Args.hasArg(options::OPT_static))
8981 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008982
Alexey Samsonov52550342014-09-15 19:58:40 +00008983 if (NeedsSanitizerDeps)
8984 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8985
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008986 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8987 Args.hasArg(options::OPT_pthreads);
8988
8989 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8990 options::OPT_fno_openmp, false)) {
8991 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8992 // FIXME: Does this really make sense for all GNU toolchains?
8993 WantPthread = true;
8994
8995 // Also link the particular OpenMP runtimes.
8996 switch (getOpenMPRuntime(ToolChain, Args)) {
8997 case OMPRT_OMP:
8998 CmdArgs.push_back("-lomp");
8999 break;
9000 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009001 CmdArgs.push_back("-lgomp");
9002
9003 // FIXME: Exclude this for platforms with libgomp that don't require
9004 // librt. Most modern Linux platforms require it, but some may not.
9005 CmdArgs.push_back("-lrt");
9006 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009007 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009008 CmdArgs.push_back("-liomp5");
9009 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009010 case OMPRT_Unknown:
9011 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009012 break;
9013 }
Chandler Carruth01538002013-01-17 13:19:29 +00009014 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009015
Renato Golinc4b49242014-02-13 10:01:16 +00009016 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009017
Richard Smith31d1de22015-05-20 22:48:44 +00009018 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009019 CmdArgs.push_back("-lpthread");
9020
Rafael Espindolab17bc532016-01-25 18:29:16 +00009021 if (Args.hasArg(options::OPT_fsplit_stack))
9022 CmdArgs.push_back("--wrap=pthread_create");
9023
Chandler Carruth94a32012012-05-14 18:31:18 +00009024 CmdArgs.push_back("-lc");
9025
9026 if (Args.hasArg(options::OPT_static))
9027 CmdArgs.push_back("--end-group");
9028 else
Renato Golinc4b49242014-02-13 10:01:16 +00009029 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009030 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009031
Rafael Espindola81937ec2010-12-01 01:52:43 +00009032 if (!Args.hasArg(options::OPT_nostartfiles)) {
9033 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009034 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009035 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009036 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009037 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009038 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009039 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009040
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009041 if (HasCRTBeginEndFiles)
9042 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009043 if (!isAndroid)
9044 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009045 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009046 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009047
Peter Collingbourne39719a72015-11-20 20:49:39 +00009048 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009049}
9050
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009051// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9052// for the various SFI requirements like register masking. The assembly tool
9053// inserts the file containing the macros as an input into all the assembly
9054// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009055void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9056 const InputInfo &Output,
9057 const InputInfoList &Inputs,
9058 const ArgList &Args,
9059 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009060 const toolchains::NaClToolChain &ToolChain =
9061 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009062 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009063 "nacl-arm-macros.s");
9064 InputInfoList NewInputs;
9065 NewInputs.push_back(NaClMacros);
9066 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009067 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9068 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009069}
9070
Douglas Katzman750cfc52015-06-29 18:42:16 +00009071// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009072// we use static by default, do not yet support sanitizers or LTO, and a few
9073// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009074// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009075void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9076 const InputInfo &Output,
9077 const InputInfoList &Inputs,
9078 const ArgList &Args,
9079 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009080
Douglas Katzman54366072015-07-27 16:53:08 +00009081 const toolchains::NaClToolChain &ToolChain =
9082 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009083 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009084 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009085 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009086 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009087
9088 ArgStringList CmdArgs;
9089
9090 // Silence warning for "clang -g foo.o -o foo"
9091 Args.ClaimAllArgs(options::OPT_g_Group);
9092 // and "clang -emit-llvm foo.o -o foo"
9093 Args.ClaimAllArgs(options::OPT_emit_llvm);
9094 // and for "clang -w foo.o -o foo". Other warning options are already
9095 // handled somewhere else.
9096 Args.ClaimAllArgs(options::OPT_w);
9097
9098 if (!D.SysRoot.empty())
9099 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9100
9101 if (Args.hasArg(options::OPT_rdynamic))
9102 CmdArgs.push_back("-export-dynamic");
9103
9104 if (Args.hasArg(options::OPT_s))
9105 CmdArgs.push_back("-s");
9106
Douglas Katzman54366072015-07-27 16:53:08 +00009107 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9108 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009109 CmdArgs.push_back("--build-id");
9110
9111 if (!IsStatic)
9112 CmdArgs.push_back("--eh-frame-hdr");
9113
9114 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009115 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009116 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009117 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009118 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009119 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009120 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009121 else if (Arch == llvm::Triple::mipsel)
9122 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009123 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009124 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9125 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009126
9127 if (IsStatic)
9128 CmdArgs.push_back("-static");
9129 else if (Args.hasArg(options::OPT_shared))
9130 CmdArgs.push_back("-shared");
9131
9132 CmdArgs.push_back("-o");
9133 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009134 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009135 if (!Args.hasArg(options::OPT_shared))
9136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9138
9139 const char *crtbegin;
9140 if (IsStatic)
9141 crtbegin = "crtbeginT.o";
9142 else if (Args.hasArg(options::OPT_shared))
9143 crtbegin = "crtbeginS.o";
9144 else
9145 crtbegin = "crtbegin.o";
9146 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9147 }
9148
9149 Args.AddAllArgs(CmdArgs, options::OPT_L);
9150 Args.AddAllArgs(CmdArgs, options::OPT_u);
9151
Douglas Katzman6059ef92015-11-17 17:41:23 +00009152 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009153
9154 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9155 CmdArgs.push_back("--no-demangle");
9156
9157 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9158
Douglas Katzman78b37b02015-11-17 20:28:07 +00009159 if (D.CCCIsCXX() &&
9160 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009161 bool OnlyLibstdcxxStatic =
9162 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009163 if (OnlyLibstdcxxStatic)
9164 CmdArgs.push_back("-Bstatic");
9165 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9166 if (OnlyLibstdcxxStatic)
9167 CmdArgs.push_back("-Bdynamic");
9168 CmdArgs.push_back("-lm");
9169 }
9170
9171 if (!Args.hasArg(options::OPT_nostdlib)) {
9172 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9173 // Always use groups, since it has no effect on dynamic libraries.
9174 CmdArgs.push_back("--start-group");
9175 CmdArgs.push_back("-lc");
9176 // NaCl's libc++ currently requires libpthread, so just always include it
9177 // in the group for C++.
9178 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009179 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009180 // Gold, used by Mips, handles nested groups differently than ld, and
9181 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9182 // which is not a desired behaviour here.
9183 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9184 if (getToolChain().getArch() == llvm::Triple::mipsel)
9185 CmdArgs.push_back("-lnacl");
9186
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009187 CmdArgs.push_back("-lpthread");
9188 }
9189
9190 CmdArgs.push_back("-lgcc");
9191 CmdArgs.push_back("--as-needed");
9192 if (IsStatic)
9193 CmdArgs.push_back("-lgcc_eh");
9194 else
9195 CmdArgs.push_back("-lgcc_s");
9196 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009197
9198 // Mips needs to create and use pnacl_legacy library that contains
9199 // definitions from bitcode/pnaclmm.c and definitions for
9200 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9201 if (getToolChain().getArch() == llvm::Triple::mipsel)
9202 CmdArgs.push_back("-lpnacl_legacy");
9203
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009204 CmdArgs.push_back("--end-group");
9205 }
9206
9207 if (!Args.hasArg(options::OPT_nostartfiles)) {
9208 const char *crtend;
9209 if (Args.hasArg(options::OPT_shared))
9210 crtend = "crtendS.o";
9211 else
9212 crtend = "crtend.o";
9213
9214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9216 }
9217 }
9218
Peter Collingbourne39719a72015-11-20 20:49:39 +00009219 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009221}
9222
Douglas Katzman95354292015-06-23 20:42:09 +00009223void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9224 const InputInfo &Output,
9225 const InputInfoList &Inputs,
9226 const ArgList &Args,
9227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009228 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009229 ArgStringList CmdArgs;
9230
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009231 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009232
9233 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009234 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009235
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009236 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009237 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009238
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009239 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009240 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009241}
9242
Douglas Katzman95354292015-06-23 20:42:09 +00009243void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9244 const InputInfo &Output,
9245 const InputInfoList &Inputs,
9246 const ArgList &Args,
9247 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009248 const Driver &D = getToolChain().getDriver();
9249 ArgStringList CmdArgs;
9250
Daniel Dunbarb440f562010-08-02 02:38:21 +00009251 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009252 CmdArgs.push_back("-o");
9253 CmdArgs.push_back(Output.getFilename());
9254 } else {
9255 assert(Output.isNothing() && "Invalid output.");
9256 }
9257
Douglas Katzman78b37b02015-11-17 20:28:07 +00009258 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009259 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9260 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9261 CmdArgs.push_back(
9262 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9263 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009264 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009265
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009266 Args.AddAllArgs(CmdArgs,
9267 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009268
Daniel Dunbar54423b22010-09-17 00:24:54 +00009269 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009270
Xinliang David Li69306c02015-10-22 06:15:31 +00009271 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009272
Douglas Katzman78b37b02015-11-17 20:28:07 +00009273 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009274 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009275 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009276 CmdArgs.push_back("-lm");
9277 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009278 }
9279
Douglas Katzman78b37b02015-11-17 20:28:07 +00009280 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009281 if (Args.hasArg(options::OPT_pthread))
9282 CmdArgs.push_back("-lpthread");
9283 CmdArgs.push_back("-lc");
9284 CmdArgs.push_back("-lCompilerRT-Generic");
9285 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9286 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009287 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009288 }
9289
Logan Chieneb9162f2014-06-26 14:23:45 +00009290 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009292}
9293
Daniel Dunbarcc912342009-05-02 18:28:39 +00009294/// DragonFly Tools
9295
9296// For now, DragonFly Assemble does just about the same as for
9297// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009298void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9299 const InputInfo &Output,
9300 const InputInfoList &Inputs,
9301 const ArgList &Args,
9302 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009303 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009304 ArgStringList CmdArgs;
9305
9306 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9307 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009308 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009309 CmdArgs.push_back("--32");
9310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009311 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009312
9313 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009314 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009315
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009316 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009317 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009318
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009319 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009320 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009321}
9322
Douglas Katzman95354292015-06-23 20:42:09 +00009323void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9324 const InputInfo &Output,
9325 const InputInfoList &Inputs,
9326 const ArgList &Args,
9327 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009328 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009329 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009330
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009331 if (!D.SysRoot.empty())
9332 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9333
John McCall65b8da02013-04-11 22:55:55 +00009334 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009335 if (Args.hasArg(options::OPT_static)) {
9336 CmdArgs.push_back("-Bstatic");
9337 } else {
John McCall65b8da02013-04-11 22:55:55 +00009338 if (Args.hasArg(options::OPT_rdynamic))
9339 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009340 if (Args.hasArg(options::OPT_shared))
9341 CmdArgs.push_back("-Bshareable");
9342 else {
9343 CmdArgs.push_back("-dynamic-linker");
9344 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9345 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009346 CmdArgs.push_back("--hash-style=gnu");
9347 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009348 }
9349
9350 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9351 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009352 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009353 CmdArgs.push_back("-m");
9354 CmdArgs.push_back("elf_i386");
9355 }
9356
Daniel Dunbarb440f562010-08-02 02:38:21 +00009357 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009358 CmdArgs.push_back("-o");
9359 CmdArgs.push_back(Output.getFilename());
9360 } else {
9361 assert(Output.isNothing() && "Invalid output.");
9362 }
9363
Douglas Katzman78b37b02015-11-17 20:28:07 +00009364 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009365 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009366 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009367 CmdArgs.push_back(
9368 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009369 else {
9370 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009371 CmdArgs.push_back(
9372 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009373 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009374 CmdArgs.push_back(
9375 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009376 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009377 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009378 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009379 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009380 CmdArgs.push_back(
9381 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009382 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009383 CmdArgs.push_back(
9384 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009385 }
9386
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009387 Args.AddAllArgs(CmdArgs,
9388 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009389
Daniel Dunbar54423b22010-09-17 00:24:54 +00009390 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009391
Douglas Katzman78b37b02015-11-17 20:28:07 +00009392 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009393 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009394
9395 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009396 CmdArgs.push_back("-rpath");
9397 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009398 }
9399
Hans Wennborg70850d82013-07-18 20:29:38 +00009400 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009401 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009402 CmdArgs.push_back("-lm");
9403 }
9404
Daniel Dunbarcc912342009-05-02 18:28:39 +00009405 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009406 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009407
9408 if (!Args.hasArg(options::OPT_nolibc)) {
9409 CmdArgs.push_back("-lc");
9410 }
9411
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009412 if (Args.hasArg(options::OPT_static) ||
9413 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009414 CmdArgs.push_back("-lgcc");
9415 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009416 } else {
9417 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009418 CmdArgs.push_back("-lgcc_pic");
9419 if (!Args.hasArg(options::OPT_shared))
9420 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009421 } else {
John McCall65b8da02013-04-11 22:55:55 +00009422 CmdArgs.push_back("-lgcc");
9423 CmdArgs.push_back("--as-needed");
9424 CmdArgs.push_back("-lgcc_pic");
9425 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009426 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009427 }
9428 }
9429
Douglas Katzman78b37b02015-11-17 20:28:07 +00009430 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009431 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009432 CmdArgs.push_back(
9433 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009434 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009435 CmdArgs.push_back(
9436 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9437 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009438 }
9439
Xinliang David Li69306c02015-10-22 06:15:31 +00009440 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009441
Logan Chieneb9162f2014-06-26 14:23:45 +00009442 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009444}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009445
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009446// Try to find Exe from a Visual Studio distribution. This first tries to find
9447// an installed copy of Visual Studio and, failing that, looks in the PATH,
9448// making sure that whatever executable that's found is not a same-named exe
9449// from clang itself to prevent clang from falling back to itself.
9450static std::string FindVisualStudioExecutable(const ToolChain &TC,
9451 const char *Exe,
9452 const char *ClangProgramPath) {
9453 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9454 std::string visualStudioBinDir;
9455 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9456 visualStudioBinDir)) {
9457 SmallString<128> FilePath(visualStudioBinDir);
9458 llvm::sys::path::append(FilePath, Exe);
9459 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9460 return FilePath.str();
9461 }
9462
9463 return Exe;
9464}
9465
Douglas Katzman95354292015-06-23 20:42:09 +00009466void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9467 const InputInfo &Output,
9468 const InputInfoList &Inputs,
9469 const ArgList &Args,
9470 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009471 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009472 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009473
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009474 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9475 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009476 CmdArgs.push_back(
9477 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009478
Douglas Katzman78b37b02015-11-17 20:28:07 +00009479 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9480 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009481 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009482
Zachary Turner10d75b22014-10-22 20:40:43 +00009483 if (!llvm::sys::Process::GetEnv("LIB")) {
9484 // If the VC environment hasn't been configured (perhaps because the user
9485 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009486 // the environment variable is set however, assume the user knows what
9487 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009488 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009489 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009490 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9491 SmallString<128> LibDir(VisualStudioDir);
9492 llvm::sys::path::append(LibDir, "VC", "lib");
9493 switch (MSVC.getArch()) {
9494 case llvm::Triple::x86:
9495 // x86 just puts the libraries directly in lib
9496 break;
9497 case llvm::Triple::x86_64:
9498 llvm::sys::path::append(LibDir, "amd64");
9499 break;
9500 case llvm::Triple::arm:
9501 llvm::sys::path::append(LibDir, "arm");
9502 break;
9503 default:
9504 break;
9505 }
9506 CmdArgs.push_back(
9507 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009508
9509 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9510 std::string UniversalCRTLibPath;
9511 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9512 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9513 UniversalCRTLibPath.c_str()));
9514 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009515 }
9516
9517 std::string WindowsSdkLibPath;
9518 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9519 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9520 WindowsSdkLibPath.c_str()));
9521 }
9522
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009523 CmdArgs.push_back("-nologo");
9524
Reid Kleckner124955a2015-08-05 18:51:13 +00009525 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009526 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009528 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009529 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009530 if (DLL) {
9531 CmdArgs.push_back(Args.MakeArgString("-dll"));
9532
9533 SmallString<128> ImplibName(Output.getFilename());
9534 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009535 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009536 }
9537
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009538 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009539 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009540 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009541 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009542 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9543 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009544 // Make sure the dynamic runtime thunk is not optimized out at link time
9545 // to ensure proper SEH handling.
9546 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009547 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009548 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009549 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009550 for (const auto &Lib : {"asan", "asan_cxx"})
9551 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009552 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009553 }
9554
Hans Wennborg2e274592013-08-13 23:38:57 +00009555 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009556
Alexey Bataevc7e84352015-08-19 04:49:01 +00009557 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9558 options::OPT_fno_openmp, false)) {
9559 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9560 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9561 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9562 TC.getDriver().Dir + "/../lib"));
9563 switch (getOpenMPRuntime(getToolChain(), Args)) {
9564 case OMPRT_OMP:
9565 CmdArgs.push_back("-defaultlib:libomp.lib");
9566 break;
9567 case OMPRT_IOMP5:
9568 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9569 break;
9570 case OMPRT_GOMP:
9571 break;
9572 case OMPRT_Unknown:
9573 // Already diagnosed.
9574 break;
9575 }
9576 }
9577
Reid Kleckner337188f2014-09-16 19:22:00 +00009578 // Add filenames, libraries, and other linker inputs.
9579 for (const auto &Input : Inputs) {
9580 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009581 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009582 continue;
9583 }
9584
9585 const Arg &A = Input.getInputArg();
9586
9587 // Render -l options differently for the MSVC linker.
9588 if (A.getOption().matches(options::OPT_l)) {
9589 StringRef Lib = A.getValue();
9590 const char *LinkLibArg;
9591 if (Lib.endswith(".lib"))
9592 LinkLibArg = Args.MakeArgString(Lib);
9593 else
9594 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9595 CmdArgs.push_back(LinkLibArg);
9596 continue;
9597 }
9598
9599 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9600 // or -L. Render it, even if MSVC doesn't understand it.
9601 A.renderAsInput(Args, CmdArgs);
9602 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009603
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009604 TC.addProfileRTLibs(Args, CmdArgs);
9605
Zachary Turner719f58c2014-12-01 23:06:47 +00009606 // We need to special case some linker paths. In the case of lld, we need to
9607 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9608 // linker, we need to use a special search algorithm.
9609 llvm::SmallString<128> linkPath;
9610 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9611 if (Linker.equals_lower("lld"))
9612 Linker = "lld-link";
9613
9614 if (Linker.equals_lower("link")) {
9615 // If we're using the MSVC linker, it's not sufficient to just use link
9616 // from the program PATH, because other environments like GnuWin32 install
9617 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009618 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009619 C.getDriver().getClangProgramPath());
9620 } else {
9621 linkPath = Linker;
9622 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009623 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009624 }
9625
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009626 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009627 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009628}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009629
Douglas Katzman95354292015-06-23 20:42:09 +00009630void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9631 const InputInfo &Output,
9632 const InputInfoList &Inputs,
9633 const ArgList &Args,
9634 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009635 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9636}
9637
Douglas Katzman95354292015-06-23 20:42:09 +00009638std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009639 Compilation &C, const JobAction &JA, const InputInfo &Output,
9640 const InputInfoList &Inputs, const ArgList &Args,
9641 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009642 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009643 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009644 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009645 CmdArgs.push_back("/W0"); // No warnings.
9646
9647 // The goal is to be able to invoke this tool correctly based on
9648 // any flag accepted by clang-cl.
9649
9650 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009651 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009652
9653 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009654 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9655 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9656 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009657 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9658 if (A->getOption().getID() == options::OPT_O0) {
9659 CmdArgs.push_back("/Od");
9660 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009661 CmdArgs.push_back("/Og");
9662
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009663 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009664 if (OptLevel == "s" || OptLevel == "z")
9665 CmdArgs.push_back("/Os");
9666 else
9667 CmdArgs.push_back("/Ot");
9668
9669 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009670 }
9671 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009672 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9673 options::OPT_fno_omit_frame_pointer))
9674 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9675 ? "/Oy"
9676 : "/Oy-");
9677 if (!Args.hasArg(options::OPT_fwritable_strings))
9678 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009679
Nico Weber3f8dafb2015-03-12 19:37:10 +00009680 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009681 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9682
David Majnemerf6072342014-07-01 22:24:56 +00009683 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9684 /*default=*/false))
9685 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009686 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9687 options::OPT_fno_function_sections))
9688 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9689 ? "/Gy"
9690 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009691 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9692 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009693 CmdArgs.push_back(
9694 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009695 if (Args.hasArg(options::OPT_fsyntax_only))
9696 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009697 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9698 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009699 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009700
Nico Weber3f8dafb2015-03-12 19:37:10 +00009701 std::vector<std::string> Includes =
9702 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009703 for (const auto &Include : Includes)
9704 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009705
Hans Wennborg87cfa712013-09-19 20:32:16 +00009706 // Flags that can simply be passed through.
9707 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9708 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009709 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009710 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009711
9712 // The order of these flags is relevant, so pick the last one.
9713 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9714 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9715 A->render(Args, CmdArgs);
9716
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009717 // Pass through all unknown arguments so that the fallback command can see
9718 // them too.
9719 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9720
Hans Wennborg87cfa712013-09-19 20:32:16 +00009721 // Input filename.
9722 assert(Inputs.size() == 1);
9723 const InputInfo &II = Inputs[0];
9724 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9725 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9726 if (II.isFilename())
9727 CmdArgs.push_back(II.getFilename());
9728 else
9729 II.getInputArg().renderAsInput(Args, CmdArgs);
9730
9731 // Output filename.
9732 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009733 const char *Fo =
9734 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009735 CmdArgs.push_back(Fo);
9736
Hans Wennborg188382e2013-09-20 18:16:35 +00009737 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009738 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9739 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009740 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009741 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009742}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009743
Yaron Keren1c0070c2015-07-02 04:45:27 +00009744/// MinGW Tools
9745void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9746 const InputInfo &Output,
9747 const InputInfoList &Inputs,
9748 const ArgList &Args,
9749 const char *LinkingOutput) const {
9750 claimNoWarnArgs(Args);
9751 ArgStringList CmdArgs;
9752
9753 if (getToolChain().getArch() == llvm::Triple::x86) {
9754 CmdArgs.push_back("--32");
9755 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9756 CmdArgs.push_back("--64");
9757 }
9758
9759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9760
9761 CmdArgs.push_back("-o");
9762 CmdArgs.push_back(Output.getFilename());
9763
9764 for (const auto &II : Inputs)
9765 CmdArgs.push_back(II.getFilename());
9766
9767 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009768 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009769
9770 if (Args.hasArg(options::OPT_gsplit_dwarf))
9771 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9772 SplitDebugName(Args, Inputs[0]));
9773}
9774
9775void MinGW::Linker::AddLibGCC(const ArgList &Args,
9776 ArgStringList &CmdArgs) const {
9777 if (Args.hasArg(options::OPT_mthreads))
9778 CmdArgs.push_back("-lmingwthrd");
9779 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009780
Yaron Kerenaa281332015-08-09 00:24:07 +00009781 // Make use of compiler-rt if --rtlib option is used
9782 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9783 if (RLT == ToolChain::RLT_Libgcc) {
9784 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9785 Args.hasArg(options::OPT_static);
9786 bool Shared = Args.hasArg(options::OPT_shared);
9787 bool CXX = getToolChain().getDriver().CCCIsCXX();
9788
9789 if (Static || (!CXX && !Shared)) {
9790 CmdArgs.push_back("-lgcc");
9791 CmdArgs.push_back("-lgcc_eh");
9792 } else {
9793 CmdArgs.push_back("-lgcc_s");
9794 CmdArgs.push_back("-lgcc");
9795 }
9796 } else {
9797 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9798 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009799
Yaron Keren1c0070c2015-07-02 04:45:27 +00009800 CmdArgs.push_back("-lmoldname");
9801 CmdArgs.push_back("-lmingwex");
9802 CmdArgs.push_back("-lmsvcrt");
9803}
9804
9805void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9806 const InputInfo &Output,
9807 const InputInfoList &Inputs,
9808 const ArgList &Args,
9809 const char *LinkingOutput) const {
9810 const ToolChain &TC = getToolChain();
9811 const Driver &D = TC.getDriver();
9812 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9813
9814 ArgStringList CmdArgs;
9815
9816 // Silence warning for "clang -g foo.o -o foo"
9817 Args.ClaimAllArgs(options::OPT_g_Group);
9818 // and "clang -emit-llvm foo.o -o foo"
9819 Args.ClaimAllArgs(options::OPT_emit_llvm);
9820 // and for "clang -w foo.o -o foo". Other warning options are already
9821 // handled somewhere else.
9822 Args.ClaimAllArgs(options::OPT_w);
9823
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009824 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9825 if (LinkerName.equals_lower("lld")) {
9826 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009827 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009828 } else if (!LinkerName.equals_lower("ld")) {
9829 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009830 }
9831
Yaron Keren1c0070c2015-07-02 04:45:27 +00009832 if (!D.SysRoot.empty())
9833 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9834
9835 if (Args.hasArg(options::OPT_s))
9836 CmdArgs.push_back("-s");
9837
9838 CmdArgs.push_back("-m");
9839 if (TC.getArch() == llvm::Triple::x86)
9840 CmdArgs.push_back("i386pe");
9841 if (TC.getArch() == llvm::Triple::x86_64)
9842 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009843 if (TC.getArch() == llvm::Triple::arm)
9844 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009845
9846 if (Args.hasArg(options::OPT_mwindows)) {
9847 CmdArgs.push_back("--subsystem");
9848 CmdArgs.push_back("windows");
9849 } else if (Args.hasArg(options::OPT_mconsole)) {
9850 CmdArgs.push_back("--subsystem");
9851 CmdArgs.push_back("console");
9852 }
9853
9854 if (Args.hasArg(options::OPT_static))
9855 CmdArgs.push_back("-Bstatic");
9856 else {
9857 if (Args.hasArg(options::OPT_mdll))
9858 CmdArgs.push_back("--dll");
9859 else if (Args.hasArg(options::OPT_shared))
9860 CmdArgs.push_back("--shared");
9861 CmdArgs.push_back("-Bdynamic");
9862 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9863 CmdArgs.push_back("-e");
9864 if (TC.getArch() == llvm::Triple::x86)
9865 CmdArgs.push_back("_DllMainCRTStartup@12");
9866 else
9867 CmdArgs.push_back("DllMainCRTStartup");
9868 CmdArgs.push_back("--enable-auto-image-base");
9869 }
9870 }
9871
9872 CmdArgs.push_back("-o");
9873 CmdArgs.push_back(Output.getFilename());
9874
9875 Args.AddAllArgs(CmdArgs, options::OPT_e);
9876 // FIXME: add -N, -n flags
9877 Args.AddLastArg(CmdArgs, options::OPT_r);
9878 Args.AddLastArg(CmdArgs, options::OPT_s);
9879 Args.AddLastArg(CmdArgs, options::OPT_t);
9880 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9881 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9882
Douglas Katzman78b37b02015-11-17 20:28:07 +00009883 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009884 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9885 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9886 } else {
9887 if (Args.hasArg(options::OPT_municode))
9888 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9889 else
9890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9891 }
9892 if (Args.hasArg(options::OPT_pg))
9893 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9894 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9895 }
9896
9897 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009898 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009899 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9900
9901 // TODO: Add ASan stuff here
9902
9903 // TODO: Add profile stuff here
9904
Douglas Katzman78b37b02015-11-17 20:28:07 +00009905 if (D.CCCIsCXX() &&
9906 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009907 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9908 !Args.hasArg(options::OPT_static);
9909 if (OnlyLibstdcxxStatic)
9910 CmdArgs.push_back("-Bstatic");
9911 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9912 if (OnlyLibstdcxxStatic)
9913 CmdArgs.push_back("-Bdynamic");
9914 }
9915
9916 if (!Args.hasArg(options::OPT_nostdlib)) {
9917 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9918 if (Args.hasArg(options::OPT_static))
9919 CmdArgs.push_back("--start-group");
9920
9921 if (Args.hasArg(options::OPT_fstack_protector) ||
9922 Args.hasArg(options::OPT_fstack_protector_strong) ||
9923 Args.hasArg(options::OPT_fstack_protector_all)) {
9924 CmdArgs.push_back("-lssp_nonshared");
9925 CmdArgs.push_back("-lssp");
9926 }
9927 if (Args.hasArg(options::OPT_fopenmp))
9928 CmdArgs.push_back("-lgomp");
9929
9930 AddLibGCC(Args, CmdArgs);
9931
9932 if (Args.hasArg(options::OPT_pg))
9933 CmdArgs.push_back("-lgmon");
9934
Yaron Kerenadce68e2015-07-06 18:52:19 +00009935 if (Args.hasArg(options::OPT_pthread))
9936 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009937
9938 // add system libraries
9939 if (Args.hasArg(options::OPT_mwindows)) {
9940 CmdArgs.push_back("-lgdi32");
9941 CmdArgs.push_back("-lcomdlg32");
9942 }
9943 CmdArgs.push_back("-ladvapi32");
9944 CmdArgs.push_back("-lshell32");
9945 CmdArgs.push_back("-luser32");
9946 CmdArgs.push_back("-lkernel32");
9947
9948 if (Args.hasArg(options::OPT_static))
9949 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009950 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009951 AddLibGCC(Args, CmdArgs);
9952 }
9953
9954 if (!Args.hasArg(options::OPT_nostartfiles)) {
9955 // Add crtfastmath.o if available and fast math is enabled.
9956 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9957
9958 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9959 }
9960 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009961 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009962 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009963}
9964
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009965/// XCore Tools
9966// We pass assemble and link construction to the xcc tool.
9967
Douglas Katzman95354292015-06-23 20:42:09 +00009968void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9969 const InputInfo &Output,
9970 const InputInfoList &Inputs,
9971 const ArgList &Args,
9972 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009973 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009974 ArgStringList CmdArgs;
9975
9976 CmdArgs.push_back("-o");
9977 CmdArgs.push_back(Output.getFilename());
9978
9979 CmdArgs.push_back("-c");
9980
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009981 if (Args.hasArg(options::OPT_v))
9982 CmdArgs.push_back("-v");
9983
Robert Lytton894d25c2014-05-02 09:33:25 +00009984 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9985 if (!A->getOption().matches(options::OPT_g0))
9986 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009987
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009988 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9989 false))
9990 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009993
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009994 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009995 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009996
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009997 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009998 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009999}
10000
Douglas Katzman95354292015-06-23 20:42:09 +000010001void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10002 const InputInfo &Output,
10003 const InputInfoList &Inputs,
10004 const ArgList &Args,
10005 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010006 ArgStringList CmdArgs;
10007
10008 if (Output.isFilename()) {
10009 CmdArgs.push_back("-o");
10010 CmdArgs.push_back(Output.getFilename());
10011 } else {
10012 assert(Output.isNothing() && "Invalid output.");
10013 }
10014
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010015 if (Args.hasArg(options::OPT_v))
10016 CmdArgs.push_back("-v");
10017
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010018 // Pass -fexceptions through to the linker if it was present.
10019 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10020 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010021 CmdArgs.push_back("-fexceptions");
10022
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10024
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010025 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010026 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010027}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010028
Douglas Katzman95354292015-06-23 20:42:09 +000010029void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10030 const InputInfo &Output,
10031 const InputInfoList &Inputs,
10032 const ArgList &Args,
10033 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010034 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010035 const auto &TC =
10036 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10037 ArgStringList CmdArgs;
10038 const char *Exec;
10039
10040 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010041 default:
10042 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010043 case llvm::Triple::arm:
10044 case llvm::Triple::thumb:
10045 break;
10046 case llvm::Triple::x86:
10047 CmdArgs.push_back("--32");
10048 break;
10049 case llvm::Triple::x86_64:
10050 CmdArgs.push_back("--64");
10051 break;
10052 }
10053
10054 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10055
10056 CmdArgs.push_back("-o");
10057 CmdArgs.push_back(Output.getFilename());
10058
10059 for (const auto &Input : Inputs)
10060 CmdArgs.push_back(Input.getFilename());
10061
10062 const std::string Assembler = TC.GetProgramPath("as");
10063 Exec = Args.MakeArgString(Assembler);
10064
Justin Bognerd3371d82015-07-17 03:35:54 +000010065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010066}
10067
Douglas Katzman95354292015-06-23 20:42:09 +000010068void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10069 const InputInfo &Output,
10070 const InputInfoList &Inputs,
10071 const ArgList &Args,
10072 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010073 const auto &TC =
10074 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10075 const llvm::Triple &T = TC.getTriple();
10076 const Driver &D = TC.getDriver();
10077 SmallString<128> EntryPoint;
10078 ArgStringList CmdArgs;
10079 const char *Exec;
10080
10081 // Silence warning for "clang -g foo.o -o foo"
10082 Args.ClaimAllArgs(options::OPT_g_Group);
10083 // and "clang -emit-llvm foo.o -o foo"
10084 Args.ClaimAllArgs(options::OPT_emit_llvm);
10085 // and for "clang -w foo.o -o foo"
10086 Args.ClaimAllArgs(options::OPT_w);
10087 // Other warning options are already handled somewhere else.
10088
10089 if (!D.SysRoot.empty())
10090 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10091
10092 if (Args.hasArg(options::OPT_pie))
10093 CmdArgs.push_back("-pie");
10094 if (Args.hasArg(options::OPT_rdynamic))
10095 CmdArgs.push_back("-export-dynamic");
10096 if (Args.hasArg(options::OPT_s))
10097 CmdArgs.push_back("--strip-all");
10098
10099 CmdArgs.push_back("-m");
10100 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010101 default:
10102 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010103 case llvm::Triple::arm:
10104 case llvm::Triple::thumb:
10105 // FIXME: this is incorrect for WinCE
10106 CmdArgs.push_back("thumb2pe");
10107 break;
10108 case llvm::Triple::x86:
10109 CmdArgs.push_back("i386pe");
10110 EntryPoint.append("_");
10111 break;
10112 case llvm::Triple::x86_64:
10113 CmdArgs.push_back("i386pep");
10114 break;
10115 }
10116
10117 if (Args.hasArg(options::OPT_shared)) {
10118 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010119 default:
10120 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010121 case llvm::Triple::arm:
10122 case llvm::Triple::thumb:
10123 case llvm::Triple::x86_64:
10124 EntryPoint.append("_DllMainCRTStartup");
10125 break;
10126 case llvm::Triple::x86:
10127 EntryPoint.append("_DllMainCRTStartup@12");
10128 break;
10129 }
10130
10131 CmdArgs.push_back("-shared");
10132 CmdArgs.push_back("-Bdynamic");
10133
10134 CmdArgs.push_back("--enable-auto-image-base");
10135
10136 CmdArgs.push_back("--entry");
10137 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10138 } else {
10139 EntryPoint.append("mainCRTStartup");
10140
10141 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10142 : "-Bdynamic");
10143
Douglas Katzman78b37b02015-11-17 20:28:07 +000010144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010145 CmdArgs.push_back("--entry");
10146 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10147 }
10148
10149 // FIXME: handle subsystem
10150 }
10151
10152 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010153 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010154
10155 CmdArgs.push_back("-o");
10156 CmdArgs.push_back(Output.getFilename());
10157
10158 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10159 SmallString<261> ImpLib(Output.getFilename());
10160 llvm::sys::path::replace_extension(ImpLib, ".lib");
10161
10162 CmdArgs.push_back("--out-implib");
10163 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10164 }
10165
Douglas Katzman78b37b02015-11-17 20:28:07 +000010166 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010167 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10168 const char *CRTBegin;
10169
10170 CRTBegin =
10171 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10172 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10173 }
10174
10175 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010176 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010177 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10178
10179 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10180 !Args.hasArg(options::OPT_nodefaultlibs)) {
10181 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10182 !Args.hasArg(options::OPT_static);
10183 if (StaticCXX)
10184 CmdArgs.push_back("-Bstatic");
10185 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10186 if (StaticCXX)
10187 CmdArgs.push_back("-Bdynamic");
10188 }
10189
10190 if (!Args.hasArg(options::OPT_nostdlib)) {
10191 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10192 // TODO handle /MT[d] /MD[d]
10193 CmdArgs.push_back("-lmsvcrt");
10194 AddRunTimeLibs(TC, D, CmdArgs, Args);
10195 }
10196 }
10197
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010198 if (TC.getSanitizerArgs().needsAsanRt()) {
10199 // TODO handle /MT[d] /MD[d]
10200 if (Args.hasArg(options::OPT_shared)) {
10201 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10202 } else {
10203 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10204 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10205 // Make sure the dynamic runtime thunk is not optimized out at link time
10206 // to ensure proper SEH handling.
10207 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10208 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10209 ? "___asan_seh_interceptor"
10210 : "__asan_seh_interceptor"));
10211 }
10212 }
10213
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010214 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010215
Justin Bognerd3371d82015-07-17 03:35:54 +000010216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010217}
Douglas Katzman84a75642015-06-19 14:55:19 +000010218
Douglas Katzman95354292015-06-23 20:42:09 +000010219void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10220 const InputInfo &Output,
10221 const InputInfoList &Inputs,
10222 const ArgList &Args,
10223 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010224 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010225 assert(Inputs.size() == 1);
10226 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010227 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10228 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010229
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010230 if (JA.getKind() == Action::PreprocessJobClass) {
10231 Args.ClaimAllArgs();
10232 CmdArgs.push_back("-E");
10233 } else {
10234 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10235 CmdArgs.push_back("-S");
10236 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10237 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010238 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010239 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010240
Douglas Katzmanf6071112015-08-03 14:34:22 +000010241 // Append all -I, -iquote, -isystem paths, defines/undefines,
10242 // 'f' flags, optimize flags, and warning options.
10243 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010244 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010245 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010246 options::OPT_f_Group, options::OPT_f_clang_Group,
10247 options::OPT_g_Group, options::OPT_M_Group,
10248 options::OPT_O_Group, options::OPT_W_Group});
10249
10250 // If we're producing a dependency file, and assembly is the final action,
10251 // then the name of the target in the dependency file should be the '.o'
10252 // file, not the '.s' file produced by this step. For example, instead of
10253 // /tmp/mumble.s: mumble.c .../someheader.h
10254 // the filename on the lefthand side should be "mumble.o"
10255 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10256 C.getActions().size() == 1 &&
10257 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10258 Arg *A = Args.getLastArg(options::OPT_o);
10259 if (A) {
10260 CmdArgs.push_back("-MT");
10261 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10262 }
10263 }
10264
Douglas Katzman84a75642015-06-19 14:55:19 +000010265 CmdArgs.push_back(II.getFilename());
10266 CmdArgs.push_back("-o");
10267 CmdArgs.push_back(Output.getFilename());
10268
10269 std::string Exec =
10270 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010271 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10272 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010273}
10274
Douglas Katzman95354292015-06-23 20:42:09 +000010275void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10276 const InputInfo &Output,
10277 const InputInfoList &Inputs,
10278 const ArgList &Args,
10279 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010280 ArgStringList CmdArgs;
10281
10282 assert(Inputs.size() == 1);
10283 const InputInfo &II = Inputs[0];
10284 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10285 assert(Output.getType() == types::TY_Object);
10286
10287 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010288 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010289 CmdArgs.push_back("-noSPrefixing");
10290 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010291 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10292 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10293 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010294 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010295 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010296 }
10297 CmdArgs.push_back("-elf"); // Output format.
10298 CmdArgs.push_back(II.getFilename());
10299 CmdArgs.push_back(
10300 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10301
10302 std::string Exec =
10303 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010304 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10305 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010306}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010307
10308void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10309 const InputInfo &Output,
10310 const InputInfoList &Inputs,
10311 const ArgList &Args,
10312 const char *LinkingOutput) const {
10313 const auto &TC =
10314 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10315 const llvm::Triple &T = TC.getTriple();
10316 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010317 bool UseStartfiles =
10318 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010319 bool UseDefaultLibs =
10320 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010321
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010322 if (T.getArch() == llvm::Triple::sparc)
10323 CmdArgs.push_back("-EB");
10324 else // SHAVE assumes little-endian, and sparcel is expressly so.
10325 CmdArgs.push_back("-EL");
10326
10327 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10328 // but we never pass through a --sysroot option and various other bits.
10329 // For example, there are no sanitizers (yet) nor gold linker.
10330
10331 // Eat some arguments that may be present but have no effect.
10332 Args.ClaimAllArgs(options::OPT_g_Group);
10333 Args.ClaimAllArgs(options::OPT_w);
10334 Args.ClaimAllArgs(options::OPT_static_libgcc);
10335
10336 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10337 CmdArgs.push_back("-s");
10338
10339 CmdArgs.push_back("-o");
10340 CmdArgs.push_back(Output.getFilename());
10341
10342 if (UseStartfiles) {
10343 // If you want startfiles, it means you want the builtin crti and crtbegin,
10344 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010345 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10346 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010347 }
10348
10349 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10350 options::OPT_e, options::OPT_s, options::OPT_t,
10351 options::OPT_Z_Flag, options::OPT_r});
10352
Douglas Katzman674a3122015-11-18 16:24:46 +000010353 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010354
10355 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10356
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010357 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010358 if (C.getDriver().CCCIsCXX())
10359 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010360 if (T.getOS() == llvm::Triple::RTEMS) {
10361 CmdArgs.push_back("--start-group");
10362 CmdArgs.push_back("-lc");
10363 // You must provide your own "-L" option to enable finding these.
10364 CmdArgs.push_back("-lrtemscpu");
10365 CmdArgs.push_back("-lrtemsbsp");
10366 CmdArgs.push_back("--end-group");
10367 } else {
10368 CmdArgs.push_back("-lc");
10369 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010370 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010371 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010372 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010373 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10374 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010375 }
10376
10377 std::string Exec =
10378 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10379 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10380 CmdArgs, Inputs));
10381}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010382
10383void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10384 const InputInfo &Output,
10385 const InputInfoList &Inputs,
10386 const ArgList &Args,
10387 const char *LinkingOutput) const {
10388 claimNoWarnArgs(Args);
10389 ArgStringList CmdArgs;
10390
10391 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10392
10393 CmdArgs.push_back("-o");
10394 CmdArgs.push_back(Output.getFilename());
10395
10396 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10397 const InputInfo &Input = Inputs[0];
10398 assert(Input.isFilename() && "Invalid input.");
10399 CmdArgs.push_back(Input.getFilename());
10400
10401 const char *Exec =
10402 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10403 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10404}
10405
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010406static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10407 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10408 if (SanArgs.needsUbsanRt()) {
10409 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10410 }
10411 if (SanArgs.needsAsanRt()) {
10412 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10413 }
10414}
10415
10416static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10417 const JobAction &JA, const InputInfo &Output,
10418 const InputInfoList &Inputs,
10419 const ArgList &Args,
10420 const char *LinkingOutput) {
10421 const toolchains::FreeBSD &ToolChain =
10422 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10423 const Driver &D = ToolChain.getDriver();
10424 ArgStringList CmdArgs;
10425
10426 // Silence warning for "clang -g foo.o -o foo"
10427 Args.ClaimAllArgs(options::OPT_g_Group);
10428 // and "clang -emit-llvm foo.o -o foo"
10429 Args.ClaimAllArgs(options::OPT_emit_llvm);
10430 // and for "clang -w foo.o -o foo". Other warning options are already
10431 // handled somewhere else.
10432 Args.ClaimAllArgs(options::OPT_w);
10433
10434 if (!D.SysRoot.empty())
10435 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10436
10437 if (Args.hasArg(options::OPT_pie))
10438 CmdArgs.push_back("-pie");
10439
10440 if (Args.hasArg(options::OPT_rdynamic))
10441 CmdArgs.push_back("-export-dynamic");
10442 if (Args.hasArg(options::OPT_shared))
10443 CmdArgs.push_back("--oformat=so");
10444
10445 if (Output.isFilename()) {
10446 CmdArgs.push_back("-o");
10447 CmdArgs.push_back(Output.getFilename());
10448 } else {
10449 assert(Output.isNothing() && "Invalid output.");
10450 }
10451
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010452 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10453
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010454 Args.AddAllArgs(CmdArgs, options::OPT_L);
10455 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10456 Args.AddAllArgs(CmdArgs, options::OPT_e);
10457 Args.AddAllArgs(CmdArgs, options::OPT_s);
10458 Args.AddAllArgs(CmdArgs, options::OPT_t);
10459 Args.AddAllArgs(CmdArgs, options::OPT_r);
10460
10461 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10462 CmdArgs.push_back("--no-demangle");
10463
10464 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10465
10466 if (Args.hasArg(options::OPT_pthread)) {
10467 CmdArgs.push_back("-lpthread");
10468 }
10469
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010470 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10471
10472 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10473}
10474
10475static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10476 const JobAction &JA, const InputInfo &Output,
10477 const InputInfoList &Inputs,
10478 const ArgList &Args,
10479 const char *LinkingOutput) {
10480 const toolchains::FreeBSD &ToolChain =
10481 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10482 const Driver &D = ToolChain.getDriver();
10483 ArgStringList CmdArgs;
10484
10485 // Silence warning for "clang -g foo.o -o foo"
10486 Args.ClaimAllArgs(options::OPT_g_Group);
10487 // and "clang -emit-llvm foo.o -o foo"
10488 Args.ClaimAllArgs(options::OPT_emit_llvm);
10489 // and for "clang -w foo.o -o foo". Other warning options are already
10490 // handled somewhere else.
10491 Args.ClaimAllArgs(options::OPT_w);
10492
10493 if (!D.SysRoot.empty())
10494 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10495
10496 if (Args.hasArg(options::OPT_pie))
10497 CmdArgs.push_back("-pie");
10498
10499 if (Args.hasArg(options::OPT_static)) {
10500 CmdArgs.push_back("-Bstatic");
10501 } else {
10502 if (Args.hasArg(options::OPT_rdynamic))
10503 CmdArgs.push_back("-export-dynamic");
10504 CmdArgs.push_back("--eh-frame-hdr");
10505 if (Args.hasArg(options::OPT_shared)) {
10506 CmdArgs.push_back("-Bshareable");
10507 } else {
10508 CmdArgs.push_back("-dynamic-linker");
10509 CmdArgs.push_back("/libexec/ld-elf.so.1");
10510 }
10511 CmdArgs.push_back("--enable-new-dtags");
10512 }
10513
10514 if (Output.isFilename()) {
10515 CmdArgs.push_back("-o");
10516 CmdArgs.push_back(Output.getFilename());
10517 } else {
10518 assert(Output.isNothing() && "Invalid output.");
10519 }
10520
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010521 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10522
Douglas Katzman78b37b02015-11-17 20:28:07 +000010523 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010524 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010525 if (!Args.hasArg(options::OPT_shared)) {
10526 if (Args.hasArg(options::OPT_pg))
10527 crt1 = "gcrt1.o";
10528 else if (Args.hasArg(options::OPT_pie))
10529 crt1 = "Scrt1.o";
10530 else
10531 crt1 = "crt1.o";
10532 }
10533 if (crt1)
10534 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10535
10536 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10537
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010538 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010539 if (Args.hasArg(options::OPT_static))
10540 crtbegin = "crtbeginT.o";
10541 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10542 crtbegin = "crtbeginS.o";
10543 else
10544 crtbegin = "crtbegin.o";
10545
10546 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10547 }
10548
10549 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010550 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010551 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10552 Args.AddAllArgs(CmdArgs, options::OPT_e);
10553 Args.AddAllArgs(CmdArgs, options::OPT_s);
10554 Args.AddAllArgs(CmdArgs, options::OPT_t);
10555 Args.AddAllArgs(CmdArgs, options::OPT_r);
10556
10557 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10558 CmdArgs.push_back("--no-demangle");
10559
10560 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10561
Douglas Katzman78b37b02015-11-17 20:28:07 +000010562 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010563 // For PS4, we always want to pass libm, libstdc++ and libkernel
10564 // libraries for both C and C++ compilations.
10565 CmdArgs.push_back("-lkernel");
10566 if (D.CCCIsCXX()) {
10567 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10568 if (Args.hasArg(options::OPT_pg))
10569 CmdArgs.push_back("-lm_p");
10570 else
10571 CmdArgs.push_back("-lm");
10572 }
10573 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10574 // the default system libraries. Just mimic this for now.
10575 if (Args.hasArg(options::OPT_pg))
10576 CmdArgs.push_back("-lgcc_p");
10577 else
10578 CmdArgs.push_back("-lcompiler_rt");
10579 if (Args.hasArg(options::OPT_static)) {
10580 CmdArgs.push_back("-lstdc++");
10581 } else if (Args.hasArg(options::OPT_pg)) {
10582 CmdArgs.push_back("-lgcc_eh_p");
10583 } else {
10584 CmdArgs.push_back("--as-needed");
10585 CmdArgs.push_back("-lstdc++");
10586 CmdArgs.push_back("--no-as-needed");
10587 }
10588
10589 if (Args.hasArg(options::OPT_pthread)) {
10590 if (Args.hasArg(options::OPT_pg))
10591 CmdArgs.push_back("-lpthread_p");
10592 else
10593 CmdArgs.push_back("-lpthread");
10594 }
10595
10596 if (Args.hasArg(options::OPT_pg)) {
10597 if (Args.hasArg(options::OPT_shared))
10598 CmdArgs.push_back("-lc");
10599 else {
10600 if (Args.hasArg(options::OPT_static)) {
10601 CmdArgs.push_back("--start-group");
10602 CmdArgs.push_back("-lc_p");
10603 CmdArgs.push_back("-lpthread_p");
10604 CmdArgs.push_back("--end-group");
10605 } else {
10606 CmdArgs.push_back("-lc_p");
10607 }
10608 }
10609 CmdArgs.push_back("-lgcc_p");
10610 } else {
10611 if (Args.hasArg(options::OPT_static)) {
10612 CmdArgs.push_back("--start-group");
10613 CmdArgs.push_back("-lc");
10614 CmdArgs.push_back("-lpthread");
10615 CmdArgs.push_back("--end-group");
10616 } else {
10617 CmdArgs.push_back("-lc");
10618 }
10619 CmdArgs.push_back("-lcompiler_rt");
10620 }
10621
10622 if (Args.hasArg(options::OPT_static)) {
10623 CmdArgs.push_back("-lstdc++");
10624 } else if (Args.hasArg(options::OPT_pg)) {
10625 CmdArgs.push_back("-lgcc_eh_p");
10626 } else {
10627 CmdArgs.push_back("--as-needed");
10628 CmdArgs.push_back("-lstdc++");
10629 CmdArgs.push_back("--no-as-needed");
10630 }
10631 }
10632
Douglas Katzman78b37b02015-11-17 20:28:07 +000010633 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010634 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10635 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10636 else
10637 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10638 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10639 }
10640
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010641 const char *Exec =
10642#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010643 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010644#else
10645 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10646#endif
10647
10648 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10649}
10650
10651void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10652 const InputInfo &Output,
10653 const InputInfoList &Inputs,
10654 const ArgList &Args,
10655 const char *LinkingOutput) const {
10656 const toolchains::FreeBSD &ToolChain =
10657 static_cast<const toolchains::FreeBSD &>(getToolChain());
10658 const Driver &D = ToolChain.getDriver();
10659 bool PS4Linker;
10660 StringRef LinkerOptName;
10661 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10662 LinkerOptName = A->getValue();
10663 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10664 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10665 }
10666
10667 if (LinkerOptName == "gold")
10668 PS4Linker = false;
10669 else if (LinkerOptName == "ps4")
10670 PS4Linker = true;
10671 else
10672 PS4Linker = !Args.hasArg(options::OPT_shared);
10673
10674 if (PS4Linker)
10675 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10676 else
10677 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10678}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010679
10680void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10681 const InputInfo &Output,
10682 const InputInfoList &Inputs,
10683 const ArgList &Args,
10684 const char *LinkingOutput) const {
10685 const auto &TC =
10686 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010687 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010688
10689 std::vector<std::string> gpu_archs =
10690 Args.getAllArgValues(options::OPT_march_EQ);
10691 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10692 const std::string& gpu_arch = gpu_archs[0];
10693
10694
10695 ArgStringList CmdArgs;
10696 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10697
Justin Lebar2836dcd2016-01-19 19:52:21 +000010698 // Map the -O we received to -O{0,1,2,3}.
10699 //
10700 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,
10701 // so it may correspond more closely to the spirit of clang -O2.
10702 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10703 // -O3 seems like the least-bad option when -Osomething is specified to
10704 // clang but it isn't handled below.
10705 StringRef OOpt = "3";
10706 if (A->getOption().matches(options::OPT_O4) ||
10707 A->getOption().matches(options::OPT_Ofast))
10708 OOpt = "3";
10709 else if (A->getOption().matches(options::OPT_O0))
10710 OOpt = "0";
10711 else if (A->getOption().matches(options::OPT_O)) {
10712 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10713 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10714 .Case("1", "1")
10715 .Case("2", "2")
10716 .Case("3", "3")
10717 .Case("s", "2")
10718 .Case("z", "2")
10719 .Default("2");
10720 }
10721 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10722 } else {
10723 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10724 // to no optimizations, but ptxas's default is -O3.
10725 CmdArgs.push_back("-O0");
10726 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010727
10728 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10729 // not supported at other optimization levels.
10730
10731 CmdArgs.push_back("--gpu-name");
10732 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10733 CmdArgs.push_back("--output-file");
10734 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10735 for (const auto& II : Inputs)
10736 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10737
10738 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10739 CmdArgs.push_back(Args.MakeArgString(A));
10740
10741 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10742 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10743}
10744
10745// All inputs to this linker must be from CudaDeviceActions, as we need to look
10746// at the Inputs' Actions in order to figure out which GPU architecture they
10747// correspond to.
10748void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10749 const InputInfo &Output,
10750 const InputInfoList &Inputs,
10751 const ArgList &Args,
10752 const char *LinkingOutput) const {
10753 const auto &TC =
10754 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010755 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010756
10757 ArgStringList CmdArgs;
10758 CmdArgs.push_back("--cuda");
10759 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10760 CmdArgs.push_back(Args.MakeArgString("--create"));
10761 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10762
10763 for (const auto& II : Inputs) {
10764 auto* A = cast<const CudaDeviceAction>(II.getAction());
10765 // We need to pass an Arch of the form "sm_XX" for cubin files and
10766 // "compute_XX" for ptx.
10767 const char *Arch = (II.getType() == types::TY_PP_Asm)
10768 ? A->getComputeArchName()
10769 : A->getGpuArchName();
10770 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10771 Arch + ",file=" + II.getFilename()));
10772 }
10773
10774 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10775 CmdArgs.push_back(Args.MakeArgString(A));
10776
10777 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10779}