blob: 69a41d0ef33ee73ec31dd0fddf45c177bbb1b106 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 break;
702 }
Tim Northover756447a2015-10-30 16:30:36 +0000703 case llvm::Triple::WatchOS:
704 ABI = FloatABI::Hard;
705 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000707 // FIXME: this is invalid for WindowsCE
708 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000710 break;
711
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000712 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000713 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000714 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000716 break;
717 default:
718 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000719 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000720 break;
721 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000722 break;
723
Daniel Dunbar78485922009-09-10 23:00:09 +0000724 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000726 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 case llvm::Triple::EABIHF:
728 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000730 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::EABI:
732 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000733 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000734 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000735 case llvm::Triple::Android:
736 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000737 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000738 default:
739 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000740 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000741 if (Triple.getOS() != llvm::Triple::UnknownOS ||
742 !Triple.isOSBinFormatMachO())
743 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000744 break;
745 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 }
747 }
748
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000749 assert(ABI != FloatABI::Invalid && "must select an ABI");
750 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000751}
752
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000753static void getARMTargetFeatures(const ToolChain &TC,
754 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000755 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000756 std::vector<const char *> &Features,
757 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000758 const Driver &D = TC.getDriver();
759
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000760 bool KernelOrKext =
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000762 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000763 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
764 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
765
Nico Weber6e0ebae2015-04-29 21:16:40 +0000766 if (!ForAS) {
767 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
768 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
769 // stripped out by the ARM target. We should probably pass this a new
770 // -target-option, which is handled by the -cc1/-cc1as invocation.
771 //
772 // FIXME2: For consistency, it would be ideal if we set up the target
773 // machine state the same when using the frontend or the assembler. We don't
774 // currently do that for the assembler, we pass the options directly to the
775 // backend and never even instantiate the frontend TargetInfo. If we did,
776 // and used its handleTargetFeatures hook, then we could ensure the
777 // assembler and the frontend behave the same.
778
779 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000781 Features.push_back("+soft-float");
782
783 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000785 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000786 } else {
787 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
788 // to the assembler correctly.
789 for (const Arg *A :
790 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
791 StringRef Value = A->getValue();
792 if (Value.startswith("-mfpu=")) {
793 WaFPU = A;
794 } else if (Value.startswith("-mcpu=")) {
795 WaCPU = A;
796 } else if (Value.startswith("-mhwdiv=")) {
797 WaHDiv = A;
798 } else if (Value.startswith("-march=")) {
799 WaArch = A;
800 }
801 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000802 }
803
Renato Golin7c542b42015-07-27 23:44:45 +0000804 // Check -march. ClangAs gives preference to -Wa,-march=.
805 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000806 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000807 if (WaArch) {
808 if (ArchArg)
809 D.Diag(clang::diag::warn_drv_unused_argument)
810 << ArchArg->getAsString(Args);
811 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000812 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000813 // FIXME: Set Arch.
814 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
815 } else if (ArchArg) {
816 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000817 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000818 }
819
Renato Golin7c542b42015-07-27 23:44:45 +0000820 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
821 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000822 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000823 if (WaCPU) {
824 if (CPUArg)
825 D.Diag(clang::diag::warn_drv_unused_argument)
826 << CPUArg->getAsString(Args);
827 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000828 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 } else if (CPUArg) {
830 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000831 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000832 }
John Brawna95c1a82015-05-08 12:52:18 +0000833
Renato Golin23459c62015-07-30 16:40:17 +0000834 // Add CPU features for generic CPUs
835 if (CPUName == "native") {
836 llvm::StringMap<bool> HostFeatures;
837 if (llvm::sys::getHostCPUFeatures(HostFeatures))
838 for (auto &F : HostFeatures)
839 Features.push_back(
840 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
841 }
842
843 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
844 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
845 if (WaFPU) {
846 if (FPUArg)
847 D.Diag(clang::diag::warn_drv_unused_argument)
848 << FPUArg->getAsString(Args);
849 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
850 Features);
851 } else if (FPUArg) {
852 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
853 }
854
855 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
856 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
857 if (WaHDiv) {
858 if (HDivArg)
859 D.Diag(clang::diag::warn_drv_unused_argument)
860 << HDivArg->getAsString(Args);
861 getARMHWDivFeatures(D, WaHDiv, Args,
862 StringRef(WaHDiv->getValue()).substr(8), Features);
863 } else if (HDivArg)
864 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
865
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000866 // Setting -msoft-float effectively disables NEON because of the GCC
867 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000868 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000869 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000870 // Also need to explicitly disable features which imply NEON.
871 Features.push_back("-crypto");
872 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000873
Eric Christopher269c2a22015-04-04 03:34:43 +0000874 // En/disable crc code generation.
875 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000876 if (A->getOption().matches(options::OPT_mcrc))
877 Features.push_back("+crc");
878 else
879 Features.push_back("-crc");
880 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000881
882 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
883 Features.insert(Features.begin(), "+v8.1a");
884 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000885
Akira Hatanakac2694822015-07-07 08:28:42 +0000886 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
887 // neither options are specified, see if we are compiling for kernel/kext and
888 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000889 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
890 options::OPT_mno_long_calls)) {
891 if (A->getOption().matches(options::OPT_mlong_calls))
892 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000893 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
894 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000895 Features.push_back("+long-calls");
896 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000897
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000898 // Kernel code has more strict alignment requirements.
899 if (KernelOrKext)
900 Features.push_back("+strict-align");
901 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
902 options::OPT_munaligned_access)) {
903 if (A->getOption().matches(options::OPT_munaligned_access)) {
904 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
905 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
906 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
907 } else
908 Features.push_back("+strict-align");
909 } else {
910 // Assume pre-ARMv6 doesn't support unaligned accesses.
911 //
912 // ARMv6 may or may not support unaligned accesses depending on the
913 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
914 // Darwin and NetBSD targets support unaligned accesses, and others don't.
915 //
916 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
917 // which raises an alignment fault on unaligned accesses. Linux
918 // defaults this bit to 0 and handles it as a system-wide (not
919 // per-process) setting. It is therefore safe to assume that ARMv7+
920 // Linux targets support unaligned accesses. The same goes for NaCl.
921 //
922 // The above behavior is consistent with GCC.
923 int VersionNum = getARMSubArchVersionNumber(Triple);
924 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000925 if (VersionNum < 6 ||
926 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000927 Features.push_back("+strict-align");
928 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
929 if (VersionNum < 7)
930 Features.push_back("+strict-align");
931 } else
932 Features.push_back("+strict-align");
933 }
934
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000935 // llvm does not support reserving registers in general. There is support
936 // for reserving r9 on ARM though (defined as a platform-specific register
937 // in ARM EABI).
938 if (Args.hasArg(options::OPT_ffixed_r9))
939 Features.push_back("+reserve-r9");
940
Dimitry Andric08107392016-01-06 07:42:18 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000943 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000944}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000946void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
947 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000948 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000950 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000951 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000952 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000953 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000954 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000955 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000957 } else if (Triple.isWatchOS()) {
958 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000959 } else {
960 ABIName = "apcs-gnu";
961 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000962 } else if (Triple.isOSWindows()) {
963 // FIXME: this is invalid for WindowsCE
964 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 } else {
966 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000967 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000968 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000969 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000970 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 ABIName = "aapcs-linux";
972 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000973 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000974 case llvm::Triple::EABI:
975 ABIName = "aapcs";
976 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000977 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000978 if (Triple.getOS() == llvm::Triple::NetBSD)
979 ABIName = "apcs-gnu";
980 else
981 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000982 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000983 }
984 }
985 CmdArgs.push_back("-target-abi");
986 CmdArgs.push_back(ABIName);
987
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000988 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000989 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000990 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000991 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000992 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000993 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000994 CmdArgs.push_back("-mfloat-abi");
995 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000996 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001000 } else {
1001 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001002 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001003 CmdArgs.push_back("-mfloat-abi");
1004 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001005 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-arm-global-merge=false");
1013 else
1014 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001015 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001016
Bob Wilson9c8af452013-04-11 18:53:25 +00001017 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001019 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001020}
Renato Goline17c5802015-07-27 23:44:42 +00001021// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001022
Tim Northover573cbee2014-05-24 12:52:07 +00001023/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1024/// targeting.
1025static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001026 Arg *A;
1027 std::string CPU;
1028 // If we have -mtune or -mcpu, use that.
1029 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001030 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001031 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001032 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001033 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 }
1035
Kevin Qin110db6f2014-07-18 07:03:22 +00001036 // Handle CPU name is 'native'.
1037 if (CPU == "native")
1038 return llvm::sys::getHostCPUName();
1039 else if (CPU.size())
1040 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001041
James Molloy9b1586b2014-04-17 12:51:17 +00001042 // Make sure we pick "cyclone" if -arch is used.
1043 // FIXME: Should this be picked by checking the target triple instead?
1044 if (Args.getLastArg(options::OPT_arch))
1045 return "cyclone";
1046
1047 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001048}
1049
Tim Northover573cbee2014-05-24 12:52:07 +00001050void Clang::AddAArch64TargetArgs(const ArgList &Args,
1051 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001052 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1053 llvm::Triple Triple(TripleStr);
1054
1055 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
1058 CmdArgs.push_back("-disable-red-zone");
1059
1060 if (!Args.hasFlag(options::OPT_mimplicit_float,
1061 options::OPT_mno_implicit_float, true))
1062 CmdArgs.push_back("-no-implicit-float");
1063
Craig Topper92fc2df2014-05-17 16:56:41 +00001064 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1066 ABIName = A->getValue();
1067 else if (Triple.isOSDarwin())
1068 ABIName = "darwinpcs";
1069 else
1070 ABIName = "aapcs";
1071
1072 CmdArgs.push_back("-target-abi");
1073 CmdArgs.push_back(ABIName);
1074
Bradley Smith9ff64332014-10-13 10:16:06 +00001075 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1076 options::OPT_mno_fix_cortex_a53_835769)) {
1077 CmdArgs.push_back("-backend-option");
1078 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1079 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1080 else
1081 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001082 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001083 // Enabled A53 errata (835769) workaround by default on android
1084 CmdArgs.push_back("-backend-option");
1085 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001086 }
1087
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1090 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001091 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001092 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001093 CmdArgs.push_back("-aarch64-global-merge=false");
1094 else
1095 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001096 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001097}
1098
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001099// Get CPU and ABI names. They are not independent
1100// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001101void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1102 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001103 const char *DefMips32CPU = "mips32r2";
1104 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001105
Daniel Sanders2bf13662014-07-10 14:40:57 +00001106 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1107 // default for mips64(el)?-img-linux-gnu.
1108 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1109 Triple.getEnvironment() == llvm::Triple::GNU) {
1110 DefMips32CPU = "mips32r6";
1111 DefMips64CPU = "mips64r6";
1112 }
Renato Golin7c542b42015-07-27 23:44:45 +00001113
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001114 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001115 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001116 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001117
Brad Smithba26f582015-01-06 02:53:17 +00001118 // MIPS3 is the default for mips64*-unknown-openbsd.
1119 if (Triple.getOS() == llvm::Triple::OpenBSD)
1120 DefMips64CPU = "mips3";
1121
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001122 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001123 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001124
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001125 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001126 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001127 // Convert a GNU style Mips ABI name to the name
1128 // accepted by LLVM Mips backend.
1129 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001130 .Case("32", "o32")
1131 .Case("64", "n64")
1132 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001133 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001134
1135 // Setup default CPU and ABI names.
1136 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001137 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001138 default:
1139 llvm_unreachable("Unexpected triple arch name");
1140 case llvm::Triple::mips:
1141 case llvm::Triple::mipsel:
1142 CPUName = DefMips32CPU;
1143 break;
1144 case llvm::Triple::mips64:
1145 case llvm::Triple::mips64el:
1146 CPUName = DefMips64CPU;
1147 break;
1148 }
1149 }
1150
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001151 if (ABIName.empty()) {
1152 // Deduce ABI name from the target triple.
1153 if (Triple.getArch() == llvm::Triple::mips ||
1154 Triple.getArch() == llvm::Triple::mipsel)
1155 ABIName = "o32";
1156 else
1157 ABIName = "n64";
1158 }
1159
1160 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001161 // Deduce CPU name from ABI name.
1162 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001163 .Cases("o32", "eabi", DefMips32CPU)
1164 .Cases("n32", "n64", DefMips64CPU)
1165 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001166 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001167
1168 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001169}
1170
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001171std::string mips::getMipsABILibSuffix(const ArgList &Args,
1172 const llvm::Triple &Triple) {
1173 StringRef CPUName, ABIName;
1174 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1175 return llvm::StringSwitch<std::string>(ABIName)
1176 .Case("o32", "")
1177 .Case("n32", "32")
1178 .Case("n64", "64");
1179}
1180
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001181// Convert ABI name to the GNU tools acceptable variant.
1182static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1183 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001184 .Case("o32", "32")
1185 .Case("n64", "64")
1186 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001187}
1188
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001189// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1190// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001191static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1192 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A =
1194 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1195 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001196 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001197 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001198 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001200 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001201 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1202 .Case("soft", mips::FloatABI::Soft)
1203 .Case("hard", mips::FloatABI::Hard)
1204 .Default(mips::FloatABI::Invalid);
1205 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001206 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001207 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001208 }
1209 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001210 }
1211
1212 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001213 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001214 // Assume "hard", because it's a default value used by gcc.
1215 // When we start to recognize specific target MIPS processors,
1216 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001218 }
1219
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001220 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1221 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001222}
1223
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001225 std::vector<const char *> &Features,
1226 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001227 StringRef FeatureName) {
1228 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001229 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001230 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001231 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001232 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001233 }
1234}
1235
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1237 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001238 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 StringRef CPUName;
1240 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001241 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001242 ABIName = getGnuCompatibleMipsABIName(ABIName);
1243
Daniel Sandersfeb61302014-08-08 15:47:17 +00001244 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1245 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001246
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001247 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1248 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001249 // FIXME: Note, this is a hack. We need to pass the selected float
1250 // mode to the MipsTargetInfoBase to define appropriate macros there.
1251 // Now it is the only method.
1252 Features.push_back("+soft-float");
1253 }
1254
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001256 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001257 if (Val == "2008") {
1258 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1259 Features.push_back("+nan2008");
1260 else {
1261 Features.push_back("-nan2008");
1262 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1263 }
1264 } else if (Val == "legacy") {
1265 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1266 Features.push_back("-nan2008");
1267 else {
1268 Features.push_back("+nan2008");
1269 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1270 }
1271 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001272 D.Diag(diag::err_drv_unsupported_option_argument)
1273 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001274 }
1275
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001276 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1277 options::OPT_mdouble_float, "single-float");
1278 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1279 "mips16");
1280 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1281 options::OPT_mno_micromips, "micromips");
1282 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1283 "dsp");
1284 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1285 "dspr2");
1286 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1287 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001288
1289 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1290 // pass -mfpxx
1291 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1292 options::OPT_mfp64)) {
1293 if (A->getOption().matches(options::OPT_mfp32))
1294 Features.push_back(Args.MakeArgString("-fp64"));
1295 else if (A->getOption().matches(options::OPT_mfpxx)) {
1296 Features.push_back(Args.MakeArgString("+fpxx"));
1297 Features.push_back(Args.MakeArgString("+nooddspreg"));
1298 } else
1299 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001300 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001301 Features.push_back(Args.MakeArgString("+fpxx"));
1302 Features.push_back(Args.MakeArgString("+nooddspreg"));
1303 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304
Daniel Sanders28e5d392014-07-10 10:39:51 +00001305 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1306 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001307}
1308
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001309void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001310 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001311 const Driver &D = getToolChain().getDriver();
1312 StringRef CPUName;
1313 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001314 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001315 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001316
1317 CmdArgs.push_back("-target-abi");
1318 CmdArgs.push_back(ABIName.data());
1319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1321 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001322 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001323 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 CmdArgs.push_back("-mfloat-abi");
1325 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001326 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001327 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001328 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001329 CmdArgs.push_back("-mfloat-abi");
1330 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001331 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001332
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001333 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1334 if (A->getOption().matches(options::OPT_mxgot)) {
1335 CmdArgs.push_back("-mllvm");
1336 CmdArgs.push_back("-mxgot");
1337 }
1338 }
1339
Simon Atanasyanc580b322013-05-11 06:33:44 +00001340 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1341 options::OPT_mno_ldc1_sdc1)) {
1342 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1343 CmdArgs.push_back("-mllvm");
1344 CmdArgs.push_back("-mno-ldc1-sdc1");
1345 }
1346 }
1347
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001348 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1349 options::OPT_mno_check_zero_division)) {
1350 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1351 CmdArgs.push_back("-mllvm");
1352 CmdArgs.push_back("-mno-check-zero-division");
1353 }
1354 }
1355
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001356 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001357 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001358 CmdArgs.push_back("-mllvm");
1359 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1360 A->claim();
1361 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001362}
1363
Hal Finkel8eb59282012-06-11 22:35:19 +00001364/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1365static std::string getPPCTargetCPU(const ArgList &Args) {
1366 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001367 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001368
1369 if (CPUName == "native") {
1370 std::string CPU = llvm::sys::getHostCPUName();
1371 if (!CPU.empty() && CPU != "generic")
1372 return CPU;
1373 else
1374 return "";
1375 }
1376
1377 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378 .Case("common", "generic")
1379 .Case("440", "440")
1380 .Case("440fp", "440")
1381 .Case("450", "450")
1382 .Case("601", "601")
1383 .Case("602", "602")
1384 .Case("603", "603")
1385 .Case("603e", "603e")
1386 .Case("603ev", "603ev")
1387 .Case("604", "604")
1388 .Case("604e", "604e")
1389 .Case("620", "620")
1390 .Case("630", "pwr3")
1391 .Case("G3", "g3")
1392 .Case("7400", "7400")
1393 .Case("G4", "g4")
1394 .Case("7450", "7450")
1395 .Case("G4+", "g4+")
1396 .Case("750", "750")
1397 .Case("970", "970")
1398 .Case("G5", "g5")
1399 .Case("a2", "a2")
1400 .Case("a2q", "a2q")
1401 .Case("e500mc", "e500mc")
1402 .Case("e5500", "e5500")
1403 .Case("power3", "pwr3")
1404 .Case("power4", "pwr4")
1405 .Case("power5", "pwr5")
1406 .Case("power5x", "pwr5x")
1407 .Case("power6", "pwr6")
1408 .Case("power6x", "pwr6x")
1409 .Case("power7", "pwr7")
1410 .Case("power8", "pwr8")
1411 .Case("pwr3", "pwr3")
1412 .Case("pwr4", "pwr4")
1413 .Case("pwr5", "pwr5")
1414 .Case("pwr5x", "pwr5x")
1415 .Case("pwr6", "pwr6")
1416 .Case("pwr6x", "pwr6x")
1417 .Case("pwr7", "pwr7")
1418 .Case("pwr8", "pwr8")
1419 .Case("powerpc", "ppc")
1420 .Case("powerpc64", "ppc64")
1421 .Case("powerpc64le", "ppc64le")
1422 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001423 }
1424
1425 return "";
1426}
1427
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001428static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1429 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001430 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001431 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001432
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001433 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1434 if (FloatABI == ppc::FloatABI::Soft &&
1435 !(Triple.getArch() == llvm::Triple::ppc64 ||
1436 Triple.getArch() == llvm::Triple::ppc64le))
1437 Features.push_back("+soft-float");
1438 else if (FloatABI == ppc::FloatABI::Soft &&
1439 (Triple.getArch() == llvm::Triple::ppc64 ||
1440 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001441 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001442 << "soft float is not supported for ppc64";
1443
Eric Christopher643bb6a2013-10-16 20:40:08 +00001444 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001445 AddTargetFeature(Args, Features, options::OPT_faltivec,
1446 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001447}
1448
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001449ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1450 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1451 if (Arg *A =
1452 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1453 options::OPT_mfloat_abi_EQ)) {
1454 if (A->getOption().matches(options::OPT_msoft_float))
1455 ABI = ppc::FloatABI::Soft;
1456 else if (A->getOption().matches(options::OPT_mhard_float))
1457 ABI = ppc::FloatABI::Hard;
1458 else {
1459 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1460 .Case("soft", ppc::FloatABI::Soft)
1461 .Case("hard", ppc::FloatABI::Hard)
1462 .Default(ppc::FloatABI::Invalid);
1463 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1464 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1465 ABI = ppc::FloatABI::Hard;
1466 }
1467 }
1468 }
1469
1470 // If unspecified, choose the default based on the platform.
1471 if (ABI == ppc::FloatABI::Invalid) {
1472 ABI = ppc::FloatABI::Hard;
1473 }
1474
1475 return ABI;
1476}
1477
Ulrich Weigand8afad612014-07-28 13:17:52 +00001478void Clang::AddPPCTargetArgs(const ArgList &Args,
1479 ArgStringList &CmdArgs) const {
1480 // Select the ABI to use.
1481 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001482 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001484 case llvm::Triple::ppc64: {
1485 // When targeting a processor that supports QPX, or if QPX is
1486 // specifically enabled, default to using the ABI that supports QPX (so
1487 // long as it is not specifically disabled).
1488 bool HasQPX = false;
1489 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1490 HasQPX = A->getValue() == StringRef("a2q");
1491 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1492 if (HasQPX) {
1493 ABIName = "elfv1-qpx";
1494 break;
1495 }
1496
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 ABIName = "elfv1";
1498 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001499 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001500 case llvm::Triple::ppc64le:
1501 ABIName = "elfv2";
1502 break;
1503 default:
1504 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001506
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001507 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1508 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1509 // the option if given as we don't have backend support for any targets
1510 // that don't use the altivec abi.
1511 if (StringRef(A->getValue()) != "altivec")
1512 ABIName = A->getValue();
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514 ppc::FloatABI FloatABI =
1515 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1516
1517 if (FloatABI == ppc::FloatABI::Soft) {
1518 // Floating point operations and argument passing are soft.
1519 CmdArgs.push_back("-msoft-float");
1520 CmdArgs.push_back("-mfloat-abi");
1521 CmdArgs.push_back("soft");
1522 } else {
1523 // Floating point operations and argument passing are hard.
1524 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1525 CmdArgs.push_back("-mfloat-abi");
1526 CmdArgs.push_back("hard");
1527 }
1528
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 if (ABIName) {
1530 CmdArgs.push_back("-target-abi");
1531 CmdArgs.push_back(ABIName);
1532 }
1533}
1534
1535bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1536 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1537 return A && (A->getValue() == StringRef(Value));
1538}
1539
Tom Stellard6674c702013-04-01 20:56:53 +00001540/// Get the (LLVM) name of the R600 gpu we are targeting.
1541static std::string getR600TargetGPU(const ArgList &Args) {
1542 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001543 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001544 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001545 .Cases("rv630", "rv635", "r600")
1546 .Cases("rv610", "rv620", "rs780", "rs880")
1547 .Case("rv740", "rv770")
1548 .Case("palm", "cedar")
1549 .Cases("sumo", "sumo2", "sumo")
1550 .Case("hemlock", "cypress")
1551 .Case("aruba", "cayman")
1552 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001553 }
1554 return "";
1555}
1556
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001557void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001559 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001560 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001561
James Y Knightb2406522015-06-15 20:51:24 +00001562 bool SoftFloatABI = false;
1563 if (Arg *A =
1564 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001565 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001566 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001567 }
1568
James Y Knightb2406522015-06-15 20:51:24 +00001569 // Only the hard-float ABI on Sparc is standardized, and it is the
1570 // default. GCC also supports a nonstandard soft-float ABI mode, and
1571 // perhaps LLVM should implement that, too. However, since llvm
1572 // currently does not support Sparc soft-float, at all, display an
1573 // error if it's requested.
1574 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1576 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001577 }
1578}
1579
Richard Sandiford4652d892013-07-19 16:51:51 +00001580static const char *getSystemZTargetCPU(const ArgList &Args) {
1581 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1582 return A->getValue();
1583 return "z10";
1584}
1585
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001586static void getSystemZTargetFeatures(const ArgList &Args,
1587 std::vector<const char *> &Features) {
1588 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001589 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001590 if (A->getOption().matches(options::OPT_mhtm))
1591 Features.push_back("+transactional-execution");
1592 else
1593 Features.push_back("-transactional-execution");
1594 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001595 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001597 if (A->getOption().matches(options::OPT_mvx))
1598 Features.push_back("+vector");
1599 else
1600 Features.push_back("-vector");
1601 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001602}
1603
Chandler Carruth953fb082013-01-13 11:46:33 +00001604static const char *getX86TargetCPU(const ArgList &Args,
1605 const llvm::Triple &Triple) {
1606 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001607 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001608 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 return "core-avx2";
1610
Chandler Carruth953fb082013-01-13 11:46:33 +00001611 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001612 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001613
1614 // FIXME: Reject attempts to use -march=native unless the target matches
1615 // the host.
1616 //
1617 // FIXME: We should also incorporate the detected target features for use
1618 // with -native.
1619 std::string CPU = llvm::sys::getHostCPUName();
1620 if (!CPU.empty() && CPU != "generic")
1621 return Args.MakeArgString(CPU);
1622 }
1623
Reid Kleckner3123eff2015-06-30 16:32:04 +00001624 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1625 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1626 StringRef Arch = A->getValue();
1627 const char *CPU;
1628 if (Triple.getArch() == llvm::Triple::x86) {
1629 CPU = llvm::StringSwitch<const char *>(Arch)
1630 .Case("IA32", "i386")
1631 .Case("SSE", "pentium3")
1632 .Case("SSE2", "pentium4")
1633 .Case("AVX", "sandybridge")
1634 .Case("AVX2", "haswell")
1635 .Default(nullptr);
1636 } else {
1637 CPU = llvm::StringSwitch<const char *>(Arch)
1638 .Case("AVX", "sandybridge")
1639 .Case("AVX2", "haswell")
1640 .Default(nullptr);
1641 }
1642 if (CPU)
1643 return CPU;
1644 }
1645
Chandler Carruth953fb082013-01-13 11:46:33 +00001646 // Select the default CPU if none was given (or detection failed).
1647
1648 if (Triple.getArch() != llvm::Triple::x86_64 &&
1649 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001650 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001651
1652 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1653
1654 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001655 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 if (Triple.getArchName() == "x86_64h")
1657 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001658 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001659 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001660
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001661 // Set up default CPU name for PS4 compilers.
1662 if (Triple.isPS4CPU())
1663 return "btver2";
1664
Alexey Bataev286d1b92014-01-31 04:07:13 +00001665 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001666 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001667 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001668
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001669 // Everything else goes to x86-64 in 64-bit mode.
1670 if (Is64Bit)
1671 return "x86-64";
1672
1673 switch (Triple.getOS()) {
1674 case llvm::Triple::FreeBSD:
1675 case llvm::Triple::NetBSD:
1676 case llvm::Triple::OpenBSD:
1677 return "i486";
1678 case llvm::Triple::Haiku:
1679 return "i586";
1680 case llvm::Triple::Bitrig:
1681 return "i686";
1682 default:
1683 // Fallback to p4.
1684 return "pentium4";
1685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686}
1687
Dan Gohmanc2853072015-09-03 22:51:53 +00001688/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1689static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1690 // If we have -mcpu=, use that.
1691 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1692 StringRef CPU = A->getValue();
1693
1694#ifdef __wasm__
1695 // Handle "native" by examining the host. "native" isn't meaningful when
1696 // cross compiling, so only support this when the host is also WebAssembly.
1697 if (CPU == "native")
1698 return llvm::sys::getHostCPUName();
1699#endif
1700
1701 return CPU;
1702 }
1703
1704 return "generic";
1705}
1706
Renato Golin7c542b42015-07-27 23:44:45 +00001707static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1708 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001710 default:
1711 return "";
1712
Amara Emerson703da2e2013-10-31 09:32:33 +00001713 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001714 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001715 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001717 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001718 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001719 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001720 case llvm::Triple::thumbeb: {
1721 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001722 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001723 return arm::getARMTargetCPU(MCPU, MArch, T);
1724 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001725 case llvm::Triple::mips:
1726 case llvm::Triple::mipsel:
1727 case llvm::Triple::mips64:
1728 case llvm::Triple::mips64el: {
1729 StringRef CPUName;
1730 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001731 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001732 return CPUName;
1733 }
1734
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001735 case llvm::Triple::nvptx:
1736 case llvm::Triple::nvptx64:
1737 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1738 return A->getValue();
1739 return "";
1740
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001741 case llvm::Triple::ppc:
1742 case llvm::Triple::ppc64:
1743 case llvm::Triple::ppc64le: {
1744 std::string TargetCPUName = getPPCTargetCPU(Args);
1745 // LLVM may default to generating code for the native CPU,
1746 // but, like gcc, we default to a more generic option for
1747 // each architecture. (except on Darwin)
1748 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1749 if (T.getArch() == llvm::Triple::ppc64)
1750 TargetCPUName = "ppc64";
1751 else if (T.getArch() == llvm::Triple::ppc64le)
1752 TargetCPUName = "ppc64le";
1753 else
1754 TargetCPUName = "ppc";
1755 }
1756 return TargetCPUName;
1757 }
1758
1759 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001760 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001761 case llvm::Triple::sparcv9:
1762 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001763 return A->getValue();
1764 return "";
1765
1766 case llvm::Triple::x86:
1767 case llvm::Triple::x86_64:
1768 return getX86TargetCPU(Args, T);
1769
1770 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001771 return "hexagon" +
1772 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773
1774 case llvm::Triple::systemz:
1775 return getSystemZTargetCPU(Args);
1776
1777 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001778 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001779 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001780
1781 case llvm::Triple::wasm32:
1782 case llvm::Triple::wasm64:
1783 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001784 }
1785}
1786
Alp Tokerce365ca2013-12-02 12:43:03 +00001787static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001788 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001789 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1790 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1791 // forward.
1792 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 std::string Plugin =
1794 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001795 CmdArgs.push_back(Args.MakeArgString(Plugin));
1796
1797 // Try to pass driver level flags relevant to LTO code generation down to
1798 // the plugin.
1799
1800 // Handle flags for selecting CPU variants.
1801 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1802 if (!CPU.empty())
1803 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001804
James Molloyf97fdae2015-12-21 10:44:36 +00001805 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1806 StringRef OOpt;
1807 if (A->getOption().matches(options::OPT_O4) ||
1808 A->getOption().matches(options::OPT_Ofast))
1809 OOpt = "3";
1810 else if (A->getOption().matches(options::OPT_O))
1811 OOpt = A->getValue();
1812 else if (A->getOption().matches(options::OPT_O0))
1813 OOpt = "0";
1814 if (!OOpt.empty())
1815 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1816 }
1817
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001818 if (IsThinLTO)
1819 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001820}
1821
Sanjay Patel2987c292015-06-11 14:53:41 +00001822/// This is a helper function for validating the optional refinement step
1823/// parameter in reciprocal argument strings. Return false if there is an error
1824/// parsing the refinement step. Otherwise, return true and set the Position
1825/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001826static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001828 const char RefinementStepToken = ':';
1829 Position = In.find(RefinementStepToken);
1830 if (Position != StringRef::npos) {
1831 StringRef Option = A.getOption().getName();
1832 StringRef RefStep = In.substr(Position + 1);
1833 // Allow exactly one numeric character for the additional refinement
1834 // step parameter. This is reasonable for all currently-supported
1835 // operations and architectures because we would expect that a larger value
1836 // of refinement steps would cause the estimate "optimization" to
1837 // under-perform the native operation. Also, if the estimate does not
1838 // converge quickly, it probably will not ever converge, so further
1839 // refinement steps will not produce a better answer.
1840 if (RefStep.size() != 1) {
1841 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1842 return false;
1843 }
1844 char RefStepChar = RefStep[0];
1845 if (RefStepChar < '0' || RefStepChar > '9') {
1846 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1847 return false;
1848 }
1849 }
1850 return true;
1851}
1852
1853/// The -mrecip flag requires processing of many optional parameters.
1854static void ParseMRecip(const Driver &D, const ArgList &Args,
1855 ArgStringList &OutStrings) {
1856 StringRef DisabledPrefixIn = "!";
1857 StringRef DisabledPrefixOut = "!";
1858 StringRef EnabledPrefixOut = "";
1859 StringRef Out = "-mrecip=";
1860
1861 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1862 if (!A)
1863 return;
1864
1865 unsigned NumOptions = A->getNumValues();
1866 if (NumOptions == 0) {
1867 // No option is the same as "all".
1868 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1869 return;
1870 }
1871
1872 // Pass through "all", "none", or "default" with an optional refinement step.
1873 if (NumOptions == 1) {
1874 StringRef Val = A->getValue(0);
1875 size_t RefStepLoc;
1876 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1877 return;
1878 StringRef ValBase = Val.slice(0, RefStepLoc);
1879 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1880 OutStrings.push_back(Args.MakeArgString(Out + Val));
1881 return;
1882 }
1883 }
1884
1885 // Each reciprocal type may be enabled or disabled individually.
1886 // Check each input value for validity, concatenate them all back together,
1887 // and pass through.
1888
1889 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001890 OptionStrings.insert(std::make_pair("divd", false));
1891 OptionStrings.insert(std::make_pair("divf", false));
1892 OptionStrings.insert(std::make_pair("vec-divd", false));
1893 OptionStrings.insert(std::make_pair("vec-divf", false));
1894 OptionStrings.insert(std::make_pair("sqrtd", false));
1895 OptionStrings.insert(std::make_pair("sqrtf", false));
1896 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1897 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001898
1899 for (unsigned i = 0; i != NumOptions; ++i) {
1900 StringRef Val = A->getValue(i);
1901
1902 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1903 // Ignore the disablement token for string matching.
1904 if (IsDisabled)
1905 Val = Val.substr(1);
1906
1907 size_t RefStep;
1908 if (!getRefinementStep(Val, D, *A, RefStep))
1909 return;
1910
1911 StringRef ValBase = Val.slice(0, RefStep);
1912 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1913 if (OptionIter == OptionStrings.end()) {
1914 // Try again specifying float suffix.
1915 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1916 if (OptionIter == OptionStrings.end()) {
1917 // The input name did not match any known option string.
1918 D.Diag(diag::err_drv_unknown_argument) << Val;
1919 return;
1920 }
1921 // The option was specified without a float or double suffix.
1922 // Make sure that the double entry was not already specified.
1923 // The float entry will be checked below.
1924 if (OptionStrings[ValBase.str() + 'd']) {
1925 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1926 return;
1927 }
1928 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929
Sanjay Patel2987c292015-06-11 14:53:41 +00001930 if (OptionIter->second == true) {
1931 // Duplicate option specified.
1932 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1933 return;
1934 }
1935
1936 // Mark the matched option as found. Do not allow duplicate specifiers.
1937 OptionIter->second = true;
1938
1939 // If the precision was not specified, also mark the double entry as found.
1940 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1941 OptionStrings[ValBase.str() + 'd'] = true;
1942
1943 // Build the output string.
1944 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1945 Out = Args.MakeArgString(Out + Prefix + Val);
1946 if (i != NumOptions - 1)
1947 Out = Args.MakeArgString(Out + ",");
1948 }
1949
1950 OutStrings.push_back(Args.MakeArgString(Out));
1951}
1952
Eric Christopherc54920a2015-03-23 19:26:05 +00001953static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001954 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001955 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001956 // If -march=native, autodetect the feature list.
1957 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1958 if (StringRef(A->getValue()) == "native") {
1959 llvm::StringMap<bool> HostFeatures;
1960 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1961 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001962 Features.push_back(
1963 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 }
1965 }
1966
Jim Grosbach82eee262013-11-16 00:53:35 +00001967 if (Triple.getArchName() == "x86_64h") {
1968 // x86_64h implies quite a few of the more modern subtarget features
1969 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1970 Features.push_back("-rdrnd");
1971 Features.push_back("-aes");
1972 Features.push_back("-pclmul");
1973 Features.push_back("-rtm");
1974 Features.push_back("-hle");
1975 Features.push_back("-fsgsbase");
1976 }
1977
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001978 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001979 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001980 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001981 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001982 Features.push_back("+sse4.2");
1983 Features.push_back("+popcnt");
1984 } else
1985 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001986 }
1987
Eric Christopherc54920a2015-03-23 19:26:05 +00001988 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001989 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1990 StringRef Arch = A->getValue();
1991 bool ArchUsed = false;
1992 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001993 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001994 if (Arch == "AVX" || Arch == "AVX2") {
1995 ArchUsed = true;
1996 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1997 }
1998 }
1999 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002000 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002001 if (Arch == "IA32") {
2002 ArchUsed = true;
2003 } else if (Arch == "SSE" || Arch == "SSE2") {
2004 ArchUsed = true;
2005 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2006 }
2007 }
2008 if (!ArchUsed)
2009 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2010 }
2011
Jim Grosbach82eee262013-11-16 00:53:35 +00002012 // Now add any that the user explicitly requested on the command line,
2013 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002014 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002015}
2016
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002017void Clang::AddX86TargetArgs(const ArgList &Args,
2018 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002019 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002020 Args.hasArg(options::OPT_mkernel) ||
2021 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002022 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002023
Bob Wilson2616e2e2013-02-10 16:01:41 +00002024 // Default to avoid implicit floating-point for kernel/kext code, but allow
2025 // that to be overridden with -mno-soft-float.
2026 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2027 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002028 if (Arg *A = Args.getLastArg(
2029 options::OPT_msoft_float, options::OPT_mno_soft_float,
2030 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002031 const Option &O = A->getOption();
2032 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2033 O.matches(options::OPT_msoft_float));
2034 }
2035 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002036 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002037
2038 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2039 StringRef Value = A->getValue();
2040 if (Value == "intel" || Value == "att") {
2041 CmdArgs.push_back("-mllvm");
2042 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2043 } else {
2044 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2045 << A->getOption().getName() << Value;
2046 }
2047 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002048}
2049
Tony Linthicum76329bf2011-12-12 21:14:55 +00002050void Clang::AddHexagonTargetArgs(const ArgList &Args,
2051 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002052 CmdArgs.push_back("-mqdsp6-compat");
2053 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002054
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002055 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2056 std::string N = llvm::utostr(G.getValue());
2057 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002058 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002059 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002060 }
2061
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002062 if (!Args.hasArg(options::OPT_fno_short_enums))
2063 CmdArgs.push_back("-fshort-enums");
2064 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002065 CmdArgs.push_back("-mllvm");
2066 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002067 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002068 CmdArgs.push_back("-mllvm");
2069 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002070}
2071
Dan Gohmane3d71e12016-01-07 01:00:21 +00002072void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2073 ArgStringList &CmdArgs) const {
2074 // Default to "hidden" visibility.
2075 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2076 options::OPT_fvisibility_ms_compat)) {
2077 CmdArgs.push_back("-fvisibility");
2078 CmdArgs.push_back("hidden");
2079 }
2080}
2081
Kevin Qin110db6f2014-07-18 07:03:22 +00002082// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002083static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002084 std::vector<const char *> &Features) {
2085 SmallVector<StringRef, 8> Split;
2086 text.split(Split, StringRef("+"), -1, false);
2087
Benjamin Kramer72e64312015-09-24 14:48:49 +00002088 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002089 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002090 .Case("fp", "+fp-armv8")
2091 .Case("simd", "+neon")
2092 .Case("crc", "+crc")
2093 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002094 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002095 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 .Case("nofp", "-fp-armv8")
2097 .Case("nosimd", "-neon")
2098 .Case("nocrc", "-crc")
2099 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002100 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002101 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002102 .Default(nullptr);
2103 if (result)
2104 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002105 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002106 D.Diag(diag::err_drv_no_neon_modifier);
2107 else
2108 return false;
2109 }
2110 return true;
2111}
2112
2113// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2114// decode CPU and feature.
2115static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2116 std::vector<const char *> &Features) {
2117 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2118 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
MinSeong Kim50d9c152016-01-05 12:53:24 +00002120 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002121 Features.push_back("+neon");
2122 Features.push_back("+crc");
2123 Features.push_back("+crypto");
2124 } else if (CPU == "generic") {
2125 Features.push_back("+neon");
2126 } else {
2127 return false;
2128 }
2129
2130 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2131 return false;
2132
2133 return true;
2134}
2135
2136static bool
2137getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2138 const ArgList &Args,
2139 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002140 std::string MarchLowerCase = March.lower();
2141 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002144 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002146 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002147 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2148 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002149 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002150 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002151 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002152
2153 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2154 return false;
2155
2156 return true;
2157}
2158
2159static bool
2160getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2161 const ArgList &Args,
2162 std::vector<const char *> &Features) {
2163 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002164 std::string McpuLowerCase = Mcpu.lower();
2165 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002175 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002177 if (MtuneLowerCase == "native")
2178 MtuneLowerCase = llvm::sys::getHostCPUName();
2179 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 Features.push_back("+zcm");
2181 Features.push_back("+zcz");
2182 }
2183 return true;
2184}
2185
2186static bool
2187getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2188 const ArgList &Args,
2189 std::vector<const char *> &Features) {
2190 StringRef CPU;
2191 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002192 std::string McpuLowerCase = Mcpu.lower();
2193 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 return false;
2195
2196 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2197}
2198
Justin Bognerf9052562015-11-13 23:07:31 +00002199static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002200 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002201 Arg *A;
2202 bool success = true;
2203 // Enable NEON by default.
2204 Features.push_back("+neon");
2205 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2206 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2207 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2208 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002209 else if (Args.hasArg(options::OPT_arch))
2210 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2211 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002212
2213 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2214 success =
2215 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2216 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2217 success =
2218 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002219 else if (Args.hasArg(options::OPT_arch))
2220 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2221 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002222
2223 if (!success)
2224 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002225
2226 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2227 Features.push_back("-fp-armv8");
2228 Features.push_back("-crypto");
2229 Features.push_back("-neon");
2230 }
Bradley Smith418c5932014-05-02 15:17:51 +00002231
2232 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002234 if (A->getOption().matches(options::OPT_mcrc))
2235 Features.push_back("+crc");
2236 else
2237 Features.push_back("-crc");
2238 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002239
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002240 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2241 options::OPT_munaligned_access))
2242 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2243 Features.push_back("+strict-align");
2244
Justin Bognerf9052562015-11-13 23:07:31 +00002245 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002246 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002247}
2248
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002249static void getHexagonTargetFeatures(const ArgList &Args,
2250 std::vector<const char *> &Features) {
2251 bool HasHVX = false, HasHVXD = false;
2252
Eric Christopher49062a52015-12-22 03:12:34 +00002253 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2254 // doing dependent option handling here rather than in initFeatureMap or a
2255 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002256 for (auto &A : Args) {
2257 auto &Opt = A->getOption();
2258 if (Opt.matches(options::OPT_mhexagon_hvx))
2259 HasHVX = true;
2260 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2261 HasHVXD = HasHVX = false;
2262 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2263 HasHVXD = HasHVX = true;
2264 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2265 HasHVXD = false;
2266 else
2267 continue;
2268 A->claim();
2269 }
2270
2271 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2272 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2273}
2274
Dan Gohmanc2853072015-09-03 22:51:53 +00002275static void getWebAssemblyTargetFeatures(const ArgList &Args,
2276 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002277 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002278}
2279
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002280static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002281 const ArgList &Args, ArgStringList &CmdArgs,
2282 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002283 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002284 std::vector<const char *> Features;
2285 switch (Triple.getArch()) {
2286 default:
2287 break;
2288 case llvm::Triple::mips:
2289 case llvm::Triple::mipsel:
2290 case llvm::Triple::mips64:
2291 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002292 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002293 break;
2294
2295 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002296 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002297 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002298 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002299 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 break;
2301
2302 case llvm::Triple::ppc:
2303 case llvm::Triple::ppc64:
2304 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002305 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002306 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002307 case llvm::Triple::systemz:
2308 getSystemZTargetFeatures(Args, Features);
2309 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002310 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002311 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002312 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002313 break;
2314 case llvm::Triple::x86:
2315 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002316 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002317 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002318 case llvm::Triple::hexagon:
2319 getHexagonTargetFeatures(Args, Features);
2320 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002321 case llvm::Triple::wasm32:
2322 case llvm::Triple::wasm64:
2323 getWebAssemblyTargetFeatures(Args, Features);
2324 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 }
Rafael Espindola43964802013-08-21 17:34:32 +00002326
2327 // Find the last of each feature.
2328 llvm::StringMap<unsigned> LastOpt;
2329 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2330 const char *Name = Features[I];
2331 assert(Name[0] == '-' || Name[0] == '+');
2332 LastOpt[Name + 1] = I;
2333 }
2334
2335 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2336 // If this feature was overridden, ignore it.
2337 const char *Name = Features[I];
2338 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2339 assert(LastI != LastOpt.end());
2340 unsigned Last = LastI->second;
2341 if (Last != I)
2342 continue;
2343
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002344 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002345 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002346 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002347}
2348
David Majnemerae394812014-12-09 00:12:30 +00002349static bool
2350shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2351 const llvm::Triple &Triple) {
2352 // We use the zero-cost exception tables for Objective-C if the non-fragile
2353 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2354 // later.
2355 if (runtime.isNonFragile())
2356 return true;
2357
2358 if (!Triple.isMacOSX())
2359 return false;
2360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002361 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002362 (Triple.getArch() == llvm::Triple::x86_64 ||
2363 Triple.getArch() == llvm::Triple::arm));
2364}
2365
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002366/// Adds exception related arguments to the driver command arguments. There's a
2367/// master flag, -fexceptions and also language specific flags to enable/disable
2368/// C++ and Objective-C exceptions. This makes it possible to for example
2369/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002370static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002371 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002372 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002373 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002374 const Driver &D = TC.getDriver();
2375 const llvm::Triple &Triple = TC.getTriple();
2376
Chad Rosier4fab82c2012-03-26 22:04:46 +00002377 if (KernelOrKext) {
2378 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2379 // arguments now to avoid warnings about unused arguments.
2380 Args.ClaimAllArgs(options::OPT_fexceptions);
2381 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2382 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2383 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2384 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2385 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002386 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002387 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002388
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002389 // See if the user explicitly enabled exceptions.
2390 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2391 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002392
David Majnemerae394812014-12-09 00:12:30 +00002393 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2394 // is not necessarily sensible, but follows GCC.
2395 if (types::isObjC(InputType) &&
2396 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002398 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002399
David Majnemerae394812014-12-09 00:12:30 +00002400 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002401 }
2402
2403 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002404 // Disable C++ EH by default on XCore, PS4, and MSVC.
2405 // FIXME: Remove MSVC from this list once things work.
2406 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2407 !Triple.isPS4CPU() &&
2408 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002409 Arg *ExceptionArg = Args.getLastArg(
2410 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2411 options::OPT_fexceptions, options::OPT_fno_exceptions);
2412 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002413 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002414 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2415 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002416
2417 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002418 if (Triple.isPS4CPU()) {
2419 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2420 assert(ExceptionArg &&
2421 "On the PS4 exceptions should only be enabled if passing "
2422 "an argument");
2423 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2424 const Arg *RTTIArg = TC.getRTTIArg();
2425 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2426 D.Diag(diag::err_drv_argument_not_allowed_with)
2427 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2428 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2429 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2430 } else
2431 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2432
Anders Carlssone96ab552011-02-28 02:27:16 +00002433 CmdArgs.push_back("-fcxx-exceptions");
2434
David Majnemer8de68642014-12-05 08:11:58 +00002435 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002436 }
2437 }
2438
David Majnemer8de68642014-12-05 08:11:58 +00002439 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002440 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002441}
2442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002443static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002444 bool Default = true;
2445 if (TC.getTriple().isOSDarwin()) {
2446 // The native darwin assembler doesn't support the linker_option directives,
2447 // so we disable them if we think the .s file will be passed to it.
2448 Default = TC.useIntegratedAs();
2449 }
2450 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2451 Default);
2452}
2453
Ted Kremenek62093662013-03-12 17:02:12 +00002454static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2455 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002456 bool UseDwarfDirectory =
2457 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2458 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002459 return !UseDwarfDirectory;
2460}
2461
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002462/// \brief Check whether the given input tree contains any compilation actions.
2463static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002464 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002465 return true;
2466
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002467 for (const auto &Act : *A)
2468 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002469 return true;
2470
2471 return false;
2472}
2473
2474/// \brief Check if -relax-all should be passed to the internal assembler.
2475/// This is done by default when compiling non-assembler source with -O0.
2476static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2477 bool RelaxDefault = true;
2478
2479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2480 RelaxDefault = A->getOption().matches(options::OPT_O0);
2481
2482 if (RelaxDefault) {
2483 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002484 for (const auto &Act : C.getActions()) {
2485 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002486 RelaxDefault = true;
2487 break;
2488 }
2489 }
2490 }
2491
2492 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002493 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002494}
2495
Paul Robinson0334a042015-12-19 19:41:48 +00002496// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2497// to the corresponding DebugInfoKind.
2498static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2499 assert(A.getOption().matches(options::OPT_gN_Group) &&
2500 "Not a -g option that specifies a debug-info level");
2501 if (A.getOption().matches(options::OPT_g0) ||
2502 A.getOption().matches(options::OPT_ggdb0))
2503 return CodeGenOptions::NoDebugInfo;
2504 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2505 A.getOption().matches(options::OPT_ggdb1))
2506 return CodeGenOptions::DebugLineTablesOnly;
2507 return CodeGenOptions::LimitedDebugInfo;
2508}
2509
Douglas Katzman3459ce22015-10-08 04:24:12 +00002510// Extract the integer N from a string spelled "-dwarf-N", returning 0
2511// on mismatch. The StringRef input (rather than an Arg) allows
2512// for use by the "-Xassembler" option parser.
2513static unsigned DwarfVersionNum(StringRef ArgValue) {
2514 return llvm::StringSwitch<unsigned>(ArgValue)
2515 .Case("-gdwarf-2", 2)
2516 .Case("-gdwarf-3", 3)
2517 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002518 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002519 .Default(0);
2520}
2521
2522static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2523 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002524 unsigned DwarfVersion,
2525 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002526 switch (DebugInfoKind) {
2527 case CodeGenOptions::DebugLineTablesOnly:
2528 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2529 break;
2530 case CodeGenOptions::LimitedDebugInfo:
2531 CmdArgs.push_back("-debug-info-kind=limited");
2532 break;
2533 case CodeGenOptions::FullDebugInfo:
2534 CmdArgs.push_back("-debug-info-kind=standalone");
2535 break;
2536 default:
2537 break;
2538 }
2539 if (DwarfVersion > 0)
2540 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002541 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002542 switch (DebuggerTuning) {
2543 case llvm::DebuggerKind::GDB:
2544 CmdArgs.push_back("-debugger-tuning=gdb");
2545 break;
2546 case llvm::DebuggerKind::LLDB:
2547 CmdArgs.push_back("-debugger-tuning=lldb");
2548 break;
2549 case llvm::DebuggerKind::SCE:
2550 CmdArgs.push_back("-debugger-tuning=sce");
2551 break;
2552 default:
2553 break;
2554 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002555}
2556
David Blaikie9260ed62013-07-25 21:19:01 +00002557static void CollectArgsForIntegratedAssembler(Compilation &C,
2558 const ArgList &Args,
2559 ArgStringList &CmdArgs,
2560 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002561 if (UseRelaxAll(C, Args))
2562 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002563
David Majnemer2b9349d2015-12-21 22:09:34 +00002564 // Only default to -mincremental-linker-compatible if we think we are
2565 // targeting the MSVC linker.
2566 bool DefaultIncrementalLinkerCompatible =
2567 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2568 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2569 options::OPT_mno_incremental_linker_compatible,
2570 DefaultIncrementalLinkerCompatible))
2571 CmdArgs.push_back("-mincremental-linker-compatible");
2572
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002573 // When passing -I arguments to the assembler we sometimes need to
2574 // unconditionally take the next argument. For example, when parsing
2575 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2576 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2577 // arg after parsing the '-I' arg.
2578 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 // When using an integrated assembler, translate -Wa, and -Xassembler
2581 // options.
2582 bool CompressDebugSections = false;
2583 for (const Arg *A :
2584 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2585 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002586
Benjamin Kramer72e64312015-09-24 14:48:49 +00002587 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002588 if (TakeNextArg) {
2589 CmdArgs.push_back(Value.data());
2590 TakeNextArg = false;
2591 continue;
2592 }
David Blaikie9260ed62013-07-25 21:19:01 +00002593
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002594 switch (C.getDefaultToolChain().getArch()) {
2595 default:
2596 break;
2597 case llvm::Triple::mips:
2598 case llvm::Triple::mipsel:
2599 case llvm::Triple::mips64:
2600 case llvm::Triple::mips64el:
2601 if (Value == "--trap") {
2602 CmdArgs.push_back("-target-feature");
2603 CmdArgs.push_back("+use-tcc-in-div");
2604 continue;
2605 }
2606 if (Value == "--break") {
2607 CmdArgs.push_back("-target-feature");
2608 CmdArgs.push_back("-use-tcc-in-div");
2609 continue;
2610 }
2611 if (Value.startswith("-msoft-float")) {
2612 CmdArgs.push_back("-target-feature");
2613 CmdArgs.push_back("+soft-float");
2614 continue;
2615 }
2616 if (Value.startswith("-mhard-float")) {
2617 CmdArgs.push_back("-target-feature");
2618 CmdArgs.push_back("-soft-float");
2619 continue;
2620 }
2621 break;
2622 }
2623
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002624 if (Value == "-force_cpusubtype_ALL") {
2625 // Do nothing, this is the default and we don't support anything else.
2626 } else if (Value == "-L") {
2627 CmdArgs.push_back("-msave-temp-labels");
2628 } else if (Value == "--fatal-warnings") {
2629 CmdArgs.push_back("-massembler-fatal-warnings");
2630 } else if (Value == "--noexecstack") {
2631 CmdArgs.push_back("-mnoexecstack");
2632 } else if (Value == "-compress-debug-sections" ||
2633 Value == "--compress-debug-sections") {
2634 CompressDebugSections = true;
2635 } else if (Value == "-nocompress-debug-sections" ||
2636 Value == "--nocompress-debug-sections") {
2637 CompressDebugSections = false;
2638 } else if (Value.startswith("-I")) {
2639 CmdArgs.push_back(Value.data());
2640 // We need to consume the next argument if the current arg is a plain
2641 // -I. The next arg will be the include directory.
2642 if (Value == "-I")
2643 TakeNextArg = true;
2644 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002645 // "-gdwarf-N" options are not cc1as options.
2646 unsigned DwarfVersion = DwarfVersionNum(Value);
2647 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2648 CmdArgs.push_back(Value.data());
2649 } else {
2650 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002651 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2652 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002653 }
Renato Golin7c542b42015-07-27 23:44:45 +00002654 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2655 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2656 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002657 } else {
2658 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002659 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002660 }
2661 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002662 }
2663 if (CompressDebugSections) {
2664 if (llvm::zlib::isAvailable())
2665 CmdArgs.push_back("-compress-debug-sections");
2666 else
2667 D.Diag(diag::warn_debug_compression_unavailable);
2668 }
David Blaikie9260ed62013-07-25 21:19:01 +00002669}
2670
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002671// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002672// FIXME: Make sure we can also emit shared objects if they're requested
2673// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002674static void addClangRT(const ToolChain &TC, const ArgList &Args,
2675 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002676 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002677}
2678
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002679namespace {
2680enum OpenMPRuntimeKind {
2681 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2682 /// without knowing what runtime to target.
2683 OMPRT_Unknown,
2684
2685 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2686 /// the default for Clang.
2687 OMPRT_OMP,
2688
2689 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2690 /// this runtime but can swallow the pragmas, and find and link against the
2691 /// runtime library itself.
2692 OMPRT_GOMP,
2693
Chandler Carruthc6625c62015-05-28 21:10:31 +00002694 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002695 /// OpenMP runtime. We support this mode for users with existing dependencies
2696 /// on this runtime library name.
2697 OMPRT_IOMP5
2698};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002699}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002700
2701/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002702static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2703 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002704 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2705
2706 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2707 if (A)
2708 RuntimeName = A->getValue();
2709
2710 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002711 .Case("libomp", OMPRT_OMP)
2712 .Case("libgomp", OMPRT_GOMP)
2713 .Case("libiomp5", OMPRT_IOMP5)
2714 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002715
2716 if (RT == OMPRT_Unknown) {
2717 if (A)
2718 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002719 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002720 else
2721 // FIXME: We could use a nicer diagnostic here.
2722 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2723 }
2724
2725 return RT;
2726}
2727
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002728static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2729 const ArgList &Args) {
2730 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2731 options::OPT_fno_openmp, false))
2732 return;
2733
2734 switch (getOpenMPRuntime(TC, Args)) {
2735 case OMPRT_OMP:
2736 CmdArgs.push_back("-lomp");
2737 break;
2738 case OMPRT_GOMP:
2739 CmdArgs.push_back("-lgomp");
2740 break;
2741 case OMPRT_IOMP5:
2742 CmdArgs.push_back("-liomp5");
2743 break;
2744 case OMPRT_Unknown:
2745 // Already diagnosed.
2746 break;
2747 }
2748}
2749
Alexey Samsonov52550342014-09-15 19:58:40 +00002750static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2751 ArgStringList &CmdArgs, StringRef Sanitizer,
2752 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002753 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002754 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002755 if (!IsShared) CmdArgs.push_back("-whole-archive");
2756 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2757 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002758}
2759
Alexey Samsonov52550342014-09-15 19:58:40 +00002760// Tries to use a file with the list of dynamic symbols that need to be exported
2761// from the runtime library. Returns true if the file was found.
2762static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2763 ArgStringList &CmdArgs,
2764 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002765 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002766 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2767 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002768 return true;
2769 }
2770 return false;
2771}
2772
2773static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2774 ArgStringList &CmdArgs) {
2775 // Force linking against the system libraries sanitizers depends on
2776 // (see PR15823 why this is necessary).
2777 CmdArgs.push_back("--no-as-needed");
2778 CmdArgs.push_back("-lpthread");
2779 CmdArgs.push_back("-lrt");
2780 CmdArgs.push_back("-lm");
2781 // There's no libdl on FreeBSD.
2782 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2783 CmdArgs.push_back("-ldl");
2784}
2785
2786static void
2787collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2788 SmallVectorImpl<StringRef> &SharedRuntimes,
2789 SmallVectorImpl<StringRef> &StaticRuntimes,
2790 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2791 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2792 // Collect shared runtimes.
2793 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2794 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002795 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002796
Alexey Samsonov52550342014-09-15 19:58:40 +00002797 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002798 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002799 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002800 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002801 }
2802 if (SanArgs.needsAsanRt()) {
2803 if (SanArgs.needsSharedAsanRt()) {
2804 HelperStaticRuntimes.push_back("asan-preinit");
2805 } else {
2806 StaticRuntimes.push_back("asan");
2807 if (SanArgs.linkCXXRuntimes())
2808 StaticRuntimes.push_back("asan_cxx");
2809 }
2810 }
2811 if (SanArgs.needsDfsanRt())
2812 StaticRuntimes.push_back("dfsan");
2813 if (SanArgs.needsLsanRt())
2814 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002815 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002816 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002817 if (SanArgs.linkCXXRuntimes())
2818 StaticRuntimes.push_back("msan_cxx");
2819 }
2820 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002821 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002822 if (SanArgs.linkCXXRuntimes())
2823 StaticRuntimes.push_back("tsan_cxx");
2824 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002825 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002826 StaticRuntimes.push_back("ubsan_standalone");
2827 if (SanArgs.linkCXXRuntimes())
2828 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002829 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002830 if (SanArgs.needsSafeStackRt())
2831 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002832 if (SanArgs.needsCfiRt())
2833 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002834 if (SanArgs.needsCfiDiagRt())
2835 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002836}
2837
Alexey Samsonov52550342014-09-15 19:58:40 +00002838// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2839// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2840static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002841 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002842 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2843 HelperStaticRuntimes;
2844 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2845 HelperStaticRuntimes);
2846 for (auto RT : SharedRuntimes)
2847 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2848 for (auto RT : HelperStaticRuntimes)
2849 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2850 bool AddExportDynamic = false;
2851 for (auto RT : StaticRuntimes) {
2852 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2853 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2854 }
2855 // If there is a static runtime with no dynamic list, force all the symbols
2856 // to be dynamic to be sure we export sanitizer interface functions.
2857 if (AddExportDynamic)
2858 CmdArgs.push_back("-export-dynamic");
2859 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002860}
2861
Reid Kleckner86ea7702015-02-04 23:45:07 +00002862static bool areOptimizationsEnabled(const ArgList &Args) {
2863 // Find the last -O arg and see if it is non-zero.
2864 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2865 return !A->getOption().matches(options::OPT_O0);
2866 // Defaults to -O0.
2867 return false;
2868}
2869
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002870static bool shouldUseFramePointerForTarget(const ArgList &Args,
2871 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002872 switch (Triple.getArch()) {
2873 case llvm::Triple::xcore:
2874 case llvm::Triple::wasm32:
2875 case llvm::Triple::wasm64:
2876 // XCore never wants frame pointers, regardless of OS.
2877 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002878 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002879 default:
2880 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002881 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002882
2883 if (Triple.isOSLinux()) {
2884 switch (Triple.getArch()) {
2885 // Don't use a frame pointer on linux if optimizing for certain targets.
2886 case llvm::Triple::mips64:
2887 case llvm::Triple::mips64el:
2888 case llvm::Triple::mips:
2889 case llvm::Triple::mipsel:
2890 case llvm::Triple::systemz:
2891 case llvm::Triple::x86:
2892 case llvm::Triple::x86_64:
2893 return !areOptimizationsEnabled(Args);
2894 default:
2895 return true;
2896 }
2897 }
2898
2899 if (Triple.isOSWindows()) {
2900 switch (Triple.getArch()) {
2901 case llvm::Triple::x86:
2902 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002903 case llvm::Triple::arm:
2904 case llvm::Triple::thumb:
2905 // Windows on ARM builds with FPO disabled to aid fast stack walking
2906 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002907 default:
2908 // All other supported Windows ISAs use xdata unwind information, so frame
2909 // pointers are not generally useful.
2910 return false;
2911 }
2912 }
2913
2914 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002915}
2916
Rafael Espindola224dd632011-12-14 21:02:23 +00002917static bool shouldUseFramePointer(const ArgList &Args,
2918 const llvm::Triple &Triple) {
2919 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2920 options::OPT_fomit_frame_pointer))
2921 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002922 if (Args.hasArg(options::OPT_pg))
2923 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002924
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002925 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002926}
2927
Eric Christopherb7d97e92013-04-03 01:58:53 +00002928static bool shouldUseLeafFramePointer(const ArgList &Args,
2929 const llvm::Triple &Triple) {
2930 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2931 options::OPT_momit_leaf_frame_pointer))
2932 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002933 if (Args.hasArg(options::OPT_pg))
2934 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002935
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002936 if (Triple.isPS4CPU())
2937 return false;
2938
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002939 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002940}
2941
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002942/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002943static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002944 SmallString<128> cwd;
2945 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002946 CmdArgs.push_back("-fdebug-compilation-dir");
2947 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002948 }
2949}
2950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002951static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002952 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2953 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2954 SmallString<128> T(FinalOutput->getValue());
2955 llvm::sys::path::replace_extension(T, "dwo");
2956 return Args.MakeArgString(T);
2957 } else {
2958 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002959 SmallString<128> T(
2960 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002961 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002962 llvm::sys::path::replace_extension(F, "dwo");
2963 T += F;
2964 return Args.MakeArgString(F);
2965 }
2966}
2967
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002968static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2969 const JobAction &JA, const ArgList &Args,
2970 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002971 ArgStringList ExtractArgs;
2972 ExtractArgs.push_back("--extract-dwo");
2973
2974 ArgStringList StripArgs;
2975 StripArgs.push_back("--strip-dwo");
2976
2977 // Grabbing the output of the earlier compile step.
2978 StripArgs.push_back(Output.getFilename());
2979 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002980 ExtractArgs.push_back(OutFile);
2981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002982 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002983 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002984
2985 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002986 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002987
2988 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002989 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002990}
2991
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002992/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002993/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2994static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002995 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002996 if (A->getOption().matches(options::OPT_O4) ||
2997 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002998 return true;
2999
3000 if (A->getOption().matches(options::OPT_O0))
3001 return false;
3002
3003 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3004
Rafael Espindola91780de2013-08-26 14:05:41 +00003005 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003006 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003007 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003008 return true;
3009
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003010 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003011 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003012 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003013
3014 unsigned OptLevel = 0;
3015 if (S.getAsInteger(10, OptLevel))
3016 return false;
3017
3018 return OptLevel > 1;
3019 }
3020
3021 return false;
3022}
3023
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003024/// Add -x lang to \p CmdArgs for \p Input.
3025static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3026 ArgStringList &CmdArgs) {
3027 // When using -verify-pch, we don't want to provide the type
3028 // 'precompiled-header' if it was inferred from the file extension
3029 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3030 return;
3031
3032 CmdArgs.push_back("-x");
3033 if (Args.hasArg(options::OPT_rewrite_objc))
3034 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3035 else
3036 CmdArgs.push_back(types::getTypeName(Input.getType()));
3037}
3038
David Majnemerc371ff02015-03-22 08:39:22 +00003039static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003040 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003041 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003042
3043 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003044 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003045
3046 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003047 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003048 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003049 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003050}
3051
Rafael Espindola577637a2015-01-03 00:06:04 +00003052// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003053// options that build systems might add but are unused when assembling or only
3054// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003055static void claimNoWarnArgs(const ArgList &Args) {
3056 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003057 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003058 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003059 Args.ClaimAllArgs(options::OPT_flto);
3060 Args.ClaimAllArgs(options::OPT_fno_lto);
3061}
3062
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003063static void appendUserToPath(SmallVectorImpl<char> &Result) {
3064#ifdef LLVM_ON_UNIX
3065 const char *Username = getenv("LOGNAME");
3066#else
3067 const char *Username = getenv("USERNAME");
3068#endif
3069 if (Username) {
3070 // Validate that LoginName can be used in a path, and get its length.
3071 size_t Len = 0;
3072 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003073 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003074 Username = nullptr;
3075 break;
3076 }
3077 }
3078
3079 if (Username && Len > 0) {
3080 Result.append(Username, Username + Len);
3081 return;
3082 }
3083 }
3084
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003085// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003086#ifdef LLVM_ON_UNIX
3087 std::string UID = llvm::utostr(getuid());
3088#else
3089 // FIXME: Windows seems to have an 'SID' that might work.
3090 std::string UID = "9999";
3091#endif
3092 Result.append(UID.begin(), UID.end());
3093}
3094
David Majnemere11d3732015-06-08 00:22:46 +00003095VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3096 const llvm::Triple &Triple,
3097 const llvm::opt::ArgList &Args,
3098 bool IsWindowsMSVC) {
3099 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3100 IsWindowsMSVC) ||
3101 Args.hasArg(options::OPT_fmsc_version) ||
3102 Args.hasArg(options::OPT_fms_compatibility_version)) {
3103 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3104 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003106
3107 if (MSCVersion && MSCompatibilityVersion) {
3108 if (D)
3109 D->Diag(diag::err_drv_argument_not_allowed_with)
3110 << MSCVersion->getAsString(Args)
3111 << MSCompatibilityVersion->getAsString(Args);
3112 return VersionTuple();
3113 }
3114
3115 if (MSCompatibilityVersion) {
3116 VersionTuple MSVT;
3117 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3118 D->Diag(diag::err_drv_invalid_value)
3119 << MSCompatibilityVersion->getAsString(Args)
3120 << MSCompatibilityVersion->getValue();
3121 return MSVT;
3122 }
3123
3124 if (MSCVersion) {
3125 unsigned Version = 0;
3126 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3127 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3128 << MSCVersion->getValue();
3129 return getMSCompatibilityVersion(Version);
3130 }
3131
3132 unsigned Major, Minor, Micro;
3133 Triple.getEnvironmentVersion(Major, Minor, Micro);
3134 if (Major || Minor || Micro)
3135 return VersionTuple(Major, Minor, Micro);
3136
3137 return VersionTuple(18);
3138 }
3139 return VersionTuple();
3140}
3141
Diego Novilloa0545962015-07-10 18:00:07 +00003142static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3143 const InputInfo &Output, const ArgList &Args,
3144 ArgStringList &CmdArgs) {
3145 auto *ProfileGenerateArg = Args.getLastArg(
3146 options::OPT_fprofile_instr_generate,
3147 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003148 options::OPT_fprofile_generate_EQ,
3149 options::OPT_fno_profile_instr_generate);
3150 if (ProfileGenerateArg &&
3151 ProfileGenerateArg->getOption().matches(
3152 options::OPT_fno_profile_instr_generate))
3153 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003154
3155 auto *ProfileUseArg = Args.getLastArg(
3156 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003157 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3158 options::OPT_fno_profile_instr_use);
3159 if (ProfileUseArg &&
3160 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3161 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003162
3163 if (ProfileGenerateArg && ProfileUseArg)
3164 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003165 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003166
Diego Novillo758f3f52015-08-05 21:49:51 +00003167 if (ProfileGenerateArg) {
3168 if (ProfileGenerateArg->getOption().matches(
3169 options::OPT_fprofile_instr_generate_EQ))
3170 ProfileGenerateArg->render(Args, CmdArgs);
3171 else if (ProfileGenerateArg->getOption().matches(
3172 options::OPT_fprofile_generate_EQ)) {
3173 SmallString<128> Path(ProfileGenerateArg->getValue());
3174 llvm::sys::path::append(Path, "default.profraw");
3175 CmdArgs.push_back(
3176 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3177 } else
3178 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3179 }
Diego Novilloa0545962015-07-10 18:00:07 +00003180
Diego Novillo758f3f52015-08-05 21:49:51 +00003181 if (ProfileUseArg) {
3182 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3183 ProfileUseArg->render(Args, CmdArgs);
3184 else if ((ProfileUseArg->getOption().matches(
3185 options::OPT_fprofile_use_EQ) ||
3186 ProfileUseArg->getOption().matches(
3187 options::OPT_fprofile_instr_use))) {
3188 SmallString<128> Path(
3189 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3190 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3191 llvm::sys::path::append(Path, "default.profdata");
3192 CmdArgs.push_back(
3193 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3194 }
Diego Novilloa0545962015-07-10 18:00:07 +00003195 }
3196
3197 if (Args.hasArg(options::OPT_ftest_coverage) ||
3198 Args.hasArg(options::OPT_coverage))
3199 CmdArgs.push_back("-femit-coverage-notes");
3200 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3201 false) ||
3202 Args.hasArg(options::OPT_coverage))
3203 CmdArgs.push_back("-femit-coverage-data");
3204
Diego Novilloc4b94da2015-08-05 23:27:40 +00003205 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3206 options::OPT_fno_coverage_mapping, false) &&
3207 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003208 D.Diag(diag::err_drv_argument_only_allowed_with)
3209 << "-fcoverage-mapping"
3210 << "-fprofile-instr-generate";
3211
Diego Novilloc4b94da2015-08-05 23:27:40 +00003212 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3213 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003214 CmdArgs.push_back("-fcoverage-mapping");
3215
3216 if (C.getArgs().hasArg(options::OPT_c) ||
3217 C.getArgs().hasArg(options::OPT_S)) {
3218 if (Output.isFilename()) {
3219 CmdArgs.push_back("-coverage-file");
3220 SmallString<128> CoverageFilename;
3221 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3222 CoverageFilename = FinalOutput->getValue();
3223 } else {
3224 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3225 }
3226 if (llvm::sys::path::is_relative(CoverageFilename)) {
3227 SmallString<128> Pwd;
3228 if (!llvm::sys::fs::current_path(Pwd)) {
3229 llvm::sys::path::append(Pwd, CoverageFilename);
3230 CoverageFilename.swap(Pwd);
3231 }
3232 }
3233 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3234 }
3235 }
3236}
3237
Paul Robinsond083b9a2015-12-16 17:25:27 +00003238static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3239 ArgStringList &CmdArgs) {
3240 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3241 false) ||
3242 Args.hasFlag(options::OPT_fprofile_generate,
3243 options::OPT_fno_profile_instr_generate, false) ||
3244 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3245 options::OPT_fno_profile_instr_generate, false) ||
3246 Args.hasFlag(options::OPT_fprofile_instr_generate,
3247 options::OPT_fno_profile_instr_generate, false) ||
3248 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3249 options::OPT_fno_profile_instr_generate, false) ||
3250 Args.hasArg(options::OPT_fcreate_profile) ||
3251 Args.hasArg(options::OPT_coverage)))
3252 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3253}
3254
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003255/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3256/// smooshes them together with platform defaults, to decide whether
3257/// this compile should be using PIC mode or not. Returns a tuple of
3258/// (RelocationModel, PICLevel, IsPIE).
3259static std::tuple<llvm::Reloc::Model, unsigned, bool>
3260ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3261 const ArgList &Args) {
3262 // FIXME: why does this code...and so much everywhere else, use both
3263 // ToolChain.getTriple() and Triple?
3264 bool PIE = ToolChain.isPIEDefault();
3265 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003266 // The Darwin default to use PIC does not apply when using -static.
3267 if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
3268 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003269 bool IsPICLevelTwo = PIC;
3270
3271 bool KernelOrKext =
3272 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3273
3274 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003275 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003276 switch (ToolChain.getArch()) {
3277 case llvm::Triple::arm:
3278 case llvm::Triple::armeb:
3279 case llvm::Triple::thumb:
3280 case llvm::Triple::thumbeb:
3281 case llvm::Triple::aarch64:
3282 case llvm::Triple::mips:
3283 case llvm::Triple::mipsel:
3284 case llvm::Triple::mips64:
3285 case llvm::Triple::mips64el:
3286 PIC = true; // "-fpic"
3287 break;
3288
3289 case llvm::Triple::x86:
3290 case llvm::Triple::x86_64:
3291 PIC = true; // "-fPIC"
3292 IsPICLevelTwo = true;
3293 break;
3294
3295 default:
3296 break;
3297 }
3298 }
3299
3300 // OpenBSD-specific defaults for PIE
3301 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3302 switch (ToolChain.getArch()) {
3303 case llvm::Triple::mips64:
3304 case llvm::Triple::mips64el:
3305 case llvm::Triple::sparcel:
3306 case llvm::Triple::x86:
3307 case llvm::Triple::x86_64:
3308 IsPICLevelTwo = false; // "-fpie"
3309 break;
3310
3311 case llvm::Triple::ppc:
3312 case llvm::Triple::sparc:
3313 case llvm::Triple::sparcv9:
3314 IsPICLevelTwo = true; // "-fPIE"
3315 break;
3316
3317 default:
3318 break;
3319 }
3320 }
3321
3322 // The last argument relating to either PIC or PIE wins, and no
3323 // other argument is used. If the last argument is any flavor of the
3324 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3325 // option implicitly enables PIC at the same level.
3326 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3327 options::OPT_fpic, options::OPT_fno_pic,
3328 options::OPT_fPIE, options::OPT_fno_PIE,
3329 options::OPT_fpie, options::OPT_fno_pie);
3330 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3331 // is forced, then neither PIC nor PIE flags will have no effect.
3332 if (!ToolChain.isPICDefaultForced()) {
3333 if (LastPICArg) {
3334 Option O = LastPICArg->getOption();
3335 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3336 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3337 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3338 PIC =
3339 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3340 IsPICLevelTwo =
3341 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3342 } else {
3343 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003344 if (Triple.isPS4CPU()) {
3345 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3346 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3347 if (Model != "kernel") {
3348 PIC = true;
3349 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3350 << LastPICArg->getSpelling();
3351 }
3352 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003353 }
3354 }
3355 }
3356
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003357 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3358 // PIC level would've been set to level 1, force it back to level 2 PIC
3359 // instead.
3360 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003361 IsPICLevelTwo |= ToolChain.isPICDefault();
3362
James Y Knightc4015d32015-08-21 04:14:55 +00003363 // This kernel flags are a trump-card: they will disable PIC/PIE
3364 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003365 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3366 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003367 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003368
3369 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3370 // This is a very special mode. It trumps the other modes, almost no one
3371 // uses it, and it isn't even valid on any OS but Darwin.
3372 if (!ToolChain.getTriple().isOSDarwin())
3373 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3374 << A->getSpelling() << ToolChain.getTriple().str();
3375
3376 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3377
3378 // Only a forced PIC mode can cause the actual compile to have PIC defines
3379 // etc., no flags are sufficient. This behavior was selected to closely
3380 // match that of llvm-gcc and Apple GCC before that.
3381 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3382
3383 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3384 }
3385
3386 if (PIC)
3387 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3388
3389 return std::make_tuple(llvm::Reloc::Static, 0, false);
3390}
3391
3392static const char *RelocationModelName(llvm::Reloc::Model Model) {
3393 switch (Model) {
3394 case llvm::Reloc::Default:
3395 return nullptr;
3396 case llvm::Reloc::Static:
3397 return "static";
3398 case llvm::Reloc::PIC_:
3399 return "pic";
3400 case llvm::Reloc::DynamicNoPIC:
3401 return "dynamic-no-pic";
3402 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003403 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003404}
3405
3406static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3407 ArgStringList &CmdArgs) {
3408 llvm::Reloc::Model RelocationModel;
3409 unsigned PICLevel;
3410 bool IsPIE;
3411 std::tie(RelocationModel, PICLevel, IsPIE) =
3412 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3413
3414 if (RelocationModel != llvm::Reloc::Static)
3415 CmdArgs.push_back("-KPIC");
3416}
3417
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003418void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003419 const InputInfo &Output, const InputInfoList &Inputs,
3420 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003421 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3422 const llvm::Triple Triple(TripleStr);
3423
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003424 bool KernelOrKext =
3425 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003426 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003427 ArgStringList CmdArgs;
3428
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003429 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003430 bool IsWindowsCygnus =
3431 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003432 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003433 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003434
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003435 // Check number of inputs for sanity. We need at least one input.
3436 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003437 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003438 // CUDA compilation may have multiple inputs (source file + results of
3439 // device-side compilations). All other jobs are expected to have exactly one
3440 // input.
3441 bool IsCuda = types::isCuda(Input.getType());
3442 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003443
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003444 // Invoke ourselves in -cc1 mode.
3445 //
3446 // FIXME: Implement custom jobs for internal actions.
3447 CmdArgs.push_back("-cc1");
3448
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003449 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003450 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003451 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003452
Artem Belevichfa11ab52015-11-17 22:28:46 +00003453 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003454 if (IsCuda) {
3455 // FIXME: We need a (better) way to pass information about
3456 // particular compilation pass we're constructing here. For now we
3457 // can check which toolchain we're using and pick the other one to
3458 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003459 if (&getToolChain() == C.getCudaDeviceToolChain())
3460 AuxToolChain = C.getCudaHostToolChain();
3461 else if (&getToolChain() == C.getCudaHostToolChain())
3462 AuxToolChain = C.getCudaDeviceToolChain();
3463 else
3464 llvm_unreachable("Can't figure out CUDA compilation mode.");
3465 assert(AuxToolChain != nullptr && "No aux toolchain.");
3466 CmdArgs.push_back("-aux-triple");
3467 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003468 CmdArgs.push_back("-fcuda-target-overloads");
3469 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003470 }
3471
James Y Knight2db38f32015-08-15 03:45:25 +00003472 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3473 Triple.getArch() == llvm::Triple::thumb)) {
3474 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003475 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003476 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003477 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003478 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003479 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003480 }
3481
Tim Northover336f1892014-03-29 13:16:12 +00003482 // Push all default warning arguments that are specific to
3483 // the given target. These come before user provided warning options
3484 // are provided.
3485 getToolChain().addClangWarningOptions(CmdArgs);
3486
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003487 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003488 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003489
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003490 if (isa<AnalyzeJobAction>(JA)) {
3491 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3492 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003493 } else if (isa<MigrateJobAction>(JA)) {
3494 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003495 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003496 if (Output.getType() == types::TY_Dependencies)
3497 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003498 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003499 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003500 if (Args.hasArg(options::OPT_rewrite_objc) &&
3501 !Args.hasArg(options::OPT_g_Group))
3502 CmdArgs.push_back("-P");
3503 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003504 } else if (isa<AssembleJobAction>(JA)) {
3505 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003506
David Blaikie9260ed62013-07-25 21:19:01 +00003507 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003508
3509 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003510 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003511 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003512 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003513 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003514
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003515 if (JA.getType() == types::TY_Nothing)
3516 CmdArgs.push_back("-fsyntax-only");
3517 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003518 CmdArgs.push_back("-emit-pch");
3519 else
3520 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003521 } else if (isa<VerifyPCHJobAction>(JA)) {
3522 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003523 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003524 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3525 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003526 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003527 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003528 } else if (JA.getType() == types::TY_LLVM_IR ||
3529 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003530 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003531 } else if (JA.getType() == types::TY_LLVM_BC ||
3532 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003533 CmdArgs.push_back("-emit-llvm-bc");
3534 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003535 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003536 } else if (JA.getType() == types::TY_AST) {
3537 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003538 } else if (JA.getType() == types::TY_ModuleFile) {
3539 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003540 } else if (JA.getType() == types::TY_RewrittenObjC) {
3541 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003542 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003543 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3544 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003545 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003546 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003548 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003549
3550 // Preserve use-list order by default when emitting bitcode, so that
3551 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3552 // same result as running passes here. For LTO, we don't need to preserve
3553 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003554 if (JA.getType() == types::TY_LLVM_BC)
3555 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003556
3557 if (D.isUsingLTO())
3558 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003559 }
3560
Teresa Johnsonaff22322015-12-07 19:21:34 +00003561 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3562 if (!types::isLLVMIR(Input.getType()))
3563 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3564 << "-x ir";
3565 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3566 }
3567
Justin Bognera88f0122014-06-20 22:59:50 +00003568 // We normally speed up the clang process a bit by skipping destructors at
3569 // exit, but when we're generating diagnostics we can rely on some of the
3570 // cleanup.
3571 if (!C.isForDiagnostics())
3572 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003574// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003575#ifdef NDEBUG
3576 CmdArgs.push_back("-disable-llvm-verifier");
3577#endif
3578
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003579 // Set the main file name, so that debug info works even with
3580 // -save-temps.
3581 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003582 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003583
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003584 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003585 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003586 if (Args.hasArg(options::OPT_static))
3587 CmdArgs.push_back("-static-define");
3588
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003589 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003590 // Enable region store model by default.
3591 CmdArgs.push_back("-analyzer-store=region");
3592
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003593 // Treat blocks as analysis entry points.
3594 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3595
Ted Kremenek49c79792011-03-24 00:28:47 +00003596 CmdArgs.push_back("-analyzer-eagerly-assume");
3597
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003598 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003599 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003600 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003601
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003602 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003603 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003604
Sean Evesonb38c32b2016-01-06 10:03:58 +00003605 // Disable some unix checkers for PS4.
3606 if (IsPS4CPU) {
3607 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3608 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3609 }
3610
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003611 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003612 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003614 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003615
Artem Belevichba558952015-05-06 18:20:23 +00003616 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003617 CmdArgs.push_back("-analyzer-checker=cplusplus");
3618
Sean Evesonb38c32b2016-01-06 10:03:58 +00003619 if (!IsPS4CPU) {
3620 CmdArgs.push_back(
3621 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3622 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3623 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3624 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3625 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3627 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003628
3629 // Default nullability checks.
3630 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3631 CmdArgs.push_back(
3632 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003633 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003634
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003635 // Set the output format. The default is plist, for (lame) historical
3636 // reasons.
3637 CmdArgs.push_back("-analyzer-output");
3638 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003639 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003640 else
3641 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003642
Ted Kremenekfe449a22010-03-22 22:32:05 +00003643 // Disable the presentation of standard compiler warnings when
3644 // using --analyze. We only want to show static analyzer diagnostics
3645 // or frontend errors.
3646 CmdArgs.push_back("-w");
3647
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003648 // Add -Xanalyzer arguments when running as analyzer.
3649 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003650 }
3651
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003652 CheckCodeGenerationOptions(D, Args);
3653
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003654 llvm::Reloc::Model RelocationModel;
3655 unsigned PICLevel;
3656 bool IsPIE;
3657 std::tie(RelocationModel, PICLevel, IsPIE) =
3658 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003659
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003660 const char *RMName = RelocationModelName(RelocationModel);
3661 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003662 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003663 CmdArgs.push_back(RMName);
3664 }
3665 if (PICLevel > 0) {
3666 CmdArgs.push_back("-pic-level");
3667 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3668 if (IsPIE) {
3669 CmdArgs.push_back("-pie-level");
3670 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003671 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003672 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003673
Renato Golin4854d802015-11-09 12:40:41 +00003674 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3675 CmdArgs.push_back("-meabi");
3676 CmdArgs.push_back(A->getValue());
3677 }
3678
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003679 CmdArgs.push_back("-mthread-model");
3680 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3681 CmdArgs.push_back(A->getValue());
3682 else
3683 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3684
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003685 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3686
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003687 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3688 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003689 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003690
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003691 // LLVM Code Generator Options.
3692
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003693 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3694 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003695 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3696 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003697 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003698 CmdArgs.push_back(A->getValue());
3699 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003700 }
3701 }
3702
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003703 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3704 StringRef v = A->getValue();
3705 CmdArgs.push_back("-mllvm");
3706 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3707 A->claim();
3708 }
3709
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003710 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3711 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003712 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003713 }
3714
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003715 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3716 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003717 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003718 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003719 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003720 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3721 CmdArgs.push_back("-fpcc-struct-return");
3722 } else {
3723 assert(A->getOption().matches(options::OPT_freg_struct_return));
3724 CmdArgs.push_back("-freg-struct-return");
3725 }
3726 }
3727
Roman Divacky65b88cd2011-03-01 17:40:53 +00003728 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3729 CmdArgs.push_back("-mrtd");
3730
Rafael Espindola224dd632011-12-14 21:02:23 +00003731 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003732 CmdArgs.push_back("-mdisable-fp-elim");
3733 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3734 options::OPT_fno_zero_initialized_in_bss))
3735 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003736
3737 bool OFastEnabled = isOptimizationLevelFast(Args);
3738 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3739 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003740 OptSpecifier StrictAliasingAliasOption =
3741 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003742 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3743 // doesn't do any TBAA.
3744 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003745 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003746 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003747 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003748 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3749 options::OPT_fno_struct_path_tbaa))
3750 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003751 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3752 false))
3753 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003754 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3755 options::OPT_fno_strict_vtable_pointers,
3756 false))
3757 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003758 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3759 options::OPT_fno_optimize_sibling_calls))
3760 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003761
Eric Christopher006208c2013-04-04 06:29:47 +00003762 // Handle segmented stacks.
3763 if (Args.hasArg(options::OPT_fsplit_stack))
3764 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003765
3766 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3767 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003768 OptSpecifier FastMathAliasOption =
3769 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3770
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003771 // Handle various floating point optimization flags, mapping them to the
3772 // appropriate LLVM code generation flags. The pattern for all of these is to
3773 // default off the codegen optimizations, and if any flag enables them and no
3774 // flag disables them after the flag enabling them, enable the codegen
3775 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003776 if (Arg *A = Args.getLastArg(
3777 options::OPT_ffast_math, FastMathAliasOption,
3778 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3779 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3780 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003781 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3782 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003783 A->getOption().getID() != options::OPT_fhonor_infinities)
3784 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 if (Arg *A = Args.getLastArg(
3786 options::OPT_ffast_math, FastMathAliasOption,
3787 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3788 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3789 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003790 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3791 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003792 A->getOption().getID() != options::OPT_fhonor_nans)
3793 CmdArgs.push_back("-menable-no-nans");
3794
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003795 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3796 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797 if (Arg *A =
3798 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3799 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3800 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003801 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3802 // However, turning *off* -ffast_math merely restores the toolchain default
3803 // (which may be false).
3804 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3805 A->getOption().getID() == options::OPT_ffast_math ||
3806 A->getOption().getID() == options::OPT_Ofast)
3807 MathErrno = false;
3808 else if (A->getOption().getID() == options::OPT_fmath_errno)
3809 MathErrno = true;
3810 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003811 if (MathErrno)
3812 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003813
3814 // There are several flags which require disabling very specific
3815 // optimizations. Any of these being disabled forces us to turn off the
3816 // entire set of LLVM optimizations, so collect them through all the flag
3817 // madness.
3818 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003819 if (Arg *A = Args.getLastArg(
3820 options::OPT_ffast_math, FastMathAliasOption,
3821 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3822 options::OPT_fno_unsafe_math_optimizations,
3823 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003824 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3825 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003826 A->getOption().getID() != options::OPT_fno_associative_math)
3827 AssociativeMath = true;
3828 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829 if (Arg *A = Args.getLastArg(
3830 options::OPT_ffast_math, FastMathAliasOption,
3831 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3832 options::OPT_fno_unsafe_math_optimizations,
3833 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003834 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3835 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003836 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3837 ReciprocalMath = true;
3838 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839 if (Arg *A = Args.getLastArg(
3840 options::OPT_ffast_math, FastMathAliasOption,
3841 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3842 options::OPT_fno_unsafe_math_optimizations,
3843 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003844 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3845 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003846 A->getOption().getID() != options::OPT_fsigned_zeros)
3847 SignedZeros = false;
3848 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003849 if (Arg *A = Args.getLastArg(
3850 options::OPT_ffast_math, FastMathAliasOption,
3851 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3852 options::OPT_fno_unsafe_math_optimizations,
3853 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003854 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3855 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003856 A->getOption().getID() != options::OPT_ftrapping_math)
3857 TrappingMath = false;
3858 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3859 !TrappingMath)
3860 CmdArgs.push_back("-menable-unsafe-fp-math");
3861
Sanjay Patel76c9e092015-01-23 16:40:50 +00003862 if (!SignedZeros)
3863 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003864
Sanjay Patel359b1052015-04-09 15:03:23 +00003865 if (ReciprocalMath)
3866 CmdArgs.push_back("-freciprocal-math");
3867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003869 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003870 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003871 options::OPT_ffp_contract)) {
3872 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003873 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003874 if (Val == "fast" || Val == "on" || Val == "off") {
3875 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3876 } else {
3877 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003878 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003879 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003880 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3881 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003882 // If fast-math is set then set the fp-contract mode to fast.
3883 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3884 }
3885 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003886
Sanjay Patel2987c292015-06-11 14:53:41 +00003887 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003888
Bob Wilson6a039162012-07-19 03:52:53 +00003889 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3890 // and if we find them, tell the frontend to provide the appropriate
3891 // preprocessor macros. This is distinct from enabling any optimizations as
3892 // these options induce language changes which must survive serialization
3893 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003894 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3895 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003896 if (!A->getOption().matches(options::OPT_fno_fast_math))
3897 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003898 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3899 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003900 if (A->getOption().matches(options::OPT_ffinite_math_only))
3901 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003902
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003903 // Decide whether to use verbose asm. Verbose assembly is the default on
3904 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003905 bool IsIntegratedAssemblerDefault =
3906 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003907 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003908 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003909 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003910 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003911
Rafael Espindolab8a12932015-05-22 20:44:03 +00003912 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3913 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003914 CmdArgs.push_back("-no-integrated-as");
3915
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003916 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3917 CmdArgs.push_back("-mdebug-pass");
3918 CmdArgs.push_back("Structure");
3919 }
3920 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3921 CmdArgs.push_back("-mdebug-pass");
3922 CmdArgs.push_back("Arguments");
3923 }
3924
John McCall8517abc2010-02-19 02:45:38 +00003925 // Enable -mconstructor-aliases except on darwin, where we have to
3926 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003927 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003928 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003929
John McCall7ef5cb32011-03-18 02:56:14 +00003930 // Darwin's kernel doesn't support guard variables; just die if we
3931 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003932 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003933 CmdArgs.push_back("-fforbid-guard-variables");
3934
Akira Hatanaka02028482015-11-12 17:21:22 +00003935 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3936 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003937 CmdArgs.push_back("-mms-bitfields");
3938 }
John McCall8517abc2010-02-19 02:45:38 +00003939
Daniel Dunbar306945d2009-09-16 06:17:29 +00003940 // This is a coarse approximation of what llvm-gcc actually does, both
3941 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3942 // complicated ways.
3943 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003944 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3945 options::OPT_fno_asynchronous_unwind_tables,
3946 (getToolChain().IsUnwindTablesDefault() ||
3947 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3948 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003949 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3950 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003951 CmdArgs.push_back("-munwind-tables");
3952
Chandler Carruth05fb5852012-11-21 23:40:23 +00003953 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003954
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003955 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3956 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003957 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003958 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003959
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003960 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003962
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003963 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003964 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003965 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003966 }
3967
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003968 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003969 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003970 if (!CPU.empty()) {
3971 CmdArgs.push_back("-target-cpu");
3972 CmdArgs.push_back(Args.MakeArgString(CPU));
3973 }
3974
Rafael Espindolaeb265472013-08-21 21:59:03 +00003975 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3976 CmdArgs.push_back("-mfpmath");
3977 CmdArgs.push_back(A->getValue());
3978 }
3979
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003980 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003981 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003982
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003983 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003984 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003985 default:
3986 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003987
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003988 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003989 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003990 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003991 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003992 // Use the effective triple, which takes into account the deployment target.
3993 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003994 break;
3995
Tim Northover573cbee2014-05-24 12:52:07 +00003996 case llvm::Triple::aarch64:
3997 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003998 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003999 break;
4000
Eric Christopher0b26a612010-03-02 02:41:08 +00004001 case llvm::Triple::mips:
4002 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004003 case llvm::Triple::mips64:
4004 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004005 AddMIPSTargetArgs(Args, CmdArgs);
4006 break;
4007
Ulrich Weigand8afad612014-07-28 13:17:52 +00004008 case llvm::Triple::ppc:
4009 case llvm::Triple::ppc64:
4010 case llvm::Triple::ppc64le:
4011 AddPPCTargetArgs(Args, CmdArgs);
4012 break;
4013
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004014 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004015 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004016 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004017 AddSparcTargetArgs(Args, CmdArgs);
4018 break;
4019
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004020 case llvm::Triple::x86:
4021 case llvm::Triple::x86_64:
4022 AddX86TargetArgs(Args, CmdArgs);
4023 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004024
4025 case llvm::Triple::hexagon:
4026 AddHexagonTargetArgs(Args, CmdArgs);
4027 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004028
4029 case llvm::Triple::wasm32:
4030 case llvm::Triple::wasm64:
4031 AddWebAssemblyTargetArgs(Args, CmdArgs);
4032 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004033 }
4034
Douglas Katzman3459ce22015-10-08 04:24:12 +00004035 // The 'g' groups options involve a somewhat intricate sequence of decisions
4036 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004037 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004038 // * what level of debug info to generate
4039 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004040 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004041 // This avoids having to monkey around further in cc1 other than to disable
4042 // codeview if not running in a Windows environment. Perhaps even that
4043 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004044 unsigned DwarfVersion = 0;
4045 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4046 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004047 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4048 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004049 bool EmitCodeView = false;
4050
Hans Wennborg75958c42013-08-08 00:17:41 +00004051 // Add clang-cl arguments.
4052 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004053 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004054
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004055 // Pass the linker version in use.
4056 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4057 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004058 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004059 }
4060
Eric Christopherb7d97e92013-04-03 01:58:53 +00004061 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004062 CmdArgs.push_back("-momit-leaf-frame-pointer");
4063
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004064 // Explicitly error on some things we know we don't support and can't just
4065 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004066 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004067 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4068 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004069 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004070 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004071 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4072 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004073 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004074 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004075 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004076 }
4077
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004078 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004079 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004080 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004081 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004082 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4083 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004084 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004085 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004086 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004087
Chad Rosierbe10f982011-08-02 17:58:04 +00004088 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004089 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004090 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4091 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004092 }
4093
Rafael Espindola08a692a2010-03-07 04:46:18 +00004094 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004095 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004096 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004097 // If the last option explicitly specified a debug-info level, use it.
4098 if (A->getOption().matches(options::OPT_gN_Group)) {
4099 DebugInfoKind = DebugLevelToInfoKind(*A);
4100 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4101 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4102 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4103 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4104 A->getIndex() > SplitDwarfArg->getIndex())
4105 SplitDwarfArg = nullptr;
4106 } else
4107 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004108 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004109 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004110
Paul Robinson0334a042015-12-19 19:41:48 +00004111 // If a debugger tuning argument appeared, remember it.
4112 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4113 options::OPT_ggdbN_Group)) {
4114 if (A->getOption().matches(options::OPT_glldb))
4115 DebuggerTuning = llvm::DebuggerKind::LLDB;
4116 else if (A->getOption().matches(options::OPT_gsce))
4117 DebuggerTuning = llvm::DebuggerKind::SCE;
4118 else
4119 DebuggerTuning = llvm::DebuggerKind::GDB;
4120 }
4121
4122 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004123 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004124 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004125 DwarfVersion = DwarfVersionNum(A->getSpelling());
4126
Reid Kleckner124955a2015-08-05 18:51:13 +00004127 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004128 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4129 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4130 // DwarfVersion remains at 0 if no explicit choice was made.
4131 CmdArgs.push_back("-gcodeview");
4132 } else if (DwarfVersion == 0 &&
4133 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4134 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4135 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004136
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004137 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4138 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004139
4140 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004141 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004142 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004143 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004144
Eric Christopher138c32b2013-09-13 22:37:55 +00004145 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004146 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004147 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004148 CmdArgs.push_back("-dwarf-ext-refs");
4149 CmdArgs.push_back("-fmodule-format=obj");
4150 }
4151
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004152 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4153 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004154 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004155 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004156 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004157 CmdArgs.push_back("-backend-option");
4158 CmdArgs.push_back("-split-dwarf=Enable");
4159 }
4160
Douglas Katzman3459ce22015-10-08 04:24:12 +00004161 // After we've dealt with all combinations of things that could
4162 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4163 // figure out if we need to "upgrade" it to standalone debug info.
4164 // We parse these two '-f' options whether or not they will be used,
4165 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4166 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4167 options::OPT_fno_standalone_debug,
4168 getToolChain().GetDefaultStandaloneDebug());
4169 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4170 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004171 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4172 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004173
Eric Christopher138c32b2013-09-13 22:37:55 +00004174 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4175 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4176 CmdArgs.push_back("-backend-option");
4177 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4178 }
Eric Christophereec89c22013-06-18 00:03:50 +00004179
Eric Christopher0d403d22014-02-14 01:27:03 +00004180 // -gdwarf-aranges turns on the emission of the aranges section in the
4181 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004182 // Always enabled on the PS4.
4183 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004184 CmdArgs.push_back("-backend-option");
4185 CmdArgs.push_back("-generate-arange-section");
4186 }
4187
David Blaikief36d9ba2014-01-27 18:52:43 +00004188 if (Args.hasFlag(options::OPT_fdebug_types_section,
4189 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004190 CmdArgs.push_back("-backend-option");
4191 CmdArgs.push_back("-generate-type-units");
4192 }
Eric Christophereec89c22013-06-18 00:03:50 +00004193
Dan Gohmana5b804b2016-01-07 00:50:27 +00004194 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4195 // default.
4196 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4197 Triple.getArch() == llvm::Triple::wasm32 ||
4198 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004199
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004200 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004201 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004202 CmdArgs.push_back("-ffunction-sections");
4203 }
4204
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004205 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4206 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004207 CmdArgs.push_back("-fdata-sections");
4208 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004209
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004210 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004211 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004212 CmdArgs.push_back("-fno-unique-section-names");
4213
Chris Lattner3c77a352010-06-22 00:03:40 +00004214 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4215
Diego Novilloa0545962015-07-10 18:00:07 +00004216 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004217
Paul Robinsond083b9a2015-12-16 17:25:27 +00004218 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4219 if (getToolChain().getTriple().isPS4CPU())
4220 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4221
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004222 // Pass options for controlling the default header search paths.
4223 if (Args.hasArg(options::OPT_nostdinc)) {
4224 CmdArgs.push_back("-nostdsysteminc");
4225 CmdArgs.push_back("-nobuiltininc");
4226 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004227 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004228 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004229 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4230 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4231 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004232
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004233 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004234 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004235 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004236
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004237 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4238
Ted Kremenekf7639e12012-03-06 20:06:33 +00004239 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004240 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004241 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004242 options::OPT_ccc_arcmt_modify,
4243 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004244 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004245 switch (A->getOption().getID()) {
4246 default:
4247 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004248 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004249 CmdArgs.push_back("-arcmt-check");
4250 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004251 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004252 CmdArgs.push_back("-arcmt-modify");
4253 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004254 case options::OPT_ccc_arcmt_migrate:
4255 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004256 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004257 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004258
4259 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4260 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004261 break;
John McCalld70fb982011-06-15 23:25:17 +00004262 }
4263 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004264 } else {
4265 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4266 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4267 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004268 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004269
Ted Kremenekf7639e12012-03-06 20:06:33 +00004270 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4271 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4273 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004274 }
4275 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004276 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004277
4278 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004279 options::OPT_objcmt_migrate_subscripting,
4280 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004281 // None specified, means enable them all.
4282 CmdArgs.push_back("-objcmt-migrate-literals");
4283 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004284 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004285 } else {
4286 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4287 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004288 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004289 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004290 } else {
4291 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4292 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4293 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4294 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4295 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4296 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004297 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004298 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4299 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4300 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4301 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4302 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4303 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4304 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004305 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004306 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004307 }
4308
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004309 // Add preprocessing options like -I, -D, etc. if we are using the
4310 // preprocessor.
4311 //
4312 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004313 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004314 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4315 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004316
Rafael Espindolaa7431922011-07-21 23:40:37 +00004317 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4318 // that "The compiler can only warn and ignore the option if not recognized".
4319 // When building with ccache, it will pass -D options to clang even on
4320 // preprocessed inputs and configure concludes that -fPIC is not supported.
4321 Args.ClaimAllArgs(options::OPT_D);
4322
Alp Toker7874bdc2013-11-15 20:40:58 +00004323 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004324 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4325 if (A->getOption().matches(options::OPT_O4)) {
4326 CmdArgs.push_back("-O3");
4327 D.Diag(diag::warn_O4_is_O3);
4328 } else {
4329 A->render(Args, CmdArgs);
4330 }
4331 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004332
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004333 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004334 for (const Arg *A :
4335 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4336 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004337 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004338 }
4339
Rafael Espindola577637a2015-01-03 00:06:04 +00004340 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004341
Richard Smith3be1cb22014-08-07 00:24:21 +00004342 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004343 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004344 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4345 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004346 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004347 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004348
4349 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004350 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004351 //
4352 // If a std is supplied, only add -trigraphs if it follows the
4353 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004354 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004355 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4356 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004357 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004358 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004359 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004360 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004361 else
4362 Std->render(Args, CmdArgs);
4363
Nico Weber00721502014-12-23 22:32:37 +00004364 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004365 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004366 options::OPT_ftrigraphs,
4367 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004368 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004369 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004370 } else {
4371 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004372 //
4373 // FIXME: Clang doesn't correctly handle -std= when the input language
4374 // doesn't match. For the time being just ignore this for C++ inputs;
4375 // eventually we want to do all the standard defaulting here instead of
4376 // splitting it between the driver and clang -cc1.
4377 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004378 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4379 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004380 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004381 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004382
Nico Weber00721502014-12-23 22:32:37 +00004383 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4384 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004385 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004386
Richard Smith282b4492013-09-04 22:50:31 +00004387 // GCC's behavior for -Wwrite-strings is a bit strange:
4388 // * In C, this "warning flag" changes the types of string literals from
4389 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4390 // for the discarded qualifier.
4391 // * In C++, this is just a normal warning flag.
4392 //
4393 // Implementing this warning correctly in C is hard, so we follow GCC's
4394 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4395 // a non-const char* in C, rather than using this crude hack.
4396 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004397 // FIXME: This should behave just like a warning flag, and thus should also
4398 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4399 Arg *WriteStrings =
4400 Args.getLastArg(options::OPT_Wwrite_strings,
4401 options::OPT_Wno_write_strings, options::OPT_w);
4402 if (WriteStrings &&
4403 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004404 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004405 }
4406
Chandler Carruth61fbf622011-04-23 09:27:53 +00004407 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004408 // during C++ compilation, which it is by default. GCC keeps this define even
4409 // in the presence of '-w', match this behavior bug-for-bug.
4410 if (types::isCXX(InputType) &&
4411 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4412 true)) {
4413 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004414 }
4415
Chandler Carruthe0391482010-05-22 02:21:53 +00004416 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4417 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4418 if (Asm->getOption().matches(options::OPT_fasm))
4419 CmdArgs.push_back("-fgnu-keywords");
4420 else
4421 CmdArgs.push_back("-fno-gnu-keywords");
4422 }
4423
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004424 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4425 CmdArgs.push_back("-fno-dwarf-directory-asm");
4426
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004427 if (ShouldDisableAutolink(Args, getToolChain()))
4428 CmdArgs.push_back("-fno-autolink");
4429
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004430 // Add in -fdebug-compilation-dir if necessary.
4431 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004432
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004433 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4434 StringRef Map = A->getValue();
4435 if (Map.find('=') == StringRef::npos)
4436 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4437 else
4438 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4439 A->claim();
4440 }
4441
Richard Smith9a568822011-11-21 19:36:32 +00004442 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4443 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004444 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004445 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004446 }
4447
Richard Smith79c927b2013-11-06 19:31:51 +00004448 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4449 CmdArgs.push_back("-foperator-arrow-depth");
4450 CmdArgs.push_back(A->getValue());
4451 }
4452
Richard Smith9a568822011-11-21 19:36:32 +00004453 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4454 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004455 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004456 }
4457
Richard Smitha3d3bd22013-05-08 02:12:03 +00004458 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4459 CmdArgs.push_back("-fconstexpr-steps");
4460 CmdArgs.push_back(A->getValue());
4461 }
4462
Richard Smithb3a14522013-02-22 01:59:51 +00004463 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4464 CmdArgs.push_back("-fbracket-depth");
4465 CmdArgs.push_back(A->getValue());
4466 }
4467
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004468 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4469 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004470 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004471 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004472 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4473 } else
4474 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004475 }
4476
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004477 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004478 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004479
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004480 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4481 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004482 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004483 }
David Chisnall5778fce2009-08-31 16:41:57 +00004484
Chris Lattnere23003d2010-01-09 21:54:33 +00004485 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4486 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004487 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004488 }
4489
Chris Lattnerb35583d2010-04-07 20:49:23 +00004490 CmdArgs.push_back("-ferror-limit");
4491 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004492 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004493 else
4494 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004495
Chandler Carrutha77a7272010-05-06 04:55:18 +00004496 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4497 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004498 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004499 }
4500
4501 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4502 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004503 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004504 }
4505
Richard Smithf6f003a2011-12-16 19:06:07 +00004506 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4507 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004508 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004509 }
4510
Nick Lewycky24653262014-12-16 21:39:02 +00004511 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4512 CmdArgs.push_back("-fspell-checking-limit");
4513 CmdArgs.push_back(A->getValue());
4514 }
4515
Daniel Dunbar2c978472009-11-04 06:24:47 +00004516 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004517 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004518 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004519 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004520 } else {
4521 // If -fmessage-length=N was not specified, determine whether this is a
4522 // terminal and, if so, implicitly define -fmessage-length appropriately.
4523 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004524 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004525 }
4526
John McCallb4a99d32013-02-19 01:57:35 +00004527 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4528 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4529 options::OPT_fvisibility_ms_compat)) {
4530 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4531 CmdArgs.push_back("-fvisibility");
4532 CmdArgs.push_back(A->getValue());
4533 } else {
4534 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4535 CmdArgs.push_back("-fvisibility");
4536 CmdArgs.push_back("hidden");
4537 CmdArgs.push_back("-ftype-visibility");
4538 CmdArgs.push_back("default");
4539 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004540 }
4541
Douglas Gregor08329632010-06-15 17:05:35 +00004542 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004543
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004544 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4545
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004546 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004547 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4548 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004549 CmdArgs.push_back("-ffreestanding");
4550
Daniel Dunbare357d562009-12-03 18:42:11 +00004551 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004552 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004553 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004554 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004555 // Emulated TLS is enabled by default on Android, and can be enabled manually
4556 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004557 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004558 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4559 EmulatedTLSDefault))
4560 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004561 // AltiVec-like language extensions aren't relevant for assembling.
4562 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004563 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004564 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4565 }
Richard Trieu91844232012-06-26 18:18:47 +00004566 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4567 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004568
Alexey Bataevdb390212015-05-20 04:24:19 +00004569 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004570 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4571 options::OPT_fno_openmp, false))
4572 switch (getOpenMPRuntime(getToolChain(), Args)) {
4573 case OMPRT_OMP:
4574 case OMPRT_IOMP5:
4575 // Clang can generate useful OpenMP code for these two runtime libraries.
4576 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004577
4578 // If no option regarding the use of TLS in OpenMP codegeneration is
4579 // given, decide a default based on the target. Otherwise rely on the
4580 // options and pass the right information to the frontend.
4581 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004582 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004583 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004584 break;
4585 default:
4586 // By default, if Clang doesn't know how to generate useful OpenMP code
4587 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4588 // down to the actual compilation.
4589 // FIXME: It would be better to have a mode which *only* omits IR
4590 // generation based on the OpenMP support so that we get consistent
4591 // semantic analysis, etc.
4592 break;
4593 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004594
Peter Collingbourne32701642013-11-01 18:16:25 +00004595 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004596 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004597
Eric Christopher459d2712013-02-19 06:16:53 +00004598 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004599 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4600 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4601 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4602 Arch == llvm::Triple::ppc64le))
4603 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4604 << "ppc/ppc64/ppc64le";
4605 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004606
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004607 // -fzvector is incompatible with -faltivec.
4608 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4609 if (Args.hasArg(options::OPT_faltivec))
4610 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4611 << "-faltivec";
4612
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004613 if (getToolChain().SupportsProfiling())
4614 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004615
4616 // -flax-vector-conversions is default.
4617 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4618 options::OPT_fno_lax_vector_conversions))
4619 CmdArgs.push_back("-fno-lax-vector-conversions");
4620
John Brawna7b4ec02015-08-10 11:11:28 +00004621 if (Args.getLastArg(options::OPT_fapple_kext) ||
4622 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004623 CmdArgs.push_back("-fapple-kext");
4624
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004625 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004626 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004627 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004628 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4629 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004630
4631 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4632 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004633 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004634 }
4635
Bob Wilson14adb362012-02-03 06:27:22 +00004636 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004637
Chandler Carruth6e501032011-03-27 00:04:55 +00004638 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4639 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004640 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004641 if (A->getOption().matches(options::OPT_fwrapv))
4642 CmdArgs.push_back("-fwrapv");
4643 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4644 options::OPT_fno_strict_overflow)) {
4645 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4646 CmdArgs.push_back("-fwrapv");
4647 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004648
4649 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4650 options::OPT_fno_reroll_loops))
4651 if (A->getOption().matches(options::OPT_freroll_loops))
4652 CmdArgs.push_back("-freroll-loops");
4653
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004654 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004655 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4656 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004657
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004658 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4659
Daniel Dunbar4930e332009-11-17 08:07:36 +00004660 // -stack-protector=0 is default.
4661 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004662 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4663 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4664 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4665 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4666 Args.ClaimAllArgs(options::OPT_fstack_protector);
4667 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004668 options::OPT_fstack_protector_all,
4669 options::OPT_fstack_protector_strong,
4670 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004671 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004672 StackProtectorLevel = std::max<unsigned>(
4673 LangOptions::SSPOn,
4674 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004675 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004676 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004677 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004678 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004679 } else {
4680 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004681 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004682 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004683 if (StackProtectorLevel) {
4684 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004685 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004686 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004687
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004688 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004689 for (const Arg *A : Args.filtered(options::OPT__param)) {
4690 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004691 if (Str.startswith("ssp-buffer-size=")) {
4692 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004693 CmdArgs.push_back("-stack-protector-buffer-size");
4694 // FIXME: Verify the argument is a valid integer.
4695 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004696 }
Sean Silva14facf32015-06-09 01:57:17 +00004697 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004698 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004699 }
4700
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004701 // Translate -mstackrealign
4702 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004703 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004704 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004705
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004706 if (Args.hasArg(options::OPT_mstack_alignment)) {
4707 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4708 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004709 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004710
Hans Wennborg77dc2362015-01-20 19:45:50 +00004711 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4712 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4713
4714 if (!Size.empty())
4715 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4716 else
4717 CmdArgs.push_back("-mstack-probe-size=0");
4718 }
4719
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004720 switch (getToolChain().getArch()) {
4721 case llvm::Triple::aarch64:
4722 case llvm::Triple::aarch64_be:
4723 case llvm::Triple::arm:
4724 case llvm::Triple::armeb:
4725 case llvm::Triple::thumb:
4726 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004727 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004728 break;
4729
4730 default:
4731 break;
4732 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004733
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004734 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4735 options::OPT_mno_restrict_it)) {
4736 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4737 CmdArgs.push_back("-backend-option");
4738 CmdArgs.push_back("-arm-restrict-it");
4739 } else {
4740 CmdArgs.push_back("-backend-option");
4741 CmdArgs.push_back("-arm-no-restrict-it");
4742 }
James Y Knight2db38f32015-08-15 03:45:25 +00004743 } else if (Triple.isOSWindows() &&
4744 (Triple.getArch() == llvm::Triple::arm ||
4745 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004746 // Windows on ARM expects restricted IT blocks
4747 CmdArgs.push_back("-backend-option");
4748 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004749 }
4750
Daniel Dunbard18049a2009-04-07 21:16:11 +00004751 // Forward -f options with positive and negative forms; we translate
4752 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004753 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4754 StringRef fname = A->getValue();
4755 if (!llvm::sys::fs::exists(fname))
4756 D.Diag(diag::err_drv_no_such_file) << fname;
4757 else
4758 A->render(Args, CmdArgs);
4759 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004760
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004761 // -fbuiltin is default unless -mkernel is used.
4762 bool UseBuiltins =
4763 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4764 !Args.hasArg(options::OPT_mkernel));
4765 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004766 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004767
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004768 // -ffreestanding implies -fno-builtin.
4769 if (Args.hasArg(options::OPT_ffreestanding))
4770 UseBuiltins = false;
4771
4772 // Process the -fno-builtin-* options.
4773 for (const auto &Arg : Args) {
4774 const Option &O = Arg->getOption();
4775 if (!O.matches(options::OPT_fno_builtin_))
4776 continue;
4777
4778 Arg->claim();
4779 // If -fno-builtin is specified, then there's no need to pass the option to
4780 // the frontend.
4781 if (!UseBuiltins)
4782 continue;
4783
4784 StringRef FuncName = Arg->getValue();
4785 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4786 }
4787
Nuno Lopes13c88c72009-12-16 16:59:22 +00004788 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4789 options::OPT_fno_assume_sane_operator_new))
4790 CmdArgs.push_back("-fno-assume-sane-operator-new");
4791
Daniel Dunbar4930e332009-11-17 08:07:36 +00004792 // -fblocks=0 is default.
4793 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004794 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004795 (Args.hasArg(options::OPT_fgnu_runtime) &&
4796 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4797 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004798 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004800 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004801 !getToolChain().hasBlocksRuntime())
4802 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004803 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004804
Richard Smith47972af2015-06-16 00:08:24 +00004805 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004806 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004807 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004808 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004809 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4811 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004812 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004813 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004814 HaveModules = true;
4815 }
4816 }
4817
Richard Smith47972af2015-06-16 00:08:24 +00004818 // -fmodule-maps enables implicit reading of module map files. By default,
4819 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004820 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4821 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004822 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004823 }
4824
Daniel Jasperac42b752013-10-21 06:34:34 +00004825 // -fmodules-decluse checks that modules used are declared so (off by
4826 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004827 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004828 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004829 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004830 }
4831
Daniel Jasper962b38e2014-04-11 11:47:45 +00004832 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4833 // all #included headers are part of modules.
4834 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004835 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004836 CmdArgs.push_back("-fmodules-strict-decluse");
4837 }
4838
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004839 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4840 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4841 options::OPT_fno_implicit_modules)) {
4842 CmdArgs.push_back("-fno-implicit-modules");
4843 }
4844
Daniel Jasperac42b752013-10-21 06:34:34 +00004845 // -fmodule-name specifies the module that is currently being built (or
4846 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004847 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004848
Richard Smith9887d792014-10-17 01:42:53 +00004849 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004850 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004851 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004852
Richard Smithe842a472014-10-22 02:05:46 +00004853 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004854 if (HaveModules)
4855 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4856 else
4857 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004858
4859 // -fmodule-cache-path specifies where our implicitly-built module files
4860 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004861 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004862 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004863 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004864 if (HaveModules) {
4865 if (C.isForDiagnostics()) {
4866 // When generating crash reports, we want to emit the modules along with
4867 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004868 Path = Output.getFilename();
4869 llvm::sys::path::replace_extension(Path, ".cache");
4870 llvm::sys::path::append(Path, "modules");
4871 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004872 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004873 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004874 llvm::sys::path::append(Path, "org.llvm.clang.");
4875 appendUserToPath(Path);
4876 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004877 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004878 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004879 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4880 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004881 }
4882
4883 // When building modules and generating crashdumps, we need to dump a module
4884 // dependency VFS alongside the output.
4885 if (HaveModules && C.isForDiagnostics()) {
4886 SmallString<128> VFSDir(Output.getFilename());
4887 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004888 // Add the cache directory as a temp so the crash diagnostics pick it up.
4889 C.addTempFile(Args.MakeArgString(VFSDir));
4890
Justin Bognera88f0122014-06-20 22:59:50 +00004891 llvm::sys::path::append(VFSDir, "vfs");
4892 CmdArgs.push_back("-module-dependency-dir");
4893 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004894 }
4895
Richard Smith9887d792014-10-17 01:42:53 +00004896 if (HaveModules)
4897 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004898
Douglas Gregor35b04d62013-02-07 19:01:24 +00004899 // Pass through all -fmodules-ignore-macro arguments.
4900 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004901 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4902 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004903
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004904 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4905
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004906 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4907 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4908 D.Diag(diag::err_drv_argument_not_allowed_with)
4909 << A->getAsString(Args) << "-fbuild-session-timestamp";
4910
4911 llvm::sys::fs::file_status Status;
4912 if (llvm::sys::fs::status(A->getValue(), Status))
4913 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004914 CmdArgs.push_back(Args.MakeArgString(
4915 "-fbuild-session-timestamp=" +
4916 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004917 }
4918
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004919 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004920 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4921 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004922 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4923
4924 Args.AddLastArg(CmdArgs,
4925 options::OPT_fmodules_validate_once_per_build_session);
4926 }
4927
Ben Langmuirdcf73862014-03-12 00:06:17 +00004928 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4929
John McCalldfea9982010-04-09 19:12:06 +00004930 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004931 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004932 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004933 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004934
Anders Carlssond470fef2010-11-21 00:09:52 +00004935 // -felide-constructors is the default.
4936 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004938 CmdArgs.push_back("-fno-elide-constructors");
4939
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004940 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004941
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004942 if (KernelOrKext || (types::isCXX(InputType) &&
4943 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4944 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004945 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004946
Tony Linthicum76329bf2011-12-12 21:14:55 +00004947 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004948 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4949 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004950 CmdArgs.push_back("-fshort-enums");
4951
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004952 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004953 if (Arg *A = Args.getLastArg(
4954 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4955 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4956 if (A->getOption().matches(options::OPT_funsigned_char) ||
4957 A->getOption().matches(options::OPT_fno_signed_char)) {
4958 CmdArgs.push_back("-fno-signed-char");
4959 }
4960 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004961 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004962 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004963
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004964 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004965 if (!Args.hasFlag(
4966 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4967 !IsWindowsCygnus && !IsWindowsGNU &&
4968 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4969 getToolChain().getArch() != llvm::Triple::hexagon &&
4970 getToolChain().getArch() != llvm::Triple::xcore &&
4971 ((getToolChain().getTriple().getVendor() !=
4972 llvm::Triple::MipsTechnologies) ||
4973 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004974 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004975 CmdArgs.push_back("-fno-use-cxa-atexit");
4976
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004977 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004978 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004979 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004980 CmdArgs.push_back("-fms-extensions");
4981
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004982 // -fno-use-line-directives is default.
4983 if (Args.hasFlag(options::OPT_fuse_line_directives,
4984 options::OPT_fno_use_line_directives, false))
4985 CmdArgs.push_back("-fuse-line-directives");
4986
Francois Pichet1b4f1632011-09-17 04:32:15 +00004987 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004988 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004989 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004990 (IsWindowsMSVC &&
4991 Args.hasFlag(options::OPT_fms_extensions,
4992 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004993 CmdArgs.push_back("-fms-compatibility");
4994
David Majnemerc371ff02015-03-22 08:39:22 +00004995 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004996 VersionTuple MSVT = visualstudio::getMSVCVersion(
4997 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4998 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004999 CmdArgs.push_back(
5000 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005001
David Majnemer8db91762015-05-18 04:49:30 +00005002 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5003 if (ImplyVCPPCXXVer) {
5004 if (IsMSVC2015Compatible)
5005 CmdArgs.push_back("-std=c++14");
5006 else
5007 CmdArgs.push_back("-std=c++11");
5008 }
5009
Eric Christopher5ecce122013-02-18 00:38:31 +00005010 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005011 if (Args.hasFlag(options::OPT_fborland_extensions,
5012 options::OPT_fno_borland_extensions, false))
5013 CmdArgs.push_back("-fborland-extensions");
5014
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005015 // -fno-declspec is default, except for PS4.
5016 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5017 getToolChain().getTriple().isPS4()))
5018 CmdArgs.push_back("-fdeclspec");
5019 else if (Args.hasArg(options::OPT_fno_declspec))
5020 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5021
David Majnemerc371ff02015-03-22 08:39:22 +00005022 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5023 // than 19.
5024 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5025 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005026 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005027 CmdArgs.push_back("-fno-threadsafe-statics");
5028
Francois Pichet02744872011-09-01 16:38:08 +00005029 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5030 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005031 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005032 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005033 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005034
Chandler Carruthe03aa552010-04-17 20:17:31 +00005035 // -fgnu-keywords default varies depending on language; only pass if
5036 // specified.
5037 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005038 options::OPT_fno_gnu_keywords))
5039 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005041 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005042 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005043 CmdArgs.push_back("-fgnu89-inline");
5044
Chad Rosier9c76d242012-03-15 22:31:42 +00005045 if (Args.hasArg(options::OPT_fno_inline))
5046 CmdArgs.push_back("-fno-inline");
5047
Chad Rosier64d6be92012-03-06 21:17:19 +00005048 if (Args.hasArg(options::OPT_fno_inline_functions))
5049 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005050
John McCall5fb5df92012-06-20 06:18:46 +00005051 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005052
John McCall5fb5df92012-06-20 06:18:46 +00005053 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005054 // legacy is the default. Except for deployment taget of 10.5,
5055 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5056 // gets ignored silently.
5057 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005058 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5059 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005060 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005061 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005062 if (getToolChain().UseObjCMixedDispatch())
5063 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5064 else
5065 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5066 }
5067 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005068
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005069 // When ObjectiveC legacy runtime is in effect on MacOSX,
5070 // turn on the option to do Array/Dictionary subscripting
5071 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005072 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005073 getToolChain().getTriple().isMacOSX() &&
5074 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5075 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005076 objcRuntime.isNeXTFamily())
5077 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005078
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005079 // -fencode-extended-block-signature=1 is default.
5080 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5081 CmdArgs.push_back("-fencode-extended-block-signature");
5082 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005083
John McCall24fc0de2011-07-06 00:26:06 +00005084 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5085 // NOTE: This logic is duplicated in ToolChains.cpp.
5086 bool ARC = isObjCAutoRefCount(Args);
5087 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005088 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005089
John McCall24fc0de2011-07-06 00:26:06 +00005090 CmdArgs.push_back("-fobjc-arc");
5091
Chandler Carruth491db322011-11-04 07:34:47 +00005092 // FIXME: It seems like this entire block, and several around it should be
5093 // wrapped in isObjC, but for now we just use it here as this is where it
5094 // was being used previously.
5095 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5096 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5097 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5098 else
5099 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5100 }
5101
John McCall24fc0de2011-07-06 00:26:06 +00005102 // Allow the user to enable full exceptions code emission.
5103 // We define off for Objective-CC, on for Objective-C++.
5104 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5105 options::OPT_fno_objc_arc_exceptions,
5106 /*default*/ types::isCXX(InputType)))
5107 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005108
John McCall24fc0de2011-07-06 00:26:06 +00005109 }
5110
5111 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5112 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005113 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005114 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005115
John McCall24fc0de2011-07-06 00:26:06 +00005116 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5117 // takes precedence.
5118 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5119 if (!GCArg)
5120 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5121 if (GCArg) {
5122 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005123 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005124 } else if (getToolChain().SupportsObjCGC()) {
5125 GCArg->render(Args, CmdArgs);
5126 } else {
5127 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005128 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005129 }
5130 }
5131
John McCallfbe5ed72015-11-05 19:19:56 +00005132 // Pass down -fobjc-weak or -fno-objc-weak if present.
5133 if (types::isObjC(InputType)) {
5134 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5135 options::OPT_fno_objc_weak);
5136 if (!WeakArg) {
5137 // nothing to do
5138 } else if (GCArg) {
5139 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5140 D.Diag(diag::err_objc_weak_with_gc);
5141 } else if (!objcRuntime.allowsWeak()) {
5142 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5143 D.Diag(diag::err_objc_weak_unsupported);
5144 } else {
5145 WeakArg->render(Args, CmdArgs);
5146 }
5147 }
5148
Bob Wilsonb111ec92015-03-02 19:01:14 +00005149 if (Args.hasFlag(options::OPT_fapplication_extension,
5150 options::OPT_fno_application_extension, false))
5151 CmdArgs.push_back("-fapplication-extension");
5152
Reid Klecknerc542d372014-06-27 17:02:02 +00005153 // Handle GCC-style exception args.
5154 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005155 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5156 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005157
Tim Northovere931f9f2015-10-30 16:30:41 +00005158 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005159 CmdArgs.push_back("-fsjlj-exceptions");
5160
5161 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005162 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5163 options::OPT_fno_assume_sane_operator_new))
5164 CmdArgs.push_back("-fno-assume-sane-operator-new");
5165
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005166 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5167 // most platforms.
5168 if (Args.hasFlag(options::OPT_fsized_deallocation,
5169 options::OPT_fno_sized_deallocation, false))
5170 CmdArgs.push_back("-fsized-deallocation");
5171
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005172 // -fconstant-cfstrings is default, and may be subject to argument translation
5173 // on Darwin.
5174 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5175 options::OPT_fno_constant_cfstrings) ||
5176 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5177 options::OPT_mno_constant_cfstrings))
5178 CmdArgs.push_back("-fno-constant-cfstrings");
5179
John Thompsoned4e2952009-11-05 20:14:16 +00005180 // -fshort-wchar default varies depending on platform; only
5181 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005182 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5183 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005184 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005185
Hans Wennborg28c96312013-07-31 23:39:13 +00005186 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005187 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005188 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005189 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005190
Daniel Dunbar096ed292011-10-05 21:04:55 +00005191 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5192 // -fno-pack-struct doesn't apply to -fpack-struct=.
5193 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005194 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005195 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005196 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005197 } else if (Args.hasFlag(options::OPT_fpack_struct,
5198 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005199 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005200 }
5201
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005202 // Handle -fmax-type-align=N and -fno-type-align
5203 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5204 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5205 if (!SkipMaxTypeAlign) {
5206 std::string MaxTypeAlignStr = "-fmax-type-align=";
5207 MaxTypeAlignStr += A->getValue();
5208 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5209 }
5210 } else if (getToolChain().getTriple().isOSDarwin()) {
5211 if (!SkipMaxTypeAlign) {
5212 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5213 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5214 }
5215 }
5216
John Brawna7b4ec02015-08-10 11:11:28 +00005217 // -fcommon is the default unless compiling kernel code or the target says so
5218 bool NoCommonDefault =
5219 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5220 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5221 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005222 CmdArgs.push_back("-fno-common");
5223
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005224 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005225 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005226 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005227 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005228 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005229 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005230
Daniel Dunbar6358d682010-10-15 22:30:42 +00005231 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005232 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005233 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005234 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005235
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005236 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005237 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5238 StringRef value = inputCharset->getValue();
5239 if (value != "UTF-8")
5240 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5241 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005242 }
5243
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005244 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005245 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5246 StringRef value = execCharset->getValue();
5247 if (value != "UTF-8")
5248 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5249 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005250 }
5251
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005252 // -fcaret-diagnostics is default.
5253 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5254 options::OPT_fno_caret_diagnostics, true))
5255 CmdArgs.push_back("-fno-caret-diagnostics");
5256
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005257 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005258 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005259 options::OPT_fno_diagnostics_fixit_info))
5260 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005261
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005262 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005263 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005264 options::OPT_fno_diagnostics_show_option))
5265 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005266
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005267 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005268 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005269 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005270 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005271 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005274 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005275 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005276 }
5277
Chandler Carruthb6766f02011-03-27 01:50:55 +00005278 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005279 options::OPT_fdiagnostics_show_note_include_stack,
5280 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005281 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005282 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005283 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5284 else
5285 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5286 }
5287
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005288 // Color diagnostics are the default, unless the terminal doesn't support
5289 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005290 // Support both clang's -f[no-]color-diagnostics and gcc's
5291 // -f[no-]diagnostics-colors[=never|always|auto].
5292 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005293 for (const auto &Arg : Args) {
5294 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005295 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5296 !O.matches(options::OPT_fdiagnostics_color) &&
5297 !O.matches(options::OPT_fno_color_diagnostics) &&
5298 !O.matches(options::OPT_fno_diagnostics_color) &&
5299 !O.matches(options::OPT_fdiagnostics_color_EQ))
5300 continue;
5301
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005302 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005303 if (O.matches(options::OPT_fcolor_diagnostics) ||
5304 O.matches(options::OPT_fdiagnostics_color)) {
5305 ShowColors = Colors_On;
5306 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5307 O.matches(options::OPT_fno_diagnostics_color)) {
5308 ShowColors = Colors_Off;
5309 } else {
5310 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005311 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005312 if (value == "always")
5313 ShowColors = Colors_On;
5314 else if (value == "never")
5315 ShowColors = Colors_Off;
5316 else if (value == "auto")
5317 ShowColors = Colors_Auto;
5318 else
5319 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005321 }
5322 }
5323 if (ShowColors == Colors_On ||
5324 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005325 CmdArgs.push_back("-fcolor-diagnostics");
5326
Nico Rieck7857d462013-09-11 00:38:02 +00005327 if (Args.hasArg(options::OPT_fansi_escape_codes))
5328 CmdArgs.push_back("-fansi-escape-codes");
5329
Daniel Dunbardb097022009-06-08 21:13:54 +00005330 if (!Args.hasFlag(options::OPT_fshow_source_location,
5331 options::OPT_fno_show_source_location))
5332 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005333
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005334 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005335 true))
5336 CmdArgs.push_back("-fno-show-column");
5337
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005338 if (!Args.hasFlag(options::OPT_fspell_checking,
5339 options::OPT_fno_spell_checking))
5340 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005341
Chad Rosierc8e56e82012-12-05 21:08:21 +00005342 // -fno-asm-blocks is default.
5343 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5344 false))
5345 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005346
Steven Wucb0d13f2015-01-16 23:05:28 +00005347 // -fgnu-inline-asm is default.
5348 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5349 options::OPT_fno_gnu_inline_asm, true))
5350 CmdArgs.push_back("-fno-gnu-inline-asm");
5351
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005352 // Enable vectorization per default according to the optimization level
5353 // selected. For optimization levels that want vectorization we use the alias
5354 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005355 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005356 OptSpecifier VectorizeAliasOption =
5357 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005358 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005359 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005360 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005361
Chad Rosier136d67d2014-04-28 19:30:57 +00005362 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005363 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 OptSpecifier SLPVectAliasOption =
5365 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005366 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005367 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005368 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005369
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005370 // -fno-slp-vectorize-aggressive is default.
5371 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005372 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005373 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005374
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005375 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5376 A->render(Args, CmdArgs);
5377
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005378 // -fdollars-in-identifiers default varies depending on platform and
5379 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005380 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005381 options::OPT_fno_dollars_in_identifiers)) {
5382 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005383 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005384 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005385 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005386 }
5387
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005388 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5389 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005390 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005391 options::OPT_fno_unit_at_a_time)) {
5392 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005393 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005394 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005395
Eli Friedman055c9702011-11-02 01:53:16 +00005396 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5397 options::OPT_fno_apple_pragma_pack, false))
5398 CmdArgs.push_back("-fapple-pragma-pack");
5399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005400 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005401 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5402 // by default.
5403 if (getToolChain().getArch() == llvm::Triple::le32) {
5404 CmdArgs.push_back("-fno-math-builtin");
5405 }
5406
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005407// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5408//
5409// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005410#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005411 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005412 (getToolChain().getArch() == llvm::Triple::arm ||
5413 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005414 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5415 CmdArgs.push_back("-fno-builtin-strcat");
5416 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5417 CmdArgs.push_back("-fno-builtin-strcpy");
5418 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005419#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005420
Justin Bognera88f0122014-06-20 22:59:50 +00005421 // Enable rewrite includes if the user's asked for it or if we're generating
5422 // diagnostics.
5423 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5424 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005425 if (Args.hasFlag(options::OPT_frewrite_includes,
5426 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005427 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005428 CmdArgs.push_back("-frewrite-includes");
5429
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005430 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005431 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005432 options::OPT_traditional_cpp)) {
5433 if (isa<PreprocessJobAction>(JA))
5434 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005435 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005436 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005437 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005438
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005439 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005440 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005441
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005442 // Handle serialized diagnostics.
5443 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5444 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005445 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005446 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005447
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005448 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5449 CmdArgs.push_back("-fretain-comments-from-system-headers");
5450
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005451 // Forward -fcomment-block-commands to -cc1.
5452 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005453 // Forward -fparse-all-comments to -cc1.
5454 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005455
John Brawnad31ace2015-09-23 13:55:40 +00005456 // Turn -fplugin=name.so into -load name.so
5457 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5458 CmdArgs.push_back("-load");
5459 CmdArgs.push_back(A->getValue());
5460 A->claim();
5461 }
5462
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005463 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5464 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005465 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005466 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5467 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005468
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005469 // We translate this by hand to the -cc1 argument, since nightly test uses
5470 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005471 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005472 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005473 } else
Sean Silva14facf32015-06-09 01:57:17 +00005474 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005475 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005476
Bob Wilson23a55f12014-12-21 07:00:00 +00005477 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005478 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5479 // by the frontend.
5480 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5481 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005482
Daniel Dunbard67a3222009-03-30 06:36:42 +00005483 if (Output.getType() == types::TY_Dependencies) {
5484 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005485 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005486 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005487 CmdArgs.push_back(Output.getFilename());
5488 } else {
5489 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005490 }
5491
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005492 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005493
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005494 if (Input.isFilename())
5495 CmdArgs.push_back(Input.getFilename());
5496 else
5497 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005498
Chris Lattnere9d7d782009-11-03 19:50:27 +00005499 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5500
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005501 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005502
5503 // Optionally embed the -cc1 level arguments into the debug info, for build
5504 // analysis.
5505 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005506 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005507 for (const auto &Arg : Args)
5508 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005509
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005510 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005511 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005512 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005513 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005514 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005515 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005516 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005517 }
5518 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005519 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005520 }
5521
Eric Christopherd3804002013-02-22 20:12:52 +00005522 // Add the split debug info name to the command lines here so we
5523 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005524 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005525 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5526 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005527 const char *SplitDwarfOut;
5528 if (SplitDwarf) {
5529 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005530 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005531 CmdArgs.push_back(SplitDwarfOut);
5532 }
5533
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005534 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5535 // Include them with -fcuda-include-gpubinary.
5536 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005537 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005538 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005539 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005540 }
5541
Eric Christopherd3804002013-02-22 20:12:52 +00005542 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005543 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005544 Output.getType() == types::TY_Object &&
5545 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005546 auto CLCommand =
5547 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005548 C.addCommand(llvm::make_unique<FallbackCommand>(
5549 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005550 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005551 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005552 }
5553
Eric Christopherf1545832013-02-22 23:50:16 +00005554 // Handle the debug info splitting at object creation time if we're
5555 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005556 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005557 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005558 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005559
Roman Divacky178e01602011-02-10 16:52:03 +00005560 if (Arg *A = Args.getLastArg(options::OPT_pg))
5561 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005562 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5563 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005564
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005565 // Claim some arguments which clang supports automatically.
5566
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005567 // -fpch-preprocess is used with gcc to add a special marker in the output to
5568 // include the PCH file. Clang's PTH solution is completely transparent, so we
5569 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005570 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005571
Daniel Dunbar17731772009-03-23 19:03:36 +00005572 // Claim some arguments which clang doesn't support, but we don't
5573 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005574 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5575 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005576
Rafael Espindolab0092d72013-09-04 19:37:35 +00005577 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005578 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005579}
5580
John McCall5fb5df92012-06-20 06:18:46 +00005581/// Add options related to the Objective-C runtime/ABI.
5582///
5583/// Returns true if the runtime is non-fragile.
5584ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5585 ArgStringList &cmdArgs,
5586 RewriteKind rewriteKind) const {
5587 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 Arg *runtimeArg =
5589 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5590 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005591
5592 // Just forward -fobjc-runtime= to the frontend. This supercedes
5593 // options about fragility.
5594 if (runtimeArg &&
5595 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5596 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005597 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005598 if (runtime.tryParse(value)) {
5599 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005600 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005601 }
5602
5603 runtimeArg->render(args, cmdArgs);
5604 return runtime;
5605 }
5606
5607 // Otherwise, we'll need the ABI "version". Version numbers are
5608 // slightly confusing for historical reasons:
5609 // 1 - Traditional "fragile" ABI
5610 // 2 - Non-fragile ABI, version 1
5611 // 3 - Non-fragile ABI, version 2
5612 unsigned objcABIVersion = 1;
5613 // If -fobjc-abi-version= is present, use that to set the version.
5614 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005615 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005616 if (value == "1")
5617 objcABIVersion = 1;
5618 else if (value == "2")
5619 objcABIVersion = 2;
5620 else if (value == "3")
5621 objcABIVersion = 3;
5622 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005623 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005624 } else {
5625 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005626 bool nonFragileABIIsDefault =
5627 (rewriteKind == RK_NonFragile ||
5628 (rewriteKind == RK_None &&
5629 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005630 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5631 options::OPT_fno_objc_nonfragile_abi,
5632 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005633// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005634#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5635 unsigned nonFragileABIVersion = 1;
5636#else
5637 unsigned nonFragileABIVersion = 2;
5638#endif
5639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005640 if (Arg *abiArg =
5641 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005642 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005643 if (value == "1")
5644 nonFragileABIVersion = 1;
5645 else if (value == "2")
5646 nonFragileABIVersion = 2;
5647 else
5648 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005649 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005650 }
5651
5652 objcABIVersion = 1 + nonFragileABIVersion;
5653 } else {
5654 objcABIVersion = 1;
5655 }
5656 }
5657
5658 // We don't actually care about the ABI version other than whether
5659 // it's non-fragile.
5660 bool isNonFragile = objcABIVersion != 1;
5661
5662 // If we have no runtime argument, ask the toolchain for its default runtime.
5663 // However, the rewriter only really supports the Mac runtime, so assume that.
5664 ObjCRuntime runtime;
5665 if (!runtimeArg) {
5666 switch (rewriteKind) {
5667 case RK_None:
5668 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5669 break;
5670 case RK_Fragile:
5671 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5672 break;
5673 case RK_NonFragile:
5674 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5675 break;
5676 }
5677
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005678 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005679 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5680 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005681 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005682 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5683
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005684 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005685 } else {
5686 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5687 }
5688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005689 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005690 } else {
5691 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005692 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005693 // non-fragile mode or the GCC runtime in fragile mode.
5694 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005695 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005696 else
5697 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005698 }
5699
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005700 cmdArgs.push_back(
5701 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005702 return runtime;
5703}
5704
Reid Klecknerc542d372014-06-27 17:02:02 +00005705static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5706 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5707 I += HaveDash;
5708 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005709}
Reid Klecknerc542d372014-06-27 17:02:02 +00005710
Benjamin Kramere003ca22015-10-28 13:54:16 +00005711namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005712struct EHFlags {
5713 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5714 bool Synch;
5715 bool Asynch;
5716 bool NoExceptC;
5717};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005718} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005719
5720/// /EH controls whether to run destructor cleanups when exceptions are
5721/// thrown. There are three modifiers:
5722/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5723/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5724/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5725/// - c: Assume that extern "C" functions are implicitly noexcept. This
5726/// modifier is an optimization, so we ignore it for now.
5727/// The default is /EHs-c-, meaning cleanups are disabled.
5728static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5729 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005730
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005731 std::vector<std::string> EHArgs =
5732 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005733 for (auto EHVal : EHArgs) {
5734 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5735 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 case 'a':
5737 EH.Asynch = maybeConsumeDash(EHVal, I);
5738 continue;
5739 case 'c':
5740 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5741 continue;
5742 case 's':
5743 EH.Synch = maybeConsumeDash(EHVal, I);
5744 continue;
5745 default:
5746 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005747 }
5748 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5749 break;
5750 }
5751 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005752
Reid Klecknerc542d372014-06-27 17:02:02 +00005753 return EH;
5754}
5755
Douglas Katzman3459ce22015-10-08 04:24:12 +00005756void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5757 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5758 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005759 unsigned RTOptionID = options::OPT__SLASH_MT;
5760
Hans Wennborgf1a74252013-09-10 20:18:04 +00005761 if (Args.hasArg(options::OPT__SLASH_LDd))
5762 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5763 // but defining _DEBUG is sticky.
5764 RTOptionID = options::OPT__SLASH_MTd;
5765
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005766 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005767 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005768
David Majnemere2afb472015-07-24 06:49:13 +00005769 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005770 switch (RTOptionID) {
5771 case options::OPT__SLASH_MD:
5772 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005773 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005774 CmdArgs.push_back("-D_MT");
5775 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005776 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005777 break;
5778 case options::OPT__SLASH_MDd:
5779 CmdArgs.push_back("-D_DEBUG");
5780 CmdArgs.push_back("-D_MT");
5781 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005782 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005783 break;
5784 case options::OPT__SLASH_MT:
5785 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005786 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005787 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005788 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005789 break;
5790 case options::OPT__SLASH_MTd:
5791 CmdArgs.push_back("-D_DEBUG");
5792 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005793 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005794 break;
5795 default:
5796 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005797 }
5798
David Majnemere2afb472015-07-24 06:49:13 +00005799 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5800 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5801 } else {
5802 CmdArgs.push_back(FlagForCRT.data());
5803
5804 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5805 // users want. The /Za flag to cl.exe turns this off, but it's not
5806 // implemented in clang.
5807 CmdArgs.push_back("--dependent-lib=oldnames");
5808 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005809
Hans Wennborg8858a032014-07-21 23:42:07 +00005810 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5811 // would produce interleaved output, so ignore /showIncludes in such cases.
5812 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5813 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5814 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005815
David Majnemerf6072342014-07-01 22:24:56 +00005816 // This controls whether or not we emit RTTI data for polymorphic types.
5817 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5818 /*default=*/false))
5819 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005820
Reid Kleckner124955a2015-08-05 18:51:13 +00005821 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005822 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005823 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5824 // If we are emitting CV but not DWARF, don't build information that LLVM
5825 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005826 if (*EmitCodeView && !EmitDwarf)
5827 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5828 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005829 CmdArgs.push_back("-gcodeview");
5830
Reid Klecknerc542d372014-06-27 17:02:02 +00005831 const Driver &D = getToolChain().getDriver();
5832 EHFlags EH = parseClangCLEHFlags(D, Args);
5833 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005834 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005835 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005836 CmdArgs.push_back("-fexceptions");
5837 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005838
Hans Wennborge50cec32014-06-13 20:59:54 +00005839 // /EP should expand to -E -P.
5840 if (Args.hasArg(options::OPT__SLASH_EP)) {
5841 CmdArgs.push_back("-E");
5842 CmdArgs.push_back("-P");
5843 }
5844
David Majnemera5b195a2015-02-14 01:35:12 +00005845 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005846 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5847 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005848 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5849 else
5850 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5851
5852 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5853 VolatileOptionID = A->getOption().getID();
5854
5855 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5856 CmdArgs.push_back("-fms-volatile");
5857
David Majnemer86c318f2014-02-11 21:05:00 +00005858 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5859 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5860 if (MostGeneralArg && BestCaseArg)
5861 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5862 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5863
5864 if (MostGeneralArg) {
5865 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5866 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5867 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5868
5869 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5870 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5871 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5872 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5873 << FirstConflict->getAsString(Args)
5874 << SecondConflict->getAsString(Args);
5875
5876 if (SingleArg)
5877 CmdArgs.push_back("-fms-memptr-rep=single");
5878 else if (MultipleArg)
5879 CmdArgs.push_back("-fms-memptr-rep=multiple");
5880 else
5881 CmdArgs.push_back("-fms-memptr-rep=virtual");
5882 }
5883
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005884 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5885 A->render(Args, CmdArgs);
5886
Hans Wennborg81f74482013-09-10 01:07:07 +00005887 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5888 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005889 if (Args.hasArg(options::OPT__SLASH_fallback))
5890 CmdArgs.push_back("msvc-fallback");
5891 else
5892 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005893 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005894}
5895
Douglas Katzman95354292015-06-23 20:42:09 +00005896visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005897 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005898 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005899 return CLFallback.get();
5900}
5901
Daniel Sanders7f933f42015-01-30 17:35:23 +00005902void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5903 ArgStringList &CmdArgs) const {
5904 StringRef CPUName;
5905 StringRef ABIName;
5906 const llvm::Triple &Triple = getToolChain().getTriple();
5907 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5908
5909 CmdArgs.push_back("-target-abi");
5910 CmdArgs.push_back(ABIName.data());
5911}
5912
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005913void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005914 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005915 const ArgList &Args,
5916 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005917 ArgStringList CmdArgs;
5918
5919 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5920 const InputInfo &Input = Inputs[0];
5921
James Y Knight2db38f32015-08-15 03:45:25 +00005922 std::string TripleStr =
5923 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5924 const llvm::Triple Triple(TripleStr);
5925
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005926 // Don't warn about "clang -w -c foo.s"
5927 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005928 // and "clang -emit-llvm -c foo.s"
5929 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005930
Rafael Espindola577637a2015-01-03 00:06:04 +00005931 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005932
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005933 // Invoke ourselves in -cc1as mode.
5934 //
5935 // FIXME: Implement custom jobs for internal actions.
5936 CmdArgs.push_back("-cc1as");
5937
5938 // Add the "effective" target triple.
5939 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005940 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5941
5942 // Set the output mode, we currently only expect to be used as a real
5943 // assembler.
5944 CmdArgs.push_back("-filetype");
5945 CmdArgs.push_back("obj");
5946
Eric Christopher45f2e712012-12-18 00:31:10 +00005947 // Set the main file name, so that debug info works even with
5948 // -save-temps or preprocessed assembly.
5949 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005950 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005951
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005952 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005953 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005954 if (!CPU.empty()) {
5955 CmdArgs.push_back("-target-cpu");
5956 CmdArgs.push_back(Args.MakeArgString(CPU));
5957 }
5958
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005959 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005960 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005961
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005962 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005964
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005965 // Pass along any -I options so we get proper .include search paths.
5966 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5967
Eric Christopherfc3ee562012-01-10 00:38:01 +00005968 // Determine the original source input.
5969 const Action *SourceAction = &JA;
5970 while (SourceAction->getKind() != Action::InputClass) {
5971 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5972 SourceAction = SourceAction->getInputs()[0];
5973 }
5974
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005975 // Forward -g and handle debug info related flags, assuming we are dealing
5976 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005977 if (SourceAction->getType() == types::TY_Asm ||
5978 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005979 bool WantDebug = false;
5980 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005981 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005982 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00005983 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5984 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005985 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005986 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005987 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005988 if (DwarfVersion == 0)
5989 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005990 RenderDebugEnablingArgs(Args, CmdArgs,
5991 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5992 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00005993 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005994
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005995 // Add the -fdebug-compilation-dir flag if needed.
5996 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005997
5998 // Set the AT_producer to the clang version when using the integrated
5999 // assembler on assembly source files.
6000 CmdArgs.push_back("-dwarf-debug-producer");
6001 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006002
6003 // And pass along -I options
6004 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006005 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006006
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006007 // Handle -fPIC et al -- the relocation-model affects the assembler
6008 // for some targets.
6009 llvm::Reloc::Model RelocationModel;
6010 unsigned PICLevel;
6011 bool IsPIE;
6012 std::tie(RelocationModel, PICLevel, IsPIE) =
6013 ParsePICArgs(getToolChain(), Triple, Args);
6014
6015 const char *RMName = RelocationModelName(RelocationModel);
6016 if (RMName) {
6017 CmdArgs.push_back("-mrelocation-model");
6018 CmdArgs.push_back(RMName);
6019 }
6020
Kevin Enderby292dc082011-12-22 19:31:58 +00006021 // Optionally embed the -cc1as level arguments into the debug info, for build
6022 // analysis.
6023 if (getToolChain().UseDwarfDebugFlags()) {
6024 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006025 for (const auto &Arg : Args)
6026 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006027
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006028 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006029 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6030 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006031 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006032 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006033 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006034 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006035 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006036 }
6037 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006038 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006039 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006040
6041 // FIXME: Add -static support, once we have it.
6042
Daniel Sanders7f933f42015-01-30 17:35:23 +00006043 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006044 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006045 default:
6046 break;
6047
6048 case llvm::Triple::mips:
6049 case llvm::Triple::mipsel:
6050 case llvm::Triple::mips64:
6051 case llvm::Triple::mips64el:
6052 AddMIPSTargetArgs(Args, CmdArgs);
6053 break;
6054 }
6055
David Blaikie372d9502014-01-17 03:17:40 +00006056 // Consume all the warning flags. Usually this would be handled more
6057 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6058 // doesn't handle that so rather than warning about unused flags that are
6059 // actually used, we'll lie by omission instead.
6060 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006061 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006062
David Blaikie9260ed62013-07-25 21:19:01 +00006063 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6064 getToolChain().getDriver());
6065
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006066 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006067
6068 assert(Output.isFilename() && "Unexpected lipo output.");
6069 CmdArgs.push_back("-o");
6070 CmdArgs.push_back(Output.getFilename());
6071
Daniel Dunbarb440f562010-08-02 02:38:21 +00006072 assert(Input.isFilename() && "Invalid input.");
6073 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006074
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006075 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006077
6078 // Handle the debug info splitting at object creation time if we're
6079 // creating an object.
6080 // TODO: Currently only works on linux with newer objcopy.
6081 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006082 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006083 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006084 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006085}
6086
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006087void GnuTool::anchor() {}
6088
Daniel Dunbara3246a02009-03-18 08:07:30 +00006089void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006090 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006091 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006092 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006093 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006094 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006095
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006096 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006097 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006098 // Don't forward any -g arguments to assembly steps.
6099 if (isa<AssembleJobAction>(JA) &&
6100 A->getOption().matches(options::OPT_g_Group))
6101 continue;
6102
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006103 // Don't forward any -W arguments to assembly and link steps.
6104 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6105 A->getOption().matches(options::OPT_W_Group))
6106 continue;
6107
Daniel Dunbar2da02722009-03-19 07:55:12 +00006108 // It is unfortunate that we have to claim here, as this means
6109 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006110 // platforms using a generic gcc, even if we are just using gcc
6111 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006112 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006113 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006114 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006115 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006116
Daniel Dunbar4e295052010-01-25 22:35:08 +00006117 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006118
6119 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006120 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006121 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006122 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006123 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006124 }
6125
Daniel Dunbar5716d872009-05-02 21:41:52 +00006126 // Try to force gcc to match the tool chain we want, if we recognize
6127 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006128 //
6129 // FIXME: The triple class should directly provide the information we want
6130 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006131 switch (getToolChain().getArch()) {
6132 default:
6133 break;
6134 case llvm::Triple::x86:
6135 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006136 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006137 break;
6138 case llvm::Triple::x86_64:
6139 case llvm::Triple::ppc64:
6140 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006141 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006142 break;
6143 case llvm::Triple::sparcel:
6144 CmdArgs.push_back("-EL");
6145 break;
6146 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006147
Daniel Dunbarb440f562010-08-02 02:38:21 +00006148 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006149 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006150 CmdArgs.push_back(Output.getFilename());
6151 } else {
6152 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006153 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006154 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006155
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006156 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006157
6158 // Only pass -x if gcc will understand it; otherwise hope gcc
6159 // understands the suffix correctly. The main use case this would go
6160 // wrong in is for linker inputs if they happened to have an odd
6161 // suffix; really the only way to get this to happen is a command
6162 // like '-x foobar a.c' which will treat a.c like a linker input.
6163 //
6164 // FIXME: For the linker case specifically, can we safely convert
6165 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006166 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006167 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006168 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006169 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006170 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006171 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006172 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006173 else if (II.getType() == types::TY_ModuleFile)
6174 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006175 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006176
Daniel Dunbara3246a02009-03-18 08:07:30 +00006177 if (types::canTypeBeUserSpecified(II.getType())) {
6178 CmdArgs.push_back("-x");
6179 CmdArgs.push_back(types::getTypeName(II.getType()));
6180 }
6181
Daniel Dunbarb440f562010-08-02 02:38:21 +00006182 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006183 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006184 else {
6185 const Arg &A = II.getInputArg();
6186
6187 // Reverse translate some rewritten options.
6188 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6189 CmdArgs.push_back("-lstdc++");
6190 continue;
6191 }
6192
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006193 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006194 A.render(Args, CmdArgs);
6195 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006196 }
6197
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006198 const std::string customGCCName = D.getCCCGenericGCCName();
6199 const char *GCCName;
6200 if (!customGCCName.empty())
6201 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006202 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006203 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006204 } else
6205 GCCName = "gcc";
6206
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006207 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006208 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006209}
6210
Douglas Katzman95354292015-06-23 20:42:09 +00006211void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6212 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006213 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006214}
6215
Douglas Katzman95354292015-06-23 20:42:09 +00006216void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6217 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006218 const Driver &D = getToolChain().getDriver();
6219
Eric Christophercc7ff502015-01-29 00:56:17 +00006220 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006221 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006222 case types::TY_LLVM_IR:
6223 case types::TY_LTO_IR:
6224 case types::TY_LLVM_BC:
6225 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006226 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006227 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006228 // We assume we've got an "integrated" assembler in that gcc will produce an
6229 // object file itself.
6230 case types::TY_Object:
6231 CmdArgs.push_back("-c");
6232 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006233 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006234 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006235 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006236 case types::TY_Nothing:
6237 CmdArgs.push_back("-fsyntax-only");
6238 break;
6239 default:
6240 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006241 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006242}
6243
Douglas Katzman95354292015-06-23 20:42:09 +00006244void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6245 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006246 // The types are (hopefully) good enough.
6247}
6248
Tony Linthicum76329bf2011-12-12 21:14:55 +00006249// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006250void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006251 ArgStringList &CmdArgs) const {
6252}
6253
Douglas Katzman95354292015-06-23 20:42:09 +00006254void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6255 const InputInfo &Output,
6256 const InputInfoList &Inputs,
6257 const ArgList &Args,
6258 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006259 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006260
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006261 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6262 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263 ArgStringList CmdArgs;
6264
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006265 std::string MArchString = "-march=hexagon";
6266 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006267
6268 RenderExtraToolArgs(JA, CmdArgs);
6269
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006270 std::string AsName = "hexagon-llvm-mc";
6271 std::string MCpuString = "-mcpu=hexagon" +
6272 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6273 CmdArgs.push_back("-filetype=obj");
6274 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6275
Tony Linthicum76329bf2011-12-12 21:14:55 +00006276 if (Output.isFilename()) {
6277 CmdArgs.push_back("-o");
6278 CmdArgs.push_back(Output.getFilename());
6279 } else {
6280 assert(Output.isNothing() && "Unexpected output");
6281 CmdArgs.push_back("-fsyntax-only");
6282 }
6283
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006284 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6285 std::string N = llvm::utostr(G.getValue());
6286 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6287 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006289 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006290
Tony Linthicum76329bf2011-12-12 21:14:55 +00006291 // Only pass -x if gcc will understand it; otherwise hope gcc
6292 // understands the suffix correctly. The main use case this would go
6293 // wrong in is for linker inputs if they happened to have an odd
6294 // suffix; really the only way to get this to happen is a command
6295 // like '-x foobar a.c' which will treat a.c like a linker input.
6296 //
6297 // FIXME: For the linker case specifically, can we safely convert
6298 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006299 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006300 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006301 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006302 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006303 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006304 else if (II.getType() == types::TY_AST)
6305 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006306 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006307 else if (II.getType() == types::TY_ModuleFile)
6308 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006309 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006310
6311 if (II.isFilename())
6312 CmdArgs.push_back(II.getFilename());
6313 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006314 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006315 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316 II.getInputArg().render(Args, CmdArgs);
6317 }
6318
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006319 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006320 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006321}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006322
Douglas Katzman95354292015-06-23 20:42:09 +00006323void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6324 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325}
6326
Douglas Katzman54366072015-07-27 16:53:08 +00006327static void
6328constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006329 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006330 const InputInfo &Output, const InputInfoList &Inputs,
6331 const ArgList &Args, ArgStringList &CmdArgs,
6332 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006335
Matthew Curtise689b052012-12-06 15:46:07 +00006336 //----------------------------------------------------------------------------
6337 //
6338 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006339 bool IsStatic = Args.hasArg(options::OPT_static);
6340 bool IsShared = Args.hasArg(options::OPT_shared);
6341 bool IsPIE = Args.hasArg(options::OPT_pie);
6342 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6343 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6344 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6345 bool UseG0 = false;
6346 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006347
Matthew Curtise689b052012-12-06 15:46:07 +00006348 //----------------------------------------------------------------------------
6349 // Silence warnings for various options
6350 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006351 Args.ClaimAllArgs(options::OPT_g_Group);
6352 Args.ClaimAllArgs(options::OPT_emit_llvm);
6353 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6354 // handled somewhere else.
6355 Args.ClaimAllArgs(options::OPT_static_libgcc);
6356
6357 //----------------------------------------------------------------------------
6358 //
6359 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006360 if (Args.hasArg(options::OPT_s))
6361 CmdArgs.push_back("-s");
6362
6363 if (Args.hasArg(options::OPT_r))
6364 CmdArgs.push_back("-r");
6365
6366 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006367 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006368
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006369 CmdArgs.push_back("-march=hexagon");
6370 std::string CpuVer =
6371 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6372 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6373 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006374
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006376 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006377 // The following should be the default, but doing as hexagon-gcc does.
6378 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006379 }
6380
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006381 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006382 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006383
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006384 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006385 CmdArgs.push_back("-pie");
6386
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006387 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6388 std::string N = llvm::utostr(G.getValue());
6389 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6390 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006391 }
6392
Matthew Curtise689b052012-12-06 15:46:07 +00006393 //----------------------------------------------------------------------------
6394 //
6395 //----------------------------------------------------------------------------
6396 CmdArgs.push_back("-o");
6397 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398
Matthew Curtise689b052012-12-06 15:46:07 +00006399 //----------------------------------------------------------------------------
6400 // moslib
6401 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 std::vector<std::string> OsLibs;
6403 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006404
Sean Silva14facf32015-06-09 01:57:17 +00006405 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6406 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006407 OsLibs.emplace_back(A->getValue());
6408 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006410 if (OsLibs.empty()) {
6411 OsLibs.push_back("standalone");
6412 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006413 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006414
Matthew Curtise689b052012-12-06 15:46:07 +00006415 //----------------------------------------------------------------------------
6416 // Start Files
6417 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006418 const std::string MCpuSuffix = "/" + CpuVer;
6419 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6420 const std::string RootDir =
6421 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6422 const std::string StartSubDir =
6423 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006424
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006425 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6426 const char *Name) -> std::string {
6427 std::string RelName = SubDir + Name;
6428 std::string P = HTC.GetFilePath(RelName.c_str());
6429 if (llvm::sys::fs::exists(P))
6430 return P;
6431 return RootDir + RelName;
6432 };
6433
6434 if (IncStdLib && IncStartFiles) {
6435 if (!IsShared) {
6436 if (HasStandalone) {
6437 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6438 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006439 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006440 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6441 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006442 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 std::string Init = UseShared
6444 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6445 : Find(RootDir, StartSubDir, "/init.o");
6446 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006447 }
6448
6449 //----------------------------------------------------------------------------
6450 // Library Search Paths
6451 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6453 for (const auto &LibPath : LibPaths)
6454 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006455
6456 //----------------------------------------------------------------------------
6457 //
6458 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006459 Args.AddAllArgs(CmdArgs,
6460 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6461 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006462
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006463 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006464
6465 //----------------------------------------------------------------------------
6466 // Libraries
6467 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006468 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006469 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006471 CmdArgs.push_back("-lm");
6472 }
6473
6474 CmdArgs.push_back("--start-group");
6475
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 if (!IsShared) {
6477 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006478 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006479 CmdArgs.push_back("-lc");
6480 }
6481 CmdArgs.push_back("-lgcc");
6482
6483 CmdArgs.push_back("--end-group");
6484 }
6485
6486 //----------------------------------------------------------------------------
6487 // End files
6488 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006489 if (IncStdLib && IncStartFiles) {
6490 std::string Fini = UseShared
6491 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6492 : Find(RootDir, StartSubDir, "/fini.o");
6493 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006494 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006495}
6496
Douglas Katzman95354292015-06-23 20:42:09 +00006497void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6498 const InputInfo &Output,
6499 const InputInfoList &Inputs,
6500 const ArgList &Args,
6501 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006502 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006503
6504 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006506 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006507
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006509 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006510 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006511}
6512// Hexagon tools end.
6513
Tom Stellard8fa33092015-07-18 01:49:05 +00006514void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6515 const InputInfo &Output,
6516 const InputInfoList &Inputs,
6517 const ArgList &Args,
6518 const char *LinkingOutput) const {
6519
6520 std::string Linker = getToolChain().GetProgramPath(getShortName());
6521 ArgStringList CmdArgs;
6522 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006523 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006524 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006525 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006526 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6527 CmdArgs.push_back("-o");
6528 CmdArgs.push_back(Output.getFilename());
6529 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6530 CmdArgs, Inputs));
6531}
6532// AMDGPU tools end.
6533
Dan Gohman52816862015-12-16 23:30:41 +00006534wasm::Linker::Linker(const ToolChain &TC)
6535 : GnuTool("wasm::Linker", "lld", TC) {}
6536
6537bool wasm::Linker::isLinkJob() const {
6538 return true;
6539}
6540
6541bool wasm::Linker::hasIntegratedCPP() const {
6542 return false;
6543}
6544
6545void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6546 const InputInfo &Output,
6547 const InputInfoList &Inputs,
6548 const ArgList &Args,
6549 const char *LinkingOutput) const {
6550 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6551 ArgStringList CmdArgs;
6552 CmdArgs.push_back("-flavor");
6553 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006554
6555 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006556 // size is of particular importance. This is significantly facilitated by
6557 // the enabling of -ffunction-sections and -fdata-sections in
6558 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006559 if (areOptimizationsEnabled(Args))
6560 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006561
Dan Gohman52816862015-12-16 23:30:41 +00006562 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6563 CmdArgs.push_back("-o");
6564 CmdArgs.push_back(Output.getFilename());
6565 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6566}
6567
Renato Golin7c542b42015-07-27 23:44:45 +00006568const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006569 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006570 if (!Arch.empty())
6571 MArch = Arch;
6572 else
Bernard Ogden31561762013-12-12 13:27:11 +00006573 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006574 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006575
6576 // Handle -march=native.
6577 if (MArch == "native") {
6578 std::string CPU = llvm::sys::getHostCPUName();
6579 if (CPU != "generic") {
6580 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006581 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006582 // If there is no valid architecture suffix for this CPU we don't know how
6583 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006584 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006585 MArch = "";
6586 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006587 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006588 }
6589 }
6590
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006591 return MArch;
6592}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006593
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006594/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006595StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006596 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006597 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6598 // here means an -march=native that we can't handle, so instead return no CPU.
6599 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006600 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006601
John Brawna95c1a82015-05-08 12:52:18 +00006602 // We need to return an empty string here on invalid MArch values as the
6603 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006604 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006605}
6606
6607/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006608std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006609 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006610 // FIXME: Warn on inconsistent use of -mcpu and -march.
6611 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006612 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006613 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006614 // Handle -mcpu=native.
6615 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006616 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006617 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006618 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006619 }
6620
Renato Goline17c5802015-07-27 23:44:42 +00006621 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006622}
6623
6624/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006625/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006626// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006627StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6628 const llvm::Triple &Triple) {
6629 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006630 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006631 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006632 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006633 if (ArchKind == llvm::ARM::AK_INVALID)
6634 // In case of generic Arch, i.e. "arm",
6635 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006636 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006637 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006638 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6639 // armv7k triple if it's actually been specified via "-arch armv7k".
6640 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006641 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006642 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006643 }
Renato Golin3c007252015-05-28 15:05:53 +00006644 if (ArchKind == llvm::ARM::AK_INVALID)
6645 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006646 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006647}
6648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006649void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006650 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006651 if (Args.hasArg(options::OPT_r))
6652 return;
6653
John Brawn94fd9632015-05-21 12:19:49 +00006654 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6655 // to generate BE-8 executables.
6656 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6657 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006658}
6659
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006660mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006661 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6662 // was first introduced in Release 3. However, other compilers have
6663 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006664 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6665 .Case("mips1", NanLegacy)
6666 .Case("mips2", NanLegacy)
6667 .Case("mips3", NanLegacy)
6668 .Case("mips4", NanLegacy)
6669 .Case("mips5", NanLegacy)
6670 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006671 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006672 .Case("mips32r3", NanLegacy | Nan2008)
6673 .Case("mips32r5", NanLegacy | Nan2008)
6674 .Case("mips32r6", Nan2008)
6675 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006676 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006677 .Case("mips64r3", NanLegacy | Nan2008)
6678 .Case("mips64r5", NanLegacy | Nan2008)
6679 .Case("mips64r6", Nan2008)
6680 .Default(NanLegacy);
6681}
6682
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006683bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6684 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6685 return A && (A->getValue() == StringRef(Value));
6686}
6687
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006688bool mips::isUCLibc(const ArgList &Args) {
6689 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006690 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006691}
6692
Daniel Sanders2bf13662014-07-10 14:40:57 +00006693bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006694 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6695 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006696 .Case("2008", true)
6697 .Case("legacy", false)
6698 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006699
6700 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006701 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006702 .Cases("mips32r6", "mips64r6", true)
6703 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006704
6705 return false;
6706}
6707
Daniel Sanders379d44b2014-07-16 11:52:23 +00006708bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006709 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006710 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006711 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006712 return false;
6713
6714 if (ABIName != "32")
6715 return false;
6716
Toma Tabacu94ea6862015-06-16 13:54:13 +00006717 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6718 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006719 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006720 return false;
6721
Daniel Sanders379d44b2014-07-16 11:52:23 +00006722 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006723 .Cases("mips2", "mips3", "mips4", "mips5", true)
6724 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6725 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6726 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006727}
6728
Toma Tabacu94ea6862015-06-16 13:54:13 +00006729bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6730 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006731 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006732 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6733
6734 // FPXX shouldn't be used if -msingle-float is present.
6735 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6736 options::OPT_mdouble_float))
6737 if (A->getOption().matches(options::OPT_msingle_float))
6738 UseFPXX = false;
6739
6740 return UseFPXX;
6741}
6742
Tim Northover157d9112014-01-16 08:48:16 +00006743llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006744 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6745 // archs which Darwin doesn't use.
6746
6747 // The matching this routine does is fairly pointless, since it is neither the
6748 // complete architecture list, nor a reasonable subset. The problem is that
6749 // historically the driver driver accepts this and also ties its -march=
6750 // handling to the architecture name, so we need to be careful before removing
6751 // support for it.
6752
6753 // This code must be kept in sync with Clang's Darwin specific argument
6754 // translation.
6755
6756 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006757 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6758 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6759 .Case("ppc64", llvm::Triple::ppc64)
6760 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6761 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6762 llvm::Triple::x86)
6763 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6764 // This is derived from the driver driver.
6765 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6766 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6767 .Cases("armv7s", "xscale", llvm::Triple::arm)
6768 .Case("arm64", llvm::Triple::aarch64)
6769 .Case("r600", llvm::Triple::r600)
6770 .Case("amdgcn", llvm::Triple::amdgcn)
6771 .Case("nvptx", llvm::Triple::nvptx)
6772 .Case("nvptx64", llvm::Triple::nvptx64)
6773 .Case("amdil", llvm::Triple::amdil)
6774 .Case("spir", llvm::Triple::spir)
6775 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006776}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006777
Tim Northover157d9112014-01-16 08:48:16 +00006778void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006779 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006780 T.setArch(Arch);
6781
6782 if (Str == "x86_64h")
6783 T.setArchName(Str);
6784 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6785 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006786 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006787 }
6788}
6789
Bob Wilsondecc03e2012-11-23 06:14:39 +00006790const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006791 const InputInfo &Input) {
6792 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006793}
6794
Bob Wilsondecc03e2012-11-23 06:14:39 +00006795const char *Clang::getBaseInputStem(const ArgList &Args,
6796 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006797 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006798
Chris Lattner906bb902011-01-16 08:14:11 +00006799 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006800 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006801
6802 return Str;
6803}
6804
Bob Wilsondecc03e2012-11-23 06:14:39 +00006805const char *Clang::getDependencyFileName(const ArgList &Args,
6806 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006807 // FIXME: Think about this more.
6808 std::string Res;
6809
6810 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006811 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006812 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006813 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006814 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006815 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006816 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006817}
6818
Douglas Katzman95354292015-06-23 20:42:09 +00006819void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6820 const InputInfo &Output,
6821 const InputInfoList &Inputs,
6822 const ArgList &Args,
6823 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006824 const ToolChain &ToolChain = getToolChain();
6825 const Driver &D = ToolChain.getDriver();
6826 ArgStringList CmdArgs;
6827
6828 // Silence warning for "clang -g foo.o -o foo"
6829 Args.ClaimAllArgs(options::OPT_g_Group);
6830 // and "clang -emit-llvm foo.o -o foo"
6831 Args.ClaimAllArgs(options::OPT_emit_llvm);
6832 // and for "clang -w foo.o -o foo". Other warning options are already
6833 // handled somewhere else.
6834 Args.ClaimAllArgs(options::OPT_w);
6835
6836 if (!D.SysRoot.empty())
6837 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6838
6839 // CloudABI only supports static linkage.
6840 CmdArgs.push_back("-Bstatic");
6841 CmdArgs.push_back("--eh-frame-hdr");
6842 CmdArgs.push_back("--gc-sections");
6843
6844 if (Output.isFilename()) {
6845 CmdArgs.push_back("-o");
6846 CmdArgs.push_back(Output.getFilename());
6847 } else {
6848 assert(Output.isNothing() && "Invalid output.");
6849 }
6850
Douglas Katzman78b37b02015-11-17 20:28:07 +00006851 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6853 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6854 }
6855
6856 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006857 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006858 Args.AddAllArgs(CmdArgs,
6859 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6860 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006861
Teresa Johnson945bc502015-10-15 20:35:53 +00006862 if (D.isUsingLTO())
6863 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006864
6865 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6866
Douglas Katzman78b37b02015-11-17 20:28:07 +00006867 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006868 if (D.CCCIsCXX())
6869 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6870 CmdArgs.push_back("-lc");
6871 CmdArgs.push_back("-lcompiler_rt");
6872 }
6873
Douglas Katzman78b37b02015-11-17 20:28:07 +00006874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6876
6877 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006879}
6880
Douglas Katzman95354292015-06-23 20:42:09 +00006881void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6882 const InputInfo &Output,
6883 const InputInfoList &Inputs,
6884 const ArgList &Args,
6885 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006886 ArgStringList CmdArgs;
6887
6888 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6889 const InputInfo &Input = Inputs[0];
6890
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006891 // Determine the original source input.
6892 const Action *SourceAction = &JA;
6893 while (SourceAction->getKind() != Action::InputClass) {
6894 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6895 SourceAction = SourceAction->getInputs()[0];
6896 }
6897
Eric Christopherf5a8f492015-12-08 00:10:10 +00006898 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006899 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006900 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6901 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006902 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006903 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006904 const llvm::Triple &T(getToolChain().getTriple());
6905 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006906 CmdArgs.push_back("-Q");
6907 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006908
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006909 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006910 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006911 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006912 if (Args.hasArg(options::OPT_gstabs))
6913 CmdArgs.push_back("--gstabs");
6914 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006915 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006916 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006917
Daniel Dunbarbe220842009-03-20 16:06:39 +00006918 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006919 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006920
Daniel Dunbar6d484762010-07-22 01:47:22 +00006921 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006922 if (getToolChain().getArch() == llvm::Triple::x86 ||
6923 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006924 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6925 CmdArgs.push_back("-force_cpusubtype_ALL");
6926
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006927 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006928 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006929 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006930 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006931 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006932 CmdArgs.push_back("-static");
6933
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006934 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006935
6936 assert(Output.isFilename() && "Unexpected lipo output.");
6937 CmdArgs.push_back("-o");
6938 CmdArgs.push_back(Output.getFilename());
6939
Daniel Dunbarb440f562010-08-02 02:38:21 +00006940 assert(Input.isFilename() && "Invalid input.");
6941 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006942
6943 // asm_final spec is empty.
6944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006945 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006946 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006947}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006948
Tim Northover157d9112014-01-16 08:48:16 +00006949void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006950
Tim Northover157d9112014-01-16 08:48:16 +00006951void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6952 ArgStringList &CmdArgs) const {
6953 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006954
Daniel Dunbarc1964212009-03-26 16:23:12 +00006955 // Derived from darwin_arch spec.
6956 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006957 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006958
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006959 // FIXME: Is this needed anymore?
6960 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006961 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006962}
6963
Douglas Katzman95354292015-06-23 20:42:09 +00006964bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006965 // We only need to generate a temp path for LTO if we aren't compiling object
6966 // files. When compiling source files, we run 'dsymutil' after linking. We
6967 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006968 for (const auto &Input : Inputs)
6969 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006970 return true;
6971
6972 return false;
6973}
6974
Douglas Katzman95354292015-06-23 20:42:09 +00006975void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6976 ArgStringList &CmdArgs,
6977 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006978 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006979 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006981 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006982 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6983 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006984 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6985 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006986 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006987 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006988 }
6989
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006990 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006991 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006992 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6993 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006994
Bob Wilson3d27dad2013-08-02 22:25:34 +00006995 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6996 CmdArgs.push_back("-export_dynamic");
6997
Bob Wilsonb111ec92015-03-02 19:01:14 +00006998 // If we are using App Extension restrictions, pass a flag to the linker
6999 // telling it that the compiled code has been audited.
7000 if (Args.hasFlag(options::OPT_fapplication_extension,
7001 options::OPT_fno_application_extension, false))
7002 CmdArgs.push_back("-application_extension");
7003
Teresa Johnson945bc502015-10-15 20:35:53 +00007004 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007005 // If we are using LTO, then automatically create a temporary file path for
7006 // the linker to use, so that it's lifetime will extend past a possible
7007 // dsymutil step.
7008 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7009 const char *TmpPath = C.getArgs().MakeArgString(
7010 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7011 C.addTempFile(TmpPath);
7012 CmdArgs.push_back("-object_path_lto");
7013 CmdArgs.push_back(TmpPath);
7014 }
7015
7016 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7017 // it in clang installed libraries. If not found, the option is not used
7018 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7019 if (Version[0] >= 133) {
7020 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7021 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7022 SmallString<128> LibLTOPath(P);
7023 llvm::sys::path::append(LibLTOPath, "lib");
7024 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7025 if (llvm::sys::fs::exists(LibLTOPath)) {
7026 CmdArgs.push_back("-lto_library");
7027 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7028 } else {
7029 D.Diag(diag::warn_drv_lto_libpath);
7030 }
7031 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007032 }
7033
Daniel Dunbarc1964212009-03-26 16:23:12 +00007034 // Derived from the "link" spec.
7035 Args.AddAllArgs(CmdArgs, options::OPT_static);
7036 if (!Args.hasArg(options::OPT_static))
7037 CmdArgs.push_back("-dynamic");
7038 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7039 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7040 // here. How do we wish to handle such things?
7041 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007042
Daniel Dunbarc1964212009-03-26 16:23:12 +00007043 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007044 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007045 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007046 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007047
7048 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7049 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7050 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7051
7052 Arg *A;
7053 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7054 (A = Args.getLastArg(options::OPT_current__version)) ||
7055 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007056 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7057 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007058
7059 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7060 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7061 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7062 } else {
7063 CmdArgs.push_back("-dylib");
7064
7065 Arg *A;
7066 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7067 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7068 (A = Args.getLastArg(options::OPT_client__name)) ||
7069 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7070 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7071 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007072 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7073 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007074
Daniel Dunbarc1964212009-03-26 16:23:12 +00007075 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7076 "-dylib_compatibility_version");
7077 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7078 "-dylib_current_version");
7079
Tim Northover157d9112014-01-16 08:48:16 +00007080 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007081
7082 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7083 "-dylib_install_name");
7084 }
7085
7086 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7087 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7088 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007089 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007090 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007091 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7092 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7093 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7094 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7095 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7096 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007097 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007098 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7099 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7100 Args.AddAllArgs(CmdArgs, options::OPT_init);
7101
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007102 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007103 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007104
Daniel Dunbarc1964212009-03-26 16:23:12 +00007105 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7106 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7107 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7108 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7109 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007110
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007111 if (const Arg *A =
7112 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7113 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007114 if (A->getOption().matches(options::OPT_fpie) ||
7115 A->getOption().matches(options::OPT_fPIE))
7116 CmdArgs.push_back("-pie");
7117 else
7118 CmdArgs.push_back("-no_pie");
7119 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007120
7121 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7122 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7123 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7124 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7125 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7126 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7127 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7128 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7129 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7130 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7131 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7132 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7133 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7134 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7135 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7136 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007137
Daniel Dunbar84384642011-05-02 21:03:47 +00007138 // Give --sysroot= preference, over the Apple specific behavior to also use
7139 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007140 StringRef sysroot = C.getSysRoot();
7141 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007142 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007143 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007144 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7145 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007146 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007147 }
7148
Daniel Dunbarc1964212009-03-26 16:23:12 +00007149 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7150 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7151 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7152 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7153 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007154 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007155 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7156 Args.AddAllArgs(CmdArgs, options::OPT_y);
7157 Args.AddLastArg(CmdArgs, options::OPT_w);
7158 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7159 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7160 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7161 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7162 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7163 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7164 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7165 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7166 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7167 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7168 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7169 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7170}
7171
Douglas Katzman95354292015-06-23 20:42:09 +00007172void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7173 const InputInfo &Output,
7174 const InputInfoList &Inputs,
7175 const ArgList &Args,
7176 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007177 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007178
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007179 // If the number of arguments surpasses the system limits, we will encode the
7180 // input files in a separate file, shortening the command line. To this end,
7181 // build a list of input file names that can be passed via a file with the
7182 // -filelist linker option.
7183 llvm::opt::ArgStringList InputFileList;
7184
Daniel Dunbarc1964212009-03-26 16:23:12 +00007185 // The logic here is derived from gcc's behavior; most of which
7186 // comes from specs (starting with link_command). Consult gcc for
7187 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007188 ArgStringList CmdArgs;
7189
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007190 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7191 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7192 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007193 for (const auto &Arg : Args)
7194 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007195 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007196 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007197 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007198 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007199 return;
7200 }
7201
Daniel Dunbarc1964212009-03-26 16:23:12 +00007202 // I'm not sure why this particular decomposition exists in gcc, but
7203 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007204 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007205
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007206 // It seems that the 'e' option is completely ignored for dynamic executables
7207 // (the default), and with static executables, the last one wins, as expected.
7208 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7209 options::OPT_Z_Flag, options::OPT_u_Group,
7210 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007211
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007212 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7213 // members of static archive libraries which implement Objective-C classes or
7214 // categories.
7215 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7216 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007217
Daniel Dunbarc1964212009-03-26 16:23:12 +00007218 CmdArgs.push_back("-o");
7219 CmdArgs.push_back(Output.getFilename());
7220
Douglas Katzman78b37b02015-11-17 20:28:07 +00007221 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007222 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007223
Peter Collingbournec4122c12015-06-15 21:08:13 +00007224 // SafeStack requires its own runtime libraries
7225 // These libraries should be linked first, to make sure the
7226 // __safestack_init constructor executes before everything else
7227 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7228 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7229 "libclang_rt.safestack_osx.a",
7230 /*AlwaysLink=*/true);
7231 }
7232
Daniel Dunbarc1964212009-03-26 16:23:12 +00007233 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007234
Douglas Gregor9295df02012-05-15 21:00:27 +00007235 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007236 // Build the input file for -filelist (list of linker input files) in case we
7237 // need it later
7238 for (const auto &II : Inputs) {
7239 if (!II.isFilename()) {
7240 // This is a linker input argument.
7241 // We cannot mix input arguments and file names in a -filelist input, thus
7242 // we prematurely stop our list (remaining files shall be passed as
7243 // arguments).
7244 if (InputFileList.size() > 0)
7245 break;
7246
7247 continue;
7248 }
7249
7250 InputFileList.push_back(II.getFilename());
7251 }
7252
Douglas Katzman78b37b02015-11-17 20:28:07 +00007253 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007254 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7255
Douglas Katzman78b37b02015-11-17 20:28:07 +00007256 if (isObjCRuntimeLinked(Args) &&
7257 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007258 // We use arclite library for both ARC and subscripting support.
7259 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7260
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007261 CmdArgs.push_back("-framework");
7262 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007263 // Link libobj.
7264 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007265 }
John McCall31168b02011-06-15 23:02:42 +00007266
Daniel Dunbarc1964212009-03-26 16:23:12 +00007267 if (LinkingOutput) {
7268 CmdArgs.push_back("-arch_multiple");
7269 CmdArgs.push_back("-final_output");
7270 CmdArgs.push_back(LinkingOutput);
7271 }
7272
Daniel Dunbarc1964212009-03-26 16:23:12 +00007273 if (Args.hasArg(options::OPT_fnested_functions))
7274 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007275
Justin Bognerc7701242015-05-12 05:44:36 +00007276 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7277
Douglas Katzman78b37b02015-11-17 20:28:07 +00007278 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007279 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007280 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007281
Daniel Dunbarc1964212009-03-26 16:23:12 +00007282 // link_ssp spec is empty.
7283
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007284 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007285 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007286 }
7287
Douglas Katzman78b37b02015-11-17 20:28:07 +00007288 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007289 // endfile_spec is empty.
7290 }
7291
7292 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7293 Args.AddAllArgs(CmdArgs, options::OPT_F);
7294
Steven Wu3ffb61b2015-02-06 18:08:29 +00007295 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007296 for (const Arg *A : Args.filtered(options::OPT_iframework))
7297 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007298
Douglas Katzman78b37b02015-11-17 20:28:07 +00007299 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007300 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7301 if (A->getValue() == StringRef("Accelerate")) {
7302 CmdArgs.push_back("-framework");
7303 CmdArgs.push_back("Accelerate");
7304 }
7305 }
7306 }
7307
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007308 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007309 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007310 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007311 Cmd->setInputFileList(std::move(InputFileList));
7312 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007313}
7314
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007315void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007316 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007317 const InputInfoList &Inputs,
7318 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007319 const char *LinkingOutput) const {
7320 ArgStringList CmdArgs;
7321
7322 CmdArgs.push_back("-create");
7323 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007324
7325 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007326 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007327
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007328 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007329 assert(II.isFilename() && "Unexpected lipo input.");
7330 CmdArgs.push_back(II.getFilename());
7331 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007332
7333 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007334 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007335}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007336
Daniel Dunbar88299622010-06-04 18:28:36 +00007337void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007338 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007339 const InputInfoList &Inputs,
7340 const ArgList &Args,
7341 const char *LinkingOutput) const {
7342 ArgStringList CmdArgs;
7343
Daniel Dunbareb86b042011-05-09 17:23:16 +00007344 CmdArgs.push_back("-o");
7345 CmdArgs.push_back(Output.getFilename());
7346
Daniel Dunbar88299622010-06-04 18:28:36 +00007347 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7348 const InputInfo &Input = Inputs[0];
7349 assert(Input.isFilename() && "Unexpected dsymutil input.");
7350 CmdArgs.push_back(Input.getFilename());
7351
Daniel Dunbar88299622010-06-04 18:28:36 +00007352 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007353 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007355}
7356
Eric Christopher551ef452011-08-23 17:56:55 +00007357void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007358 const InputInfo &Output,
7359 const InputInfoList &Inputs,
7360 const ArgList &Args,
7361 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007362 ArgStringList CmdArgs;
7363 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007364 CmdArgs.push_back("--debug-info");
7365 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007366 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007367
7368 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7369 const InputInfo &Input = Inputs[0];
7370 assert(Input.isFilename() && "Unexpected verify input");
7371
7372 // Grabbing the output of the earlier dsymutil run.
7373 CmdArgs.push_back(Input.getFilename());
7374
7375 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007376 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007377 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007378}
7379
Douglas Katzman95354292015-06-23 20:42:09 +00007380void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007381 const InputInfo &Output,
7382 const InputInfoList &Inputs,
7383 const ArgList &Args,
7384 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007385 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007386 ArgStringList CmdArgs;
7387
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007388 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007389
7390 CmdArgs.push_back("-o");
7391 CmdArgs.push_back(Output.getFilename());
7392
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007393 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007394 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007395
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007396 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007398}
7399
Douglas Katzman95354292015-06-23 20:42:09 +00007400void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7401 const InputInfo &Output,
7402 const InputInfoList &Inputs,
7403 const ArgList &Args,
7404 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007405 ArgStringList CmdArgs;
7406
David Chisnall272a0712012-02-29 15:06:12 +00007407 // Demangle C++ names in errors
7408 CmdArgs.push_back("-C");
7409
Douglas Katzman78b37b02015-11-17 20:28:07 +00007410 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007411 CmdArgs.push_back("-e");
7412 CmdArgs.push_back("_start");
7413 }
7414
7415 if (Args.hasArg(options::OPT_static)) {
7416 CmdArgs.push_back("-Bstatic");
7417 CmdArgs.push_back("-dn");
7418 } else {
7419 CmdArgs.push_back("-Bdynamic");
7420 if (Args.hasArg(options::OPT_shared)) {
7421 CmdArgs.push_back("-shared");
7422 } else {
7423 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007424 CmdArgs.push_back(
7425 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007426 }
7427 }
7428
7429 if (Output.isFilename()) {
7430 CmdArgs.push_back("-o");
7431 CmdArgs.push_back(Output.getFilename());
7432 } else {
7433 assert(Output.isNothing() && "Invalid output.");
7434 }
7435
Douglas Katzman78b37b02015-11-17 20:28:07 +00007436 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007437 if (!Args.hasArg(options::OPT_shared))
7438 CmdArgs.push_back(
7439 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7440
7441 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7442 CmdArgs.push_back(
7443 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7444 CmdArgs.push_back(
7445 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007446 }
7447
Douglas Katzman6059ef92015-11-17 17:41:23 +00007448 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007449
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007450 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7451 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007452
7453 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7454
Douglas Katzman78b37b02015-11-17 20:28:07 +00007455 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007456 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007457 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007458 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007459 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007460 if (!Args.hasArg(options::OPT_shared)) {
7461 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007462 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007463 }
David Chisnallf571cde2012-02-15 13:39:01 +00007464 }
7465
Douglas Katzman78b37b02015-11-17 20:28:07 +00007466 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007467 CmdArgs.push_back(
7468 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007469 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007470 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007471
Xinliang David Li69306c02015-10-22 06:15:31 +00007472 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007475 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007476}
7477
Douglas Katzman95354292015-06-23 20:42:09 +00007478void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7479 const InputInfo &Output,
7480 const InputInfoList &Inputs,
7481 const ArgList &Args,
7482 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007483 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007484 ArgStringList CmdArgs;
7485
Rafael Espindolacc126272014-02-28 01:55:21 +00007486 switch (getToolChain().getArch()) {
7487 case llvm::Triple::x86:
7488 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7489 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007490 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007491 break;
7492
7493 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007494 CmdArgs.push_back("-mppc");
7495 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007496 break;
7497
7498 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007499 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007500 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007501 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7502 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7503 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007504 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007505 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007506
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007507 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007508 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007509 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7510 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7511 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007512 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007513 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007514
7515 case llvm::Triple::mips64:
7516 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007517 StringRef CPUName;
7518 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007519 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007520
7521 CmdArgs.push_back("-mabi");
7522 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7523
7524 if (getToolChain().getArch() == llvm::Triple::mips64)
7525 CmdArgs.push_back("-EB");
7526 else
7527 CmdArgs.push_back("-EL");
7528
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007529 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007530 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007531 }
7532
Rafael Espindolacc126272014-02-28 01:55:21 +00007533 default:
7534 break;
7535 }
7536
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007537 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007538
7539 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007540 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007541
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007542 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007543 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007544
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007545 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007547}
7548
Douglas Katzman95354292015-06-23 20:42:09 +00007549void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7550 const InputInfo &Output,
7551 const InputInfoList &Inputs,
7552 const ArgList &Args,
7553 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007554 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007555 ArgStringList CmdArgs;
7556
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007557 // Silence warning for "clang -g foo.o -o foo"
7558 Args.ClaimAllArgs(options::OPT_g_Group);
7559 // and "clang -emit-llvm foo.o -o foo"
7560 Args.ClaimAllArgs(options::OPT_emit_llvm);
7561 // and for "clang -w foo.o -o foo". Other warning options are already
7562 // handled somewhere else.
7563 Args.ClaimAllArgs(options::OPT_w);
7564
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007565 if (getToolChain().getArch() == llvm::Triple::mips64)
7566 CmdArgs.push_back("-EB");
7567 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7568 CmdArgs.push_back("-EL");
7569
Douglas Katzman78b37b02015-11-17 20:28:07 +00007570 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007571 CmdArgs.push_back("-e");
7572 CmdArgs.push_back("__start");
7573 }
7574
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007575 if (Args.hasArg(options::OPT_static)) {
7576 CmdArgs.push_back("-Bstatic");
7577 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007578 if (Args.hasArg(options::OPT_rdynamic))
7579 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007580 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007581 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007582 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007583 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007584 } else {
7585 CmdArgs.push_back("-dynamic-linker");
7586 CmdArgs.push_back("/usr/libexec/ld.so");
7587 }
7588 }
7589
Rafael Espindola044f7832013-06-05 04:28:55 +00007590 if (Args.hasArg(options::OPT_nopie))
7591 CmdArgs.push_back("-nopie");
7592
Daniel Dunbarb440f562010-08-02 02:38:21 +00007593 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007594 CmdArgs.push_back("-o");
7595 CmdArgs.push_back(Output.getFilename());
7596 } else {
7597 assert(Output.isNothing() && "Invalid output.");
7598 }
7599
Douglas Katzman78b37b02015-11-17 20:28:07 +00007600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007601 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007602 if (Args.hasArg(options::OPT_pg))
7603 CmdArgs.push_back(
7604 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007605 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007606 CmdArgs.push_back(
7607 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7608 CmdArgs.push_back(
7609 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007610 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007611 CmdArgs.push_back(
7612 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007613 }
7614 }
7615
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007616 std::string Triple = getToolChain().getTripleString();
7617 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007618 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 CmdArgs.push_back(
7620 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007621
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007622 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7623 options::OPT_e, options::OPT_s, options::OPT_t,
7624 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007625
Daniel Dunbar54423b22010-09-17 00:24:54 +00007626 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007627
Douglas Katzman78b37b02015-11-17 20:28:07 +00007628 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007629 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007630 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007632 CmdArgs.push_back("-lm_p");
7633 else
7634 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007635 }
7636
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007637 // FIXME: For some reason GCC passes -lgcc before adding
7638 // the default system libraries. Just mimic this for now.
7639 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007640
Eric Christopher17674ec2012-09-13 06:32:34 +00007641 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007642 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7643 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007644 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007646 }
7647
Chandler Carruth45661652011-12-17 22:32:42 +00007648 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007649 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007650 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007651 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007652 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007653 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007654
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007655 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007656 }
7657
Douglas Katzman78b37b02015-11-17 20:28:07 +00007658 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007659 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007660 CmdArgs.push_back(
7661 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007662 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007663 CmdArgs.push_back(
7664 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007665 }
7666
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007667 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007668 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007669}
Ed Schoutene33194b2009-04-02 19:13:12 +00007670
Douglas Katzman95354292015-06-23 20:42:09 +00007671void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7672 const InputInfo &Output,
7673 const InputInfoList &Inputs,
7674 const ArgList &Args,
7675 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007676 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007677 ArgStringList CmdArgs;
7678
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007679 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007680
7681 CmdArgs.push_back("-o");
7682 CmdArgs.push_back(Output.getFilename());
7683
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007684 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007685 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007686
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007687 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007688 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007689}
7690
Douglas Katzman95354292015-06-23 20:42:09 +00007691void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7692 const InputInfo &Output,
7693 const InputInfoList &Inputs,
7694 const ArgList &Args,
7695 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007696 const Driver &D = getToolChain().getDriver();
7697 ArgStringList CmdArgs;
7698
Douglas Katzman78b37b02015-11-17 20:28:07 +00007699 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007700 CmdArgs.push_back("-e");
7701 CmdArgs.push_back("__start");
7702 }
7703
7704 if (Args.hasArg(options::OPT_static)) {
7705 CmdArgs.push_back("-Bstatic");
7706 } else {
7707 if (Args.hasArg(options::OPT_rdynamic))
7708 CmdArgs.push_back("-export-dynamic");
7709 CmdArgs.push_back("--eh-frame-hdr");
7710 CmdArgs.push_back("-Bdynamic");
7711 if (Args.hasArg(options::OPT_shared)) {
7712 CmdArgs.push_back("-shared");
7713 } else {
7714 CmdArgs.push_back("-dynamic-linker");
7715 CmdArgs.push_back("/usr/libexec/ld.so");
7716 }
7717 }
7718
7719 if (Output.isFilename()) {
7720 CmdArgs.push_back("-o");
7721 CmdArgs.push_back(Output.getFilename());
7722 } else {
7723 assert(Output.isNothing() && "Invalid output.");
7724 }
7725
Douglas Katzman78b37b02015-11-17 20:28:07 +00007726 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007727 if (!Args.hasArg(options::OPT_shared)) {
7728 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007729 CmdArgs.push_back(
7730 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007731 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007732 CmdArgs.push_back(
7733 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7734 CmdArgs.push_back(
7735 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007736 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007737 CmdArgs.push_back(
7738 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007739 }
7740 }
7741
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007742 Args.AddAllArgs(CmdArgs,
7743 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007744
7745 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7746
Douglas Katzman78b37b02015-11-17 20:28:07 +00007747 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007748 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007749 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7750 if (Args.hasArg(options::OPT_pg))
7751 CmdArgs.push_back("-lm_p");
7752 else
7753 CmdArgs.push_back("-lm");
7754 }
7755
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007756 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007757 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007758 CmdArgs.push_back("-lpthread_p");
7759 else
7760 CmdArgs.push_back("-lpthread");
7761 }
7762
Eli Friedman9fa28852012-08-08 23:57:20 +00007763 if (!Args.hasArg(options::OPT_shared)) {
7764 if (Args.hasArg(options::OPT_pg))
7765 CmdArgs.push_back("-lc_p");
7766 else
7767 CmdArgs.push_back("-lc");
7768 }
7769
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007770 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007771 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007772 case llvm::Triple::arm:
7773 MyArch = "arm";
7774 break;
7775 case llvm::Triple::x86:
7776 MyArch = "i386";
7777 break;
7778 case llvm::Triple::x86_64:
7779 MyArch = "amd64";
7780 break;
7781 default:
7782 llvm_unreachable("Unsupported architecture");
7783 }
7784 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007785 }
7786
Douglas Katzman78b37b02015-11-17 20:28:07 +00007787 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007788 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007789 CmdArgs.push_back(
7790 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007791 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007792 CmdArgs.push_back(
7793 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007794 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007796 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007797 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007798}
7799
Douglas Katzman95354292015-06-23 20:42:09 +00007800void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7801 const InputInfo &Output,
7802 const InputInfoList &Inputs,
7803 const ArgList &Args,
7804 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007805 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007806 ArgStringList CmdArgs;
7807
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007808 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7809 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007810 switch (getToolChain().getArch()) {
7811 default:
7812 break;
7813 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007814 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007815 break;
7816 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007817 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007818 break;
7819 case llvm::Triple::mips:
7820 case llvm::Triple::mipsel:
7821 case llvm::Triple::mips64:
7822 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007823 StringRef CPUName;
7824 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007825 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007826
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007827 CmdArgs.push_back("-march");
7828 CmdArgs.push_back(CPUName.data());
7829
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007830 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007831 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007832
7833 if (getToolChain().getArch() == llvm::Triple::mips ||
7834 getToolChain().getArch() == llvm::Triple::mips64)
7835 CmdArgs.push_back("-EB");
7836 else
7837 CmdArgs.push_back("-EL");
7838
Dimitry Andric46f338c2015-12-27 10:36:44 +00007839 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7840 StringRef v = A->getValue();
7841 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7842 A->claim();
7843 }
7844
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007845 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007846 break;
7847 }
7848 case llvm::Triple::arm:
7849 case llvm::Triple::armeb:
7850 case llvm::Triple::thumb:
7851 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007852 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007853
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007854 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007855 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007856 else
Renato Golinf4421f72014-02-19 10:44:07 +00007857 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007858
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007859 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007860 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007861 case llvm::Triple::GNUEABI:
7862 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007863 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007864 break;
7865
7866 default:
7867 CmdArgs.push_back("-matpcs");
7868 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007869 break;
7870 }
7871 case llvm::Triple::sparc:
7872 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007873 case llvm::Triple::sparcv9: {
7874 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7875 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007876 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007877 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007878 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007879 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007881 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007882
7883 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007884 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007886 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007887 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007888
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007889 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007890 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007891}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007892
Douglas Katzman95354292015-06-23 20:42:09 +00007893void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7894 const InputInfo &Output,
7895 const InputInfoList &Inputs,
7896 const ArgList &Args,
7897 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007898 const toolchains::FreeBSD &ToolChain =
7899 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007900 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007901 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007902 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007903 !Args.hasArg(options::OPT_shared) &&
7904 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007905 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007906
7907 // Silence warning for "clang -g foo.o -o foo"
7908 Args.ClaimAllArgs(options::OPT_g_Group);
7909 // and "clang -emit-llvm foo.o -o foo"
7910 Args.ClaimAllArgs(options::OPT_emit_llvm);
7911 // and for "clang -w foo.o -o foo". Other warning options are already
7912 // handled somewhere else.
7913 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007914
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007915 if (!D.SysRoot.empty())
7916 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7917
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007918 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007919 CmdArgs.push_back("-pie");
7920
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007921 if (Args.hasArg(options::OPT_static)) {
7922 CmdArgs.push_back("-Bstatic");
7923 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007924 if (Args.hasArg(options::OPT_rdynamic))
7925 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007926 CmdArgs.push_back("--eh-frame-hdr");
7927 if (Args.hasArg(options::OPT_shared)) {
7928 CmdArgs.push_back("-Bshareable");
7929 } else {
7930 CmdArgs.push_back("-dynamic-linker");
7931 CmdArgs.push_back("/libexec/ld-elf.so.1");
7932 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007933 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007934 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7935 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7936 CmdArgs.push_back("--hash-style=both");
7937 }
7938 }
7939 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007940 }
7941
7942 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7943 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007944 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007945 CmdArgs.push_back("-m");
7946 CmdArgs.push_back("elf_i386_fbsd");
7947 }
7948
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007949 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007950 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007951 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007952 }
7953
Dimitry Andric904895f2015-12-27 06:47:09 +00007954 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7955 if (ToolChain.getArch() == llvm::Triple::mips ||
7956 ToolChain.getArch() == llvm::Triple::mipsel ||
7957 ToolChain.getArch() == llvm::Triple::mips64 ||
7958 ToolChain.getArch() == llvm::Triple::mips64el) {
7959 StringRef v = A->getValue();
7960 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7961 A->claim();
7962 }
7963 }
7964
Daniel Dunbarb440f562010-08-02 02:38:21 +00007965 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007966 CmdArgs.push_back("-o");
7967 CmdArgs.push_back(Output.getFilename());
7968 } else {
7969 assert(Output.isNothing() && "Invalid output.");
7970 }
7971
Douglas Katzman78b37b02015-11-17 20:28:07 +00007972 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007973 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007974 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007975 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007976 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007977 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007978 crt1 = "Scrt1.o";
7979 else
7980 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007981 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007982 if (crt1)
7983 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7984
7985 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7986
Craig Topper92fc2df2014-05-17 16:56:41 +00007987 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007988 if (Args.hasArg(options::OPT_static))
7989 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007990 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007991 crtbegin = "crtbeginS.o";
7992 else
7993 crtbegin = "crtbegin.o";
7994
7995 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007996 }
7997
7998 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007999 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008000 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8001 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008002 Args.AddAllArgs(CmdArgs, options::OPT_s);
8003 Args.AddAllArgs(CmdArgs, options::OPT_t);
8004 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8005 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008006
Teresa Johnson945bc502015-10-15 20:35:53 +00008007 if (D.isUsingLTO())
8008 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008009
Alexey Samsonov52550342014-09-15 19:58:40 +00008010 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008011 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008012
Douglas Katzman78b37b02015-11-17 20:28:07 +00008013 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008014 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008015 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008016 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008017 if (Args.hasArg(options::OPT_pg))
8018 CmdArgs.push_back("-lm_p");
8019 else
8020 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008021 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008022 if (NeedsSanitizerDeps)
8023 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008024 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8025 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008026 if (Args.hasArg(options::OPT_pg))
8027 CmdArgs.push_back("-lgcc_p");
8028 else
8029 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008030 if (Args.hasArg(options::OPT_static)) {
8031 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008032 } else if (Args.hasArg(options::OPT_pg)) {
8033 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008034 } else {
8035 CmdArgs.push_back("--as-needed");
8036 CmdArgs.push_back("-lgcc_s");
8037 CmdArgs.push_back("--no-as-needed");
8038 }
8039
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008040 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008041 if (Args.hasArg(options::OPT_pg))
8042 CmdArgs.push_back("-lpthread_p");
8043 else
8044 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008045 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008046
Roman Divacky66f22762011-02-10 16:59:40 +00008047 if (Args.hasArg(options::OPT_pg)) {
8048 if (Args.hasArg(options::OPT_shared))
8049 CmdArgs.push_back("-lc");
8050 else
8051 CmdArgs.push_back("-lc_p");
8052 CmdArgs.push_back("-lgcc_p");
8053 } else {
8054 CmdArgs.push_back("-lc");
8055 CmdArgs.push_back("-lgcc");
8056 }
8057
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008058 if (Args.hasArg(options::OPT_static)) {
8059 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008060 } else if (Args.hasArg(options::OPT_pg)) {
8061 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008062 } else {
8063 CmdArgs.push_back("--as-needed");
8064 CmdArgs.push_back("-lgcc_s");
8065 CmdArgs.push_back("--no-as-needed");
8066 }
8067 }
8068
Douglas Katzman78b37b02015-11-17 20:28:07 +00008069 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008070 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008071 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008072 else
8073 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008074 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008075 }
8076
Xinliang David Li69306c02015-10-22 06:15:31 +00008077 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008078
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008079 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008080 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008081}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008082
Douglas Katzman95354292015-06-23 20:42:09 +00008083void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008084 const InputInfo &Output,
8085 const InputInfoList &Inputs,
8086 const ArgList &Args,
8087 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008088 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008089 ArgStringList CmdArgs;
8090
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008091 // GNU as needs different flags for creating the correct output format
8092 // on architectures with different ABIs or optional feature sets.
8093 switch (getToolChain().getArch()) {
8094 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008095 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008096 break;
8097 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008098 case llvm::Triple::armeb:
8099 case llvm::Triple::thumb:
8100 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008101 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008102 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8103 std::string Arch =
8104 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008105 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008106 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008107 }
8108
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008109 case llvm::Triple::mips:
8110 case llvm::Triple::mipsel:
8111 case llvm::Triple::mips64:
8112 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008113 StringRef CPUName;
8114 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008115 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008116
8117 CmdArgs.push_back("-march");
8118 CmdArgs.push_back(CPUName.data());
8119
8120 CmdArgs.push_back("-mabi");
8121 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8122
8123 if (getToolChain().getArch() == llvm::Triple::mips ||
8124 getToolChain().getArch() == llvm::Triple::mips64)
8125 CmdArgs.push_back("-EB");
8126 else
8127 CmdArgs.push_back("-EL");
8128
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008129 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008130 break;
8131 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008132
8133 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008134 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008135 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008136 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8137 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008138 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008139 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008140 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008141
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008142 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008143 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008144 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8145 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008146 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008147 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008148 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008149
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008150 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008151 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008152 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008154 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008155
8156 CmdArgs.push_back("-o");
8157 CmdArgs.push_back(Output.getFilename());
8158
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008159 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008160 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008161
David Chisnallddbd68f2011-09-27 22:03:18 +00008162 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008163 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008164}
8165
Douglas Katzman95354292015-06-23 20:42:09 +00008166void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8167 const InputInfo &Output,
8168 const InputInfoList &Inputs,
8169 const ArgList &Args,
8170 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008171 const Driver &D = getToolChain().getDriver();
8172 ArgStringList CmdArgs;
8173
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008174 if (!D.SysRoot.empty())
8175 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8176
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008177 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008178 if (Args.hasArg(options::OPT_static)) {
8179 CmdArgs.push_back("-Bstatic");
8180 } else {
8181 if (Args.hasArg(options::OPT_rdynamic))
8182 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008183 if (Args.hasArg(options::OPT_shared)) {
8184 CmdArgs.push_back("-Bshareable");
8185 } else {
8186 CmdArgs.push_back("-dynamic-linker");
8187 CmdArgs.push_back("/libexec/ld.elf_so");
8188 }
8189 }
8190
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008191 // Many NetBSD architectures support more than one ABI.
8192 // Determine the correct emulation for ld.
8193 switch (getToolChain().getArch()) {
8194 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008195 CmdArgs.push_back("-m");
8196 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008197 break;
8198 case llvm::Triple::arm:
8199 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008200 CmdArgs.push_back("-m");
8201 switch (getToolChain().getTriple().getEnvironment()) {
8202 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008203 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008204 CmdArgs.push_back("armelf_nbsd_eabi");
8205 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008206 case llvm::Triple::EABIHF:
8207 case llvm::Triple::GNUEABIHF:
8208 CmdArgs.push_back("armelf_nbsd_eabihf");
8209 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008210 default:
8211 CmdArgs.push_back("armelf_nbsd");
8212 break;
8213 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008214 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008215 case llvm::Triple::armeb:
8216 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008217 arm::appendEBLinkFlags(
8218 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008219 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008220 CmdArgs.push_back("-m");
8221 switch (getToolChain().getTriple().getEnvironment()) {
8222 case llvm::Triple::EABI:
8223 case llvm::Triple::GNUEABI:
8224 CmdArgs.push_back("armelfb_nbsd_eabi");
8225 break;
8226 case llvm::Triple::EABIHF:
8227 case llvm::Triple::GNUEABIHF:
8228 CmdArgs.push_back("armelfb_nbsd_eabihf");
8229 break;
8230 default:
8231 CmdArgs.push_back("armelfb_nbsd");
8232 break;
8233 }
8234 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008235 case llvm::Triple::mips64:
8236 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008237 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008238 CmdArgs.push_back("-m");
8239 if (getToolChain().getArch() == llvm::Triple::mips64)
8240 CmdArgs.push_back("elf32btsmip");
8241 else
8242 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008243 } else if (mips::hasMipsAbiArg(Args, "64")) {
8244 CmdArgs.push_back("-m");
8245 if (getToolChain().getArch() == llvm::Triple::mips64)
8246 CmdArgs.push_back("elf64btsmip");
8247 else
8248 CmdArgs.push_back("elf64ltsmip");
8249 }
8250 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008251 case llvm::Triple::ppc:
8252 CmdArgs.push_back("-m");
8253 CmdArgs.push_back("elf32ppc_nbsd");
8254 break;
8255
8256 case llvm::Triple::ppc64:
8257 case llvm::Triple::ppc64le:
8258 CmdArgs.push_back("-m");
8259 CmdArgs.push_back("elf64ppc");
8260 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008261
8262 case llvm::Triple::sparc:
8263 CmdArgs.push_back("-m");
8264 CmdArgs.push_back("elf32_sparc");
8265 break;
8266
8267 case llvm::Triple::sparcv9:
8268 CmdArgs.push_back("-m");
8269 CmdArgs.push_back("elf64_sparc");
8270 break;
8271
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008272 default:
8273 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008274 }
8275
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008276 if (Output.isFilename()) {
8277 CmdArgs.push_back("-o");
8278 CmdArgs.push_back(Output.getFilename());
8279 } else {
8280 assert(Output.isNothing() && "Invalid output.");
8281 }
8282
Douglas Katzman78b37b02015-11-17 20:28:07 +00008283 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008284 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008285 CmdArgs.push_back(
8286 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8287 CmdArgs.push_back(
8288 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8289 CmdArgs.push_back(
8290 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008291 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008292 CmdArgs.push_back(
8293 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8294 CmdArgs.push_back(
8295 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008296 }
8297 }
8298
8299 Args.AddAllArgs(CmdArgs, options::OPT_L);
8300 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8301 Args.AddAllArgs(CmdArgs, options::OPT_e);
8302 Args.AddAllArgs(CmdArgs, options::OPT_s);
8303 Args.AddAllArgs(CmdArgs, options::OPT_t);
8304 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8305 Args.AddAllArgs(CmdArgs, options::OPT_r);
8306
8307 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8308
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008309 unsigned Major, Minor, Micro;
8310 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8311 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008312 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008313 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008314 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008315 case llvm::Triple::arm:
8316 case llvm::Triple::armeb:
8317 case llvm::Triple::thumb:
8318 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008319 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008320 case llvm::Triple::ppc64:
8321 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008322 case llvm::Triple::x86:
8323 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008324 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008325 break;
8326 default:
8327 break;
8328 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008329 }
8330
Douglas Katzman78b37b02015-11-17 20:28:07 +00008331 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008332 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008333 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008334 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8335 CmdArgs.push_back("-lm");
8336 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008337 if (Args.hasArg(options::OPT_pthread))
8338 CmdArgs.push_back("-lpthread");
8339 CmdArgs.push_back("-lc");
8340
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008341 if (useLibgcc) {
8342 if (Args.hasArg(options::OPT_static)) {
8343 // libgcc_eh depends on libc, so resolve as much as possible,
8344 // pull in any new requirements from libc and then get the rest
8345 // of libgcc.
8346 CmdArgs.push_back("-lgcc_eh");
8347 CmdArgs.push_back("-lc");
8348 CmdArgs.push_back("-lgcc");
8349 } else {
8350 CmdArgs.push_back("-lgcc");
8351 CmdArgs.push_back("--as-needed");
8352 CmdArgs.push_back("-lgcc_s");
8353 CmdArgs.push_back("--no-as-needed");
8354 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008355 }
8356 }
8357
Douglas Katzman78b37b02015-11-17 20:28:07 +00008358 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008359 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008360 CmdArgs.push_back(
8361 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008362 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008363 CmdArgs.push_back(
8364 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8365 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008366 }
8367
Xinliang David Li69306c02015-10-22 06:15:31 +00008368 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008369
Logan Chieneb9162f2014-06-26 14:23:45 +00008370 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008371 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008372}
8373
Douglas Katzman95354292015-06-23 20:42:09 +00008374void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8375 const InputInfo &Output,
8376 const InputInfoList &Inputs,
8377 const ArgList &Args,
8378 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008379 claimNoWarnArgs(Args);
8380
James Y Knight2db38f32015-08-15 03:45:25 +00008381 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8382 llvm::Triple Triple = llvm::Triple(TripleStr);
8383
Rafael Espindola92b00932010-08-10 00:25:48 +00008384 ArgStringList CmdArgs;
8385
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008386 llvm::Reloc::Model RelocationModel;
8387 unsigned PICLevel;
8388 bool IsPIE;
8389 std::tie(RelocationModel, PICLevel, IsPIE) =
8390 ParsePICArgs(getToolChain(), Triple, Args);
8391
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008392 switch (getToolChain().getArch()) {
8393 default:
8394 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008395 // Add --32/--64 to make sure we get the format we want.
8396 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008397 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008398 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008399 break;
8400 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008401 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8402 CmdArgs.push_back("--x32");
8403 else
8404 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008405 break;
8406 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008407 CmdArgs.push_back("-a32");
8408 CmdArgs.push_back("-mppc");
8409 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008410 break;
8411 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008412 CmdArgs.push_back("-a64");
8413 CmdArgs.push_back("-mppc64");
8414 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008415 break;
8416 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008417 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008418 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008419 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008420 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008421 break;
8422 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008423 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008424 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008425 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8426 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8427 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008428 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008429 }
8430 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008431 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008432 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8433 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8434 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008435 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008436 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008437 case llvm::Triple::arm:
8438 case llvm::Triple::armeb:
8439 case llvm::Triple::thumb:
8440 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008441 const llvm::Triple &Triple2 = getToolChain().getTriple();
8442 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008443 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008444 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008445 break;
8446 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008447 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008448 break;
8449 default:
8450 break;
8451 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008452
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008453 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008454 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8455 case arm::FloatABI::Soft:
8456 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8457 break;
8458 case arm::FloatABI::SoftFP:
8459 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8460 break;
8461 case arm::FloatABI::Hard:
8462 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8463 break;
8464 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008465
8466 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008467
8468 // FIXME: remove krait check when GNU tools support krait cpu
8469 // for now replace it with -march=armv7-a to avoid a lower
8470 // march from being picked in the absence of a cpu flag.
8471 Arg *A;
8472 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008473 StringRef(A->getValue()).lower() == "krait")
8474 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008475 else
8476 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008477 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008478 break;
8479 }
8480 case llvm::Triple::mips:
8481 case llvm::Triple::mipsel:
8482 case llvm::Triple::mips64:
8483 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008484 StringRef CPUName;
8485 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008486 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008487 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008488
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008489 CmdArgs.push_back("-march");
8490 CmdArgs.push_back(CPUName.data());
8491
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008492 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008493 CmdArgs.push_back(ABIName.data());
8494
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008495 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8496 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008497 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008498 CmdArgs.push_back("-mno-shared");
8499
Daniel Sanders379d44b2014-07-16 11:52:23 +00008500 // LLVM doesn't support -mplt yet and acts as if it is always given.
8501 // However, -mplt has no effect with the N64 ABI.
8502 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008503
8504 if (getToolChain().getArch() == llvm::Triple::mips ||
8505 getToolChain().getArch() == llvm::Triple::mips64)
8506 CmdArgs.push_back("-EB");
8507 else
8508 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008509
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008510 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8511 if (StringRef(A->getValue()) == "2008")
8512 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8513 }
8514
Daniel Sanders379d44b2014-07-16 11:52:23 +00008515 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8516 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8517 options::OPT_mfp64)) {
8518 A->claim();
8519 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008520 } else if (mips::shouldUseFPXX(
8521 Args, getToolChain().getTriple(), CPUName, ABIName,
8522 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008523 CmdArgs.push_back("-mfpxx");
8524
8525 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8526 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008527 if (Arg *A =
8528 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008529 if (A->getOption().matches(options::OPT_mips16)) {
8530 A->claim();
8531 A->render(Args, CmdArgs);
8532 } else {
8533 A->claim();
8534 CmdArgs.push_back("-no-mips16");
8535 }
8536 }
8537
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008538 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8539 options::OPT_mno_micromips);
8540 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8541 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8542
Simon Atanasyanbd986632013-11-26 11:58:04 +00008543 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8544 // Do not use AddLastArg because not all versions of MIPS assembler
8545 // support -mmsa / -mno-msa options.
8546 if (A->getOption().matches(options::OPT_mmsa))
8547 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8548 }
8549
Daniel Sanders379d44b2014-07-16 11:52:23 +00008550 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8551 options::OPT_msoft_float);
8552
Toma Tabacub36d6102015-06-11 12:13:18 +00008553 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8554 options::OPT_msingle_float);
8555
Daniel Sanders379d44b2014-07-16 11:52:23 +00008556 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8557 options::OPT_mno_odd_spreg);
8558
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008559 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008560 break;
8561 }
8562 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008563 // Always pass an -march option, since our default of z10 is later
8564 // than the GNU assembler's default.
8565 StringRef CPUName = getSystemZTargetCPU(Args);
8566 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008567 break;
8568 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008569 }
8570
Renato Golina74bbc72015-07-22 15:32:36 +00008571 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008572 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008573
8574 CmdArgs.push_back("-o");
8575 CmdArgs.push_back(Output.getFilename());
8576
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008577 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008578 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008579
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008580 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008581 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008582
8583 // Handle the debug info splitting at object creation time if we're
8584 // creating an object.
8585 // TODO: Currently only works on linux with newer objcopy.
8586 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008587 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008588 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008589 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008590}
8591
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008592static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008593 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008594 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008595 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008596 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8597 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008598 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008599 CmdArgs.push_back("-lgcc");
8600
Logan Chien3d3373c2012-11-19 12:04:11 +00008601 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008602 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008603 CmdArgs.push_back("-lgcc");
8604 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008605 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008606 CmdArgs.push_back("--as-needed");
8607 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008608 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008609 CmdArgs.push_back("--no-as-needed");
8610 }
8611
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008612 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008613 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008614 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008615 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008616
8617 // According to Android ABI, we have to link with libdl if we are
8618 // linking with non-static libgcc.
8619 //
8620 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8621 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8622 if (isAndroid && !StaticLibgcc)
8623 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008624}
8625
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008626static std::string getLinuxDynamicLinker(const ArgList &Args,
8627 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008628 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8629
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008630 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008631 if (ToolChain.getTriple().isArch64Bit())
8632 return "/system/bin/linker64";
8633 else
8634 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008635 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8636 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008637 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008638 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008639 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008640 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008641 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008642 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008643 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008644 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008645 return "/lib/ld-linux-armhf.so.3";
8646 else
8647 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008648 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8649 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008650 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008651 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008652 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008653 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008654 return "/lib/ld-linux.so.3";
8655 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8656 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008657 std::string LibDir =
8658 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008659 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008660 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008661 if (mips::isUCLibc(Args))
8662 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008663 else if (!ToolChain.getTriple().hasEnvironment()) {
8664 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8665 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8666 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8667 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008668 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008669
8670 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008671 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008672 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008673 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008674 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8675 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008676 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008677 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008678 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8679 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008680 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008681 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008682 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008683 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008684 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008685 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008686 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8687 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008688 else
8689 return "/lib64/ld-linux-x86-64.so.2";
8690}
8691
Renato Golinc4b49242014-02-13 10:01:16 +00008692static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008693 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008694 // Make use of compiler-rt if --rtlib option is used
8695 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8696
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008697 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008698 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008699 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008700 default:
8701 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008702 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008703 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008704 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008705 break;
8706 }
Renato Golinc4b49242014-02-13 10:01:16 +00008707 break;
8708 case ToolChain::RLT_Libgcc:
8709 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8710 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008711 }
8712}
8713
Rafael Espindola1e085772014-08-15 17:14:35 +00008714static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8715 switch (T.getArch()) {
8716 case llvm::Triple::x86:
8717 return "elf_i386";
8718 case llvm::Triple::aarch64:
8719 return "aarch64linux";
8720 case llvm::Triple::aarch64_be:
8721 return "aarch64_be_linux";
8722 case llvm::Triple::arm:
8723 case llvm::Triple::thumb:
8724 return "armelf_linux_eabi";
8725 case llvm::Triple::armeb:
8726 case llvm::Triple::thumbeb:
8727 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8728 case llvm::Triple::ppc:
8729 return "elf32ppclinux";
8730 case llvm::Triple::ppc64:
8731 return "elf64ppc";
8732 case llvm::Triple::ppc64le:
8733 return "elf64lppc";
8734 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008735 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008736 return "elf32_sparc";
8737 case llvm::Triple::sparcv9:
8738 return "elf64_sparc";
8739 case llvm::Triple::mips:
8740 return "elf32btsmip";
8741 case llvm::Triple::mipsel:
8742 return "elf32ltsmip";
8743 case llvm::Triple::mips64:
8744 if (mips::hasMipsAbiArg(Args, "n32"))
8745 return "elf32btsmipn32";
8746 return "elf64btsmip";
8747 case llvm::Triple::mips64el:
8748 if (mips::hasMipsAbiArg(Args, "n32"))
8749 return "elf32ltsmipn32";
8750 return "elf64ltsmip";
8751 case llvm::Triple::systemz:
8752 return "elf64_s390";
8753 case llvm::Triple::x86_64:
8754 if (T.getEnvironment() == llvm::Triple::GNUX32)
8755 return "elf32_x86_64";
8756 return "elf_x86_64";
8757 default:
8758 llvm_unreachable("Unexpected arch");
8759 }
8760}
8761
Douglas Katzman95354292015-06-23 20:42:09 +00008762void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8763 const InputInfo &Output,
8764 const InputInfoList &Inputs,
8765 const ArgList &Args,
8766 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008767 const toolchains::Linux &ToolChain =
8768 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008769 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008770
8771 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8772 llvm::Triple Triple = llvm::Triple(TripleStr);
8773
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008774 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008775 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008776 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008777 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8778 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008779 const bool HasCRTBeginEndFiles =
8780 ToolChain.getTriple().hasEnvironment() ||
8781 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008782
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008783 ArgStringList CmdArgs;
8784
Rafael Espindolad1002f62010-11-15 18:28:16 +00008785 // Silence warning for "clang -g foo.o -o foo"
8786 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008787 // and "clang -emit-llvm foo.o -o foo"
8788 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008789 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008790 // handled somewhere else.
8791 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008792
Peter Collingbourne39719a72015-11-20 20:49:39 +00008793 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8794 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008795 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008796 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008797 CmdArgs.push_back("-target");
8798 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8799 }
8800
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008801 if (!D.SysRoot.empty())
8802 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008803
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008804 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008805 CmdArgs.push_back("-pie");
8806
Rafael Espindola1c76c592010-11-07 22:57:16 +00008807 if (Args.hasArg(options::OPT_rdynamic))
8808 CmdArgs.push_back("-export-dynamic");
8809
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008810 if (Args.hasArg(options::OPT_s))
8811 CmdArgs.push_back("-s");
8812
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008813 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008814 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008815
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008816 for (const auto &Opt : ToolChain.ExtraOpts)
8817 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008818
8819 if (!Args.hasArg(options::OPT_static)) {
8820 CmdArgs.push_back("--eh-frame-hdr");
8821 }
8822
8823 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008824 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008825
8826 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008827 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8828 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008829 CmdArgs.push_back("-Bstatic");
8830 else
8831 CmdArgs.push_back("-static");
8832 } else if (Args.hasArg(options::OPT_shared)) {
8833 CmdArgs.push_back("-shared");
8834 }
8835
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008836 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8837 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008838 (!Args.hasArg(options::OPT_static) &&
8839 !Args.hasArg(options::OPT_shared))) {
8840 CmdArgs.push_back("-dynamic-linker");
8841 CmdArgs.push_back(Args.MakeArgString(
8842 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8843 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008844
8845 CmdArgs.push_back("-o");
8846 CmdArgs.push_back(Output.getFilename());
8847
Douglas Katzman78b37b02015-11-17 20:28:07 +00008848 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008849 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008850 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008851 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008852 if (Args.hasArg(options::OPT_pg))
8853 crt1 = "gcrt1.o";
8854 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008855 crt1 = "Scrt1.o";
8856 else
8857 crt1 = "crt1.o";
8858 }
8859 if (crt1)
8860 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008861
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008862 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8863 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008864
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008865 const char *crtbegin;
8866 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008867 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008868 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008869 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008870 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008871 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008872 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008873 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008874
8875 if (HasCRTBeginEndFiles)
8876 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008877
8878 // Add crtfastmath.o if available and fast math is enabled.
8879 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008880 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008881
8882 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008883 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008884
Douglas Katzman6059ef92015-11-17 17:41:23 +00008885 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008886
Teresa Johnson945bc502015-10-15 20:35:53 +00008887 if (D.isUsingLTO())
8888 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008889
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008890 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8891 CmdArgs.push_back("--no-demangle");
8892
Alexey Samsonov52550342014-09-15 19:58:40 +00008893 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008894 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008895 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008896 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008897
Douglas Katzman78b37b02015-11-17 20:28:07 +00008898 if (D.CCCIsCXX() &&
8899 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008900 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008901 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008902 if (OnlyLibstdcxxStatic)
8903 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008904 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008905 if (OnlyLibstdcxxStatic)
8906 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008907 CmdArgs.push_back("-lm");
8908 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008909 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8910 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008911
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008912 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008913 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8914 if (Args.hasArg(options::OPT_static))
8915 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008916
Alexey Samsonov52550342014-09-15 19:58:40 +00008917 if (NeedsSanitizerDeps)
8918 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8919
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008920 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8921 Args.hasArg(options::OPT_pthreads);
8922
8923 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8924 options::OPT_fno_openmp, false)) {
8925 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8926 // FIXME: Does this really make sense for all GNU toolchains?
8927 WantPthread = true;
8928
8929 // Also link the particular OpenMP runtimes.
8930 switch (getOpenMPRuntime(ToolChain, Args)) {
8931 case OMPRT_OMP:
8932 CmdArgs.push_back("-lomp");
8933 break;
8934 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008935 CmdArgs.push_back("-lgomp");
8936
8937 // FIXME: Exclude this for platforms with libgomp that don't require
8938 // librt. Most modern Linux platforms require it, but some may not.
8939 CmdArgs.push_back("-lrt");
8940 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008941 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008942 CmdArgs.push_back("-liomp5");
8943 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008944 case OMPRT_Unknown:
8945 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008946 break;
8947 }
Chandler Carruth01538002013-01-17 13:19:29 +00008948 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008949
Renato Golinc4b49242014-02-13 10:01:16 +00008950 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008951
Richard Smith31d1de22015-05-20 22:48:44 +00008952 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008953 CmdArgs.push_back("-lpthread");
8954
8955 CmdArgs.push_back("-lc");
8956
8957 if (Args.hasArg(options::OPT_static))
8958 CmdArgs.push_back("--end-group");
8959 else
Renato Golinc4b49242014-02-13 10:01:16 +00008960 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008961 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008962
Rafael Espindola81937ec2010-12-01 01:52:43 +00008963 if (!Args.hasArg(options::OPT_nostartfiles)) {
8964 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008965 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008966 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008967 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008968 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008969 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008970 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008971
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008972 if (HasCRTBeginEndFiles)
8973 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008974 if (!isAndroid)
8975 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008976 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008977 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008978
Peter Collingbourne39719a72015-11-20 20:49:39 +00008979 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008980}
8981
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008982// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8983// for the various SFI requirements like register masking. The assembly tool
8984// inserts the file containing the macros as an input into all the assembly
8985// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008986void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8987 const InputInfo &Output,
8988 const InputInfoList &Inputs,
8989 const ArgList &Args,
8990 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008991 const toolchains::NaClToolChain &ToolChain =
8992 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008993 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8994 "nacl-arm-macros.s");
8995 InputInfoList NewInputs;
8996 NewInputs.push_back(NaClMacros);
8997 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008998 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8999 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009000}
9001
Douglas Katzman750cfc52015-06-29 18:42:16 +00009002// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009003// we use static by default, do not yet support sanitizers or LTO, and a few
9004// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009005// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009006void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9007 const InputInfo &Output,
9008 const InputInfoList &Inputs,
9009 const ArgList &Args,
9010 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009011
Douglas Katzman54366072015-07-27 16:53:08 +00009012 const toolchains::NaClToolChain &ToolChain =
9013 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009014 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009015 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009016 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009017 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009018
9019 ArgStringList CmdArgs;
9020
9021 // Silence warning for "clang -g foo.o -o foo"
9022 Args.ClaimAllArgs(options::OPT_g_Group);
9023 // and "clang -emit-llvm foo.o -o foo"
9024 Args.ClaimAllArgs(options::OPT_emit_llvm);
9025 // and for "clang -w foo.o -o foo". Other warning options are already
9026 // handled somewhere else.
9027 Args.ClaimAllArgs(options::OPT_w);
9028
9029 if (!D.SysRoot.empty())
9030 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9031
9032 if (Args.hasArg(options::OPT_rdynamic))
9033 CmdArgs.push_back("-export-dynamic");
9034
9035 if (Args.hasArg(options::OPT_s))
9036 CmdArgs.push_back("-s");
9037
Douglas Katzman54366072015-07-27 16:53:08 +00009038 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9039 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009040 CmdArgs.push_back("--build-id");
9041
9042 if (!IsStatic)
9043 CmdArgs.push_back("--eh-frame-hdr");
9044
9045 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009046 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009047 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009048 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009049 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009050 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009051 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009052 else if (Arch == llvm::Triple::mipsel)
9053 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009054 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009055 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9056 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009057
9058 if (IsStatic)
9059 CmdArgs.push_back("-static");
9060 else if (Args.hasArg(options::OPT_shared))
9061 CmdArgs.push_back("-shared");
9062
9063 CmdArgs.push_back("-o");
9064 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009065 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009066 if (!Args.hasArg(options::OPT_shared))
9067 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9068 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9069
9070 const char *crtbegin;
9071 if (IsStatic)
9072 crtbegin = "crtbeginT.o";
9073 else if (Args.hasArg(options::OPT_shared))
9074 crtbegin = "crtbeginS.o";
9075 else
9076 crtbegin = "crtbegin.o";
9077 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9078 }
9079
9080 Args.AddAllArgs(CmdArgs, options::OPT_L);
9081 Args.AddAllArgs(CmdArgs, options::OPT_u);
9082
Douglas Katzman6059ef92015-11-17 17:41:23 +00009083 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009084
9085 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9086 CmdArgs.push_back("--no-demangle");
9087
9088 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9089
Douglas Katzman78b37b02015-11-17 20:28:07 +00009090 if (D.CCCIsCXX() &&
9091 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009092 bool OnlyLibstdcxxStatic =
9093 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009094 if (OnlyLibstdcxxStatic)
9095 CmdArgs.push_back("-Bstatic");
9096 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9097 if (OnlyLibstdcxxStatic)
9098 CmdArgs.push_back("-Bdynamic");
9099 CmdArgs.push_back("-lm");
9100 }
9101
9102 if (!Args.hasArg(options::OPT_nostdlib)) {
9103 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9104 // Always use groups, since it has no effect on dynamic libraries.
9105 CmdArgs.push_back("--start-group");
9106 CmdArgs.push_back("-lc");
9107 // NaCl's libc++ currently requires libpthread, so just always include it
9108 // in the group for C++.
9109 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009110 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009111 // Gold, used by Mips, handles nested groups differently than ld, and
9112 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9113 // which is not a desired behaviour here.
9114 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9115 if (getToolChain().getArch() == llvm::Triple::mipsel)
9116 CmdArgs.push_back("-lnacl");
9117
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009118 CmdArgs.push_back("-lpthread");
9119 }
9120
9121 CmdArgs.push_back("-lgcc");
9122 CmdArgs.push_back("--as-needed");
9123 if (IsStatic)
9124 CmdArgs.push_back("-lgcc_eh");
9125 else
9126 CmdArgs.push_back("-lgcc_s");
9127 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009128
9129 // Mips needs to create and use pnacl_legacy library that contains
9130 // definitions from bitcode/pnaclmm.c and definitions for
9131 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9132 if (getToolChain().getArch() == llvm::Triple::mipsel)
9133 CmdArgs.push_back("-lpnacl_legacy");
9134
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009135 CmdArgs.push_back("--end-group");
9136 }
9137
9138 if (!Args.hasArg(options::OPT_nostartfiles)) {
9139 const char *crtend;
9140 if (Args.hasArg(options::OPT_shared))
9141 crtend = "crtendS.o";
9142 else
9143 crtend = "crtend.o";
9144
9145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9146 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9147 }
9148 }
9149
Peter Collingbourne39719a72015-11-20 20:49:39 +00009150 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9151 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009152}
9153
Douglas Katzman95354292015-06-23 20:42:09 +00009154void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9155 const InputInfo &Output,
9156 const InputInfoList &Inputs,
9157 const ArgList &Args,
9158 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009159 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009160 ArgStringList CmdArgs;
9161
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009162 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009163
9164 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009165 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009166
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009167 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009168 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009169
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009170 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009172}
9173
Douglas Katzman95354292015-06-23 20:42:09 +00009174void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9175 const InputInfo &Output,
9176 const InputInfoList &Inputs,
9177 const ArgList &Args,
9178 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009179 const Driver &D = getToolChain().getDriver();
9180 ArgStringList CmdArgs;
9181
Daniel Dunbarb440f562010-08-02 02:38:21 +00009182 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009183 CmdArgs.push_back("-o");
9184 CmdArgs.push_back(Output.getFilename());
9185 } else {
9186 assert(Output.isNothing() && "Invalid output.");
9187 }
9188
Douglas Katzman78b37b02015-11-17 20:28:07 +00009189 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009190 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9191 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9192 CmdArgs.push_back(
9193 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9194 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009195 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009196
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009197 Args.AddAllArgs(CmdArgs,
9198 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009199
Daniel Dunbar54423b22010-09-17 00:24:54 +00009200 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009201
Xinliang David Li69306c02015-10-22 06:15:31 +00009202 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009203
Douglas Katzman78b37b02015-11-17 20:28:07 +00009204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009205 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009206 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009207 CmdArgs.push_back("-lm");
9208 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009209 }
9210
Douglas Katzman78b37b02015-11-17 20:28:07 +00009211 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009212 if (Args.hasArg(options::OPT_pthread))
9213 CmdArgs.push_back("-lpthread");
9214 CmdArgs.push_back("-lc");
9215 CmdArgs.push_back("-lCompilerRT-Generic");
9216 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9217 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009218 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009219 }
9220
Logan Chieneb9162f2014-06-26 14:23:45 +00009221 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009222 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009223}
9224
Daniel Dunbarcc912342009-05-02 18:28:39 +00009225/// DragonFly Tools
9226
9227// For now, DragonFly Assemble does just about the same as for
9228// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009229void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9230 const InputInfo &Output,
9231 const InputInfoList &Inputs,
9232 const ArgList &Args,
9233 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009234 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009235 ArgStringList CmdArgs;
9236
9237 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9238 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009239 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009240 CmdArgs.push_back("--32");
9241
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009242 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009243
9244 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009245 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009246
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009247 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009248 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009249
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009250 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009251 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009252}
9253
Douglas Katzman95354292015-06-23 20:42:09 +00009254void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9255 const InputInfo &Output,
9256 const InputInfoList &Inputs,
9257 const ArgList &Args,
9258 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009259 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009260 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009261
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009262 if (!D.SysRoot.empty())
9263 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9264
John McCall65b8da02013-04-11 22:55:55 +00009265 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009266 if (Args.hasArg(options::OPT_static)) {
9267 CmdArgs.push_back("-Bstatic");
9268 } else {
John McCall65b8da02013-04-11 22:55:55 +00009269 if (Args.hasArg(options::OPT_rdynamic))
9270 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009271 if (Args.hasArg(options::OPT_shared))
9272 CmdArgs.push_back("-Bshareable");
9273 else {
9274 CmdArgs.push_back("-dynamic-linker");
9275 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9276 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009277 CmdArgs.push_back("--hash-style=gnu");
9278 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009279 }
9280
9281 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9282 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009283 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009284 CmdArgs.push_back("-m");
9285 CmdArgs.push_back("elf_i386");
9286 }
9287
Daniel Dunbarb440f562010-08-02 02:38:21 +00009288 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009289 CmdArgs.push_back("-o");
9290 CmdArgs.push_back(Output.getFilename());
9291 } else {
9292 assert(Output.isNothing() && "Invalid output.");
9293 }
9294
Douglas Katzman78b37b02015-11-17 20:28:07 +00009295 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009296 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009297 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009298 CmdArgs.push_back(
9299 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009300 else {
9301 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009302 CmdArgs.push_back(
9303 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009304 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009305 CmdArgs.push_back(
9306 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009307 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009308 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009309 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009310 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009311 CmdArgs.push_back(
9312 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009313 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009314 CmdArgs.push_back(
9315 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009316 }
9317
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009318 Args.AddAllArgs(CmdArgs,
9319 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009320
Daniel Dunbar54423b22010-09-17 00:24:54 +00009321 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009322
Douglas Katzman78b37b02015-11-17 20:28:07 +00009323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009324 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009325
9326 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009327 CmdArgs.push_back("-rpath");
9328 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009329 }
9330
Hans Wennborg70850d82013-07-18 20:29:38 +00009331 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009332 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009333 CmdArgs.push_back("-lm");
9334 }
9335
Daniel Dunbarcc912342009-05-02 18:28:39 +00009336 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009337 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009338
9339 if (!Args.hasArg(options::OPT_nolibc)) {
9340 CmdArgs.push_back("-lc");
9341 }
9342
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009343 if (Args.hasArg(options::OPT_static) ||
9344 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009345 CmdArgs.push_back("-lgcc");
9346 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009347 } else {
9348 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009349 CmdArgs.push_back("-lgcc_pic");
9350 if (!Args.hasArg(options::OPT_shared))
9351 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009352 } else {
John McCall65b8da02013-04-11 22:55:55 +00009353 CmdArgs.push_back("-lgcc");
9354 CmdArgs.push_back("--as-needed");
9355 CmdArgs.push_back("-lgcc_pic");
9356 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009357 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009358 }
9359 }
9360
Douglas Katzman78b37b02015-11-17 20:28:07 +00009361 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009362 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009363 CmdArgs.push_back(
9364 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009365 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009366 CmdArgs.push_back(
9367 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9368 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009369 }
9370
Xinliang David Li69306c02015-10-22 06:15:31 +00009371 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009372
Logan Chieneb9162f2014-06-26 14:23:45 +00009373 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009374 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009375}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009376
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009377// Try to find Exe from a Visual Studio distribution. This first tries to find
9378// an installed copy of Visual Studio and, failing that, looks in the PATH,
9379// making sure that whatever executable that's found is not a same-named exe
9380// from clang itself to prevent clang from falling back to itself.
9381static std::string FindVisualStudioExecutable(const ToolChain &TC,
9382 const char *Exe,
9383 const char *ClangProgramPath) {
9384 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9385 std::string visualStudioBinDir;
9386 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9387 visualStudioBinDir)) {
9388 SmallString<128> FilePath(visualStudioBinDir);
9389 llvm::sys::path::append(FilePath, Exe);
9390 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9391 return FilePath.str();
9392 }
9393
9394 return Exe;
9395}
9396
Douglas Katzman95354292015-06-23 20:42:09 +00009397void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9398 const InputInfo &Output,
9399 const InputInfoList &Inputs,
9400 const ArgList &Args,
9401 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009402 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009403 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009404
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009405 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9406 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009407 CmdArgs.push_back(
9408 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009409
Douglas Katzman78b37b02015-11-17 20:28:07 +00009410 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9411 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009412 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009413
Zachary Turner10d75b22014-10-22 20:40:43 +00009414 if (!llvm::sys::Process::GetEnv("LIB")) {
9415 // If the VC environment hasn't been configured (perhaps because the user
9416 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009417 // the environment variable is set however, assume the user knows what
9418 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009419 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009420 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009421 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9422 SmallString<128> LibDir(VisualStudioDir);
9423 llvm::sys::path::append(LibDir, "VC", "lib");
9424 switch (MSVC.getArch()) {
9425 case llvm::Triple::x86:
9426 // x86 just puts the libraries directly in lib
9427 break;
9428 case llvm::Triple::x86_64:
9429 llvm::sys::path::append(LibDir, "amd64");
9430 break;
9431 case llvm::Triple::arm:
9432 llvm::sys::path::append(LibDir, "arm");
9433 break;
9434 default:
9435 break;
9436 }
9437 CmdArgs.push_back(
9438 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009439
9440 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9441 std::string UniversalCRTLibPath;
9442 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9443 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9444 UniversalCRTLibPath.c_str()));
9445 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009446 }
9447
9448 std::string WindowsSdkLibPath;
9449 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9450 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9451 WindowsSdkLibPath.c_str()));
9452 }
9453
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009454 CmdArgs.push_back("-nologo");
9455
Reid Kleckner124955a2015-08-05 18:51:13 +00009456 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009457 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009458
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009459 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009460 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009461 if (DLL) {
9462 CmdArgs.push_back(Args.MakeArgString("-dll"));
9463
9464 SmallString<128> ImplibName(Output.getFilename());
9465 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009466 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009467 }
9468
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009469 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009470 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009471 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009472 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009473 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9474 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009475 // Make sure the dynamic runtime thunk is not optimized out at link time
9476 // to ensure proper SEH handling.
9477 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009478 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009479 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009480 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009481 for (const auto &Lib : {"asan", "asan_cxx"})
9482 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009483 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009484 }
9485
Hans Wennborg2e274592013-08-13 23:38:57 +00009486 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009487
Alexey Bataevc7e84352015-08-19 04:49:01 +00009488 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9489 options::OPT_fno_openmp, false)) {
9490 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9491 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9492 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9493 TC.getDriver().Dir + "/../lib"));
9494 switch (getOpenMPRuntime(getToolChain(), Args)) {
9495 case OMPRT_OMP:
9496 CmdArgs.push_back("-defaultlib:libomp.lib");
9497 break;
9498 case OMPRT_IOMP5:
9499 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9500 break;
9501 case OMPRT_GOMP:
9502 break;
9503 case OMPRT_Unknown:
9504 // Already diagnosed.
9505 break;
9506 }
9507 }
9508
Reid Kleckner337188f2014-09-16 19:22:00 +00009509 // Add filenames, libraries, and other linker inputs.
9510 for (const auto &Input : Inputs) {
9511 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009512 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009513 continue;
9514 }
9515
9516 const Arg &A = Input.getInputArg();
9517
9518 // Render -l options differently for the MSVC linker.
9519 if (A.getOption().matches(options::OPT_l)) {
9520 StringRef Lib = A.getValue();
9521 const char *LinkLibArg;
9522 if (Lib.endswith(".lib"))
9523 LinkLibArg = Args.MakeArgString(Lib);
9524 else
9525 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9526 CmdArgs.push_back(LinkLibArg);
9527 continue;
9528 }
9529
9530 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9531 // or -L. Render it, even if MSVC doesn't understand it.
9532 A.renderAsInput(Args, CmdArgs);
9533 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009534
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009535 TC.addProfileRTLibs(Args, CmdArgs);
9536
Zachary Turner719f58c2014-12-01 23:06:47 +00009537 // We need to special case some linker paths. In the case of lld, we need to
9538 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9539 // linker, we need to use a special search algorithm.
9540 llvm::SmallString<128> linkPath;
9541 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9542 if (Linker.equals_lower("lld"))
9543 Linker = "lld-link";
9544
9545 if (Linker.equals_lower("link")) {
9546 // If we're using the MSVC linker, it's not sufficient to just use link
9547 // from the program PATH, because other environments like GnuWin32 install
9548 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009549 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009550 C.getDriver().getClangProgramPath());
9551 } else {
9552 linkPath = Linker;
9553 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009554 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009555 }
9556
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009557 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009558 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009559}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009560
Douglas Katzman95354292015-06-23 20:42:09 +00009561void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9562 const InputInfo &Output,
9563 const InputInfoList &Inputs,
9564 const ArgList &Args,
9565 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009566 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9567}
9568
Douglas Katzman95354292015-06-23 20:42:09 +00009569std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009570 Compilation &C, const JobAction &JA, const InputInfo &Output,
9571 const InputInfoList &Inputs, const ArgList &Args,
9572 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009573 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009574 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009575 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009576 CmdArgs.push_back("/W0"); // No warnings.
9577
9578 // The goal is to be able to invoke this tool correctly based on
9579 // any flag accepted by clang-cl.
9580
9581 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009582 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009583
9584 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009585 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9586 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9587 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009588 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9589 if (A->getOption().getID() == options::OPT_O0) {
9590 CmdArgs.push_back("/Od");
9591 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009592 CmdArgs.push_back("/Og");
9593
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009594 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009595 if (OptLevel == "s" || OptLevel == "z")
9596 CmdArgs.push_back("/Os");
9597 else
9598 CmdArgs.push_back("/Ot");
9599
9600 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009601 }
9602 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009603 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9604 options::OPT_fno_omit_frame_pointer))
9605 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9606 ? "/Oy"
9607 : "/Oy-");
9608 if (!Args.hasArg(options::OPT_fwritable_strings))
9609 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009610
Nico Weber3f8dafb2015-03-12 19:37:10 +00009611 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009612 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9613
David Majnemerf6072342014-07-01 22:24:56 +00009614 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9615 /*default=*/false))
9616 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009617 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9618 options::OPT_fno_function_sections))
9619 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9620 ? "/Gy"
9621 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009622 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9623 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009624 CmdArgs.push_back(
9625 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009626 if (Args.hasArg(options::OPT_fsyntax_only))
9627 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009628 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9629 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009630 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009631
Nico Weber3f8dafb2015-03-12 19:37:10 +00009632 std::vector<std::string> Includes =
9633 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009634 for (const auto &Include : Includes)
9635 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009636
Hans Wennborg87cfa712013-09-19 20:32:16 +00009637 // Flags that can simply be passed through.
9638 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9639 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009640 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009641 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009642
9643 // The order of these flags is relevant, so pick the last one.
9644 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9645 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9646 A->render(Args, CmdArgs);
9647
Hans Wennborg87cfa712013-09-19 20:32:16 +00009648 // Input filename.
9649 assert(Inputs.size() == 1);
9650 const InputInfo &II = Inputs[0];
9651 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9652 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9653 if (II.isFilename())
9654 CmdArgs.push_back(II.getFilename());
9655 else
9656 II.getInputArg().renderAsInput(Args, CmdArgs);
9657
9658 // Output filename.
9659 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009660 const char *Fo =
9661 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009662 CmdArgs.push_back(Fo);
9663
Hans Wennborg188382e2013-09-20 18:16:35 +00009664 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009665 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9666 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009667 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009668 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009669}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009670
Yaron Keren1c0070c2015-07-02 04:45:27 +00009671/// MinGW Tools
9672void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9673 const InputInfo &Output,
9674 const InputInfoList &Inputs,
9675 const ArgList &Args,
9676 const char *LinkingOutput) const {
9677 claimNoWarnArgs(Args);
9678 ArgStringList CmdArgs;
9679
9680 if (getToolChain().getArch() == llvm::Triple::x86) {
9681 CmdArgs.push_back("--32");
9682 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9683 CmdArgs.push_back("--64");
9684 }
9685
9686 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9687
9688 CmdArgs.push_back("-o");
9689 CmdArgs.push_back(Output.getFilename());
9690
9691 for (const auto &II : Inputs)
9692 CmdArgs.push_back(II.getFilename());
9693
9694 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009695 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009696
9697 if (Args.hasArg(options::OPT_gsplit_dwarf))
9698 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9699 SplitDebugName(Args, Inputs[0]));
9700}
9701
9702void MinGW::Linker::AddLibGCC(const ArgList &Args,
9703 ArgStringList &CmdArgs) const {
9704 if (Args.hasArg(options::OPT_mthreads))
9705 CmdArgs.push_back("-lmingwthrd");
9706 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009707
Yaron Kerenaa281332015-08-09 00:24:07 +00009708 // Make use of compiler-rt if --rtlib option is used
9709 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9710 if (RLT == ToolChain::RLT_Libgcc) {
9711 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9712 Args.hasArg(options::OPT_static);
9713 bool Shared = Args.hasArg(options::OPT_shared);
9714 bool CXX = getToolChain().getDriver().CCCIsCXX();
9715
9716 if (Static || (!CXX && !Shared)) {
9717 CmdArgs.push_back("-lgcc");
9718 CmdArgs.push_back("-lgcc_eh");
9719 } else {
9720 CmdArgs.push_back("-lgcc_s");
9721 CmdArgs.push_back("-lgcc");
9722 }
9723 } else {
9724 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9725 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009726
Yaron Keren1c0070c2015-07-02 04:45:27 +00009727 CmdArgs.push_back("-lmoldname");
9728 CmdArgs.push_back("-lmingwex");
9729 CmdArgs.push_back("-lmsvcrt");
9730}
9731
9732void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9733 const InputInfo &Output,
9734 const InputInfoList &Inputs,
9735 const ArgList &Args,
9736 const char *LinkingOutput) const {
9737 const ToolChain &TC = getToolChain();
9738 const Driver &D = TC.getDriver();
9739 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9740
9741 ArgStringList CmdArgs;
9742
9743 // Silence warning for "clang -g foo.o -o foo"
9744 Args.ClaimAllArgs(options::OPT_g_Group);
9745 // and "clang -emit-llvm foo.o -o foo"
9746 Args.ClaimAllArgs(options::OPT_emit_llvm);
9747 // and for "clang -w foo.o -o foo". Other warning options are already
9748 // handled somewhere else.
9749 Args.ClaimAllArgs(options::OPT_w);
9750
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009751 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9752 if (LinkerName.equals_lower("lld")) {
9753 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009754 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009755 } else if (!LinkerName.equals_lower("ld")) {
9756 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009757 }
9758
Yaron Keren1c0070c2015-07-02 04:45:27 +00009759 if (!D.SysRoot.empty())
9760 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9761
9762 if (Args.hasArg(options::OPT_s))
9763 CmdArgs.push_back("-s");
9764
9765 CmdArgs.push_back("-m");
9766 if (TC.getArch() == llvm::Triple::x86)
9767 CmdArgs.push_back("i386pe");
9768 if (TC.getArch() == llvm::Triple::x86_64)
9769 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009770 if (TC.getArch() == llvm::Triple::arm)
9771 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009772
9773 if (Args.hasArg(options::OPT_mwindows)) {
9774 CmdArgs.push_back("--subsystem");
9775 CmdArgs.push_back("windows");
9776 } else if (Args.hasArg(options::OPT_mconsole)) {
9777 CmdArgs.push_back("--subsystem");
9778 CmdArgs.push_back("console");
9779 }
9780
9781 if (Args.hasArg(options::OPT_static))
9782 CmdArgs.push_back("-Bstatic");
9783 else {
9784 if (Args.hasArg(options::OPT_mdll))
9785 CmdArgs.push_back("--dll");
9786 else if (Args.hasArg(options::OPT_shared))
9787 CmdArgs.push_back("--shared");
9788 CmdArgs.push_back("-Bdynamic");
9789 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9790 CmdArgs.push_back("-e");
9791 if (TC.getArch() == llvm::Triple::x86)
9792 CmdArgs.push_back("_DllMainCRTStartup@12");
9793 else
9794 CmdArgs.push_back("DllMainCRTStartup");
9795 CmdArgs.push_back("--enable-auto-image-base");
9796 }
9797 }
9798
9799 CmdArgs.push_back("-o");
9800 CmdArgs.push_back(Output.getFilename());
9801
9802 Args.AddAllArgs(CmdArgs, options::OPT_e);
9803 // FIXME: add -N, -n flags
9804 Args.AddLastArg(CmdArgs, options::OPT_r);
9805 Args.AddLastArg(CmdArgs, options::OPT_s);
9806 Args.AddLastArg(CmdArgs, options::OPT_t);
9807 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9808 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9809
Douglas Katzman78b37b02015-11-17 20:28:07 +00009810 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009811 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9812 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9813 } else {
9814 if (Args.hasArg(options::OPT_municode))
9815 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9816 else
9817 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9818 }
9819 if (Args.hasArg(options::OPT_pg))
9820 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9821 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9822 }
9823
9824 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009825 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009826 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9827
9828 // TODO: Add ASan stuff here
9829
9830 // TODO: Add profile stuff here
9831
Douglas Katzman78b37b02015-11-17 20:28:07 +00009832 if (D.CCCIsCXX() &&
9833 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009834 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9835 !Args.hasArg(options::OPT_static);
9836 if (OnlyLibstdcxxStatic)
9837 CmdArgs.push_back("-Bstatic");
9838 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9839 if (OnlyLibstdcxxStatic)
9840 CmdArgs.push_back("-Bdynamic");
9841 }
9842
9843 if (!Args.hasArg(options::OPT_nostdlib)) {
9844 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9845 if (Args.hasArg(options::OPT_static))
9846 CmdArgs.push_back("--start-group");
9847
9848 if (Args.hasArg(options::OPT_fstack_protector) ||
9849 Args.hasArg(options::OPT_fstack_protector_strong) ||
9850 Args.hasArg(options::OPT_fstack_protector_all)) {
9851 CmdArgs.push_back("-lssp_nonshared");
9852 CmdArgs.push_back("-lssp");
9853 }
9854 if (Args.hasArg(options::OPT_fopenmp))
9855 CmdArgs.push_back("-lgomp");
9856
9857 AddLibGCC(Args, CmdArgs);
9858
9859 if (Args.hasArg(options::OPT_pg))
9860 CmdArgs.push_back("-lgmon");
9861
Yaron Kerenadce68e2015-07-06 18:52:19 +00009862 if (Args.hasArg(options::OPT_pthread))
9863 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009864
9865 // add system libraries
9866 if (Args.hasArg(options::OPT_mwindows)) {
9867 CmdArgs.push_back("-lgdi32");
9868 CmdArgs.push_back("-lcomdlg32");
9869 }
9870 CmdArgs.push_back("-ladvapi32");
9871 CmdArgs.push_back("-lshell32");
9872 CmdArgs.push_back("-luser32");
9873 CmdArgs.push_back("-lkernel32");
9874
9875 if (Args.hasArg(options::OPT_static))
9876 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009877 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009878 AddLibGCC(Args, CmdArgs);
9879 }
9880
9881 if (!Args.hasArg(options::OPT_nostartfiles)) {
9882 // Add crtfastmath.o if available and fast math is enabled.
9883 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9884
9885 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9886 }
9887 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009888 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009889 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009890}
9891
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009892/// XCore Tools
9893// We pass assemble and link construction to the xcc tool.
9894
Douglas Katzman95354292015-06-23 20:42:09 +00009895void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9896 const InputInfo &Output,
9897 const InputInfoList &Inputs,
9898 const ArgList &Args,
9899 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009900 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009901 ArgStringList CmdArgs;
9902
9903 CmdArgs.push_back("-o");
9904 CmdArgs.push_back(Output.getFilename());
9905
9906 CmdArgs.push_back("-c");
9907
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009908 if (Args.hasArg(options::OPT_v))
9909 CmdArgs.push_back("-v");
9910
Robert Lytton894d25c2014-05-02 09:33:25 +00009911 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9912 if (!A->getOption().matches(options::OPT_g0))
9913 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009914
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009915 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9916 false))
9917 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009920
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009921 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009922 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009923
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009924 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009925 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009926}
9927
Douglas Katzman95354292015-06-23 20:42:09 +00009928void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9929 const InputInfo &Output,
9930 const InputInfoList &Inputs,
9931 const ArgList &Args,
9932 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009933 ArgStringList CmdArgs;
9934
9935 if (Output.isFilename()) {
9936 CmdArgs.push_back("-o");
9937 CmdArgs.push_back(Output.getFilename());
9938 } else {
9939 assert(Output.isNothing() && "Invalid output.");
9940 }
9941
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009942 if (Args.hasArg(options::OPT_v))
9943 CmdArgs.push_back("-v");
9944
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009945 // Pass -fexceptions through to the linker if it was present.
9946 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9947 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009948 CmdArgs.push_back("-fexceptions");
9949
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009950 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9951
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009952 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009953 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009954}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009955
Douglas Katzman95354292015-06-23 20:42:09 +00009956void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9957 const InputInfo &Output,
9958 const InputInfoList &Inputs,
9959 const ArgList &Args,
9960 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009961 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009962 const auto &TC =
9963 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9964 ArgStringList CmdArgs;
9965 const char *Exec;
9966
9967 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009968 default:
9969 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009970 case llvm::Triple::arm:
9971 case llvm::Triple::thumb:
9972 break;
9973 case llvm::Triple::x86:
9974 CmdArgs.push_back("--32");
9975 break;
9976 case llvm::Triple::x86_64:
9977 CmdArgs.push_back("--64");
9978 break;
9979 }
9980
9981 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9982
9983 CmdArgs.push_back("-o");
9984 CmdArgs.push_back(Output.getFilename());
9985
9986 for (const auto &Input : Inputs)
9987 CmdArgs.push_back(Input.getFilename());
9988
9989 const std::string Assembler = TC.GetProgramPath("as");
9990 Exec = Args.MakeArgString(Assembler);
9991
Justin Bognerd3371d82015-07-17 03:35:54 +00009992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009993}
9994
Douglas Katzman95354292015-06-23 20:42:09 +00009995void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9996 const InputInfo &Output,
9997 const InputInfoList &Inputs,
9998 const ArgList &Args,
9999 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010000 const auto &TC =
10001 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10002 const llvm::Triple &T = TC.getTriple();
10003 const Driver &D = TC.getDriver();
10004 SmallString<128> EntryPoint;
10005 ArgStringList CmdArgs;
10006 const char *Exec;
10007
10008 // Silence warning for "clang -g foo.o -o foo"
10009 Args.ClaimAllArgs(options::OPT_g_Group);
10010 // and "clang -emit-llvm foo.o -o foo"
10011 Args.ClaimAllArgs(options::OPT_emit_llvm);
10012 // and for "clang -w foo.o -o foo"
10013 Args.ClaimAllArgs(options::OPT_w);
10014 // Other warning options are already handled somewhere else.
10015
10016 if (!D.SysRoot.empty())
10017 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10018
10019 if (Args.hasArg(options::OPT_pie))
10020 CmdArgs.push_back("-pie");
10021 if (Args.hasArg(options::OPT_rdynamic))
10022 CmdArgs.push_back("-export-dynamic");
10023 if (Args.hasArg(options::OPT_s))
10024 CmdArgs.push_back("--strip-all");
10025
10026 CmdArgs.push_back("-m");
10027 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010028 default:
10029 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010030 case llvm::Triple::arm:
10031 case llvm::Triple::thumb:
10032 // FIXME: this is incorrect for WinCE
10033 CmdArgs.push_back("thumb2pe");
10034 break;
10035 case llvm::Triple::x86:
10036 CmdArgs.push_back("i386pe");
10037 EntryPoint.append("_");
10038 break;
10039 case llvm::Triple::x86_64:
10040 CmdArgs.push_back("i386pep");
10041 break;
10042 }
10043
10044 if (Args.hasArg(options::OPT_shared)) {
10045 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010046 default:
10047 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010048 case llvm::Triple::arm:
10049 case llvm::Triple::thumb:
10050 case llvm::Triple::x86_64:
10051 EntryPoint.append("_DllMainCRTStartup");
10052 break;
10053 case llvm::Triple::x86:
10054 EntryPoint.append("_DllMainCRTStartup@12");
10055 break;
10056 }
10057
10058 CmdArgs.push_back("-shared");
10059 CmdArgs.push_back("-Bdynamic");
10060
10061 CmdArgs.push_back("--enable-auto-image-base");
10062
10063 CmdArgs.push_back("--entry");
10064 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10065 } else {
10066 EntryPoint.append("mainCRTStartup");
10067
10068 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10069 : "-Bdynamic");
10070
Douglas Katzman78b37b02015-11-17 20:28:07 +000010071 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010072 CmdArgs.push_back("--entry");
10073 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10074 }
10075
10076 // FIXME: handle subsystem
10077 }
10078
10079 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010080 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010081
10082 CmdArgs.push_back("-o");
10083 CmdArgs.push_back(Output.getFilename());
10084
10085 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10086 SmallString<261> ImpLib(Output.getFilename());
10087 llvm::sys::path::replace_extension(ImpLib, ".lib");
10088
10089 CmdArgs.push_back("--out-implib");
10090 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10091 }
10092
Douglas Katzman78b37b02015-11-17 20:28:07 +000010093 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010094 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10095 const char *CRTBegin;
10096
10097 CRTBegin =
10098 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10099 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10100 }
10101
10102 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010103 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010104 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10105
10106 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10107 !Args.hasArg(options::OPT_nodefaultlibs)) {
10108 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10109 !Args.hasArg(options::OPT_static);
10110 if (StaticCXX)
10111 CmdArgs.push_back("-Bstatic");
10112 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10113 if (StaticCXX)
10114 CmdArgs.push_back("-Bdynamic");
10115 }
10116
10117 if (!Args.hasArg(options::OPT_nostdlib)) {
10118 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10119 // TODO handle /MT[d] /MD[d]
10120 CmdArgs.push_back("-lmsvcrt");
10121 AddRunTimeLibs(TC, D, CmdArgs, Args);
10122 }
10123 }
10124
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010125 if (TC.getSanitizerArgs().needsAsanRt()) {
10126 // TODO handle /MT[d] /MD[d]
10127 if (Args.hasArg(options::OPT_shared)) {
10128 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10129 } else {
10130 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10131 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10132 // Make sure the dynamic runtime thunk is not optimized out at link time
10133 // to ensure proper SEH handling.
10134 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10135 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10136 ? "___asan_seh_interceptor"
10137 : "__asan_seh_interceptor"));
10138 }
10139 }
10140
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010141 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010142
Justin Bognerd3371d82015-07-17 03:35:54 +000010143 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010144}
Douglas Katzman84a75642015-06-19 14:55:19 +000010145
Douglas Katzman95354292015-06-23 20:42:09 +000010146void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10147 const InputInfo &Output,
10148 const InputInfoList &Inputs,
10149 const ArgList &Args,
10150 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010151 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010152 assert(Inputs.size() == 1);
10153 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010154 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10155 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010156
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010157 if (JA.getKind() == Action::PreprocessJobClass) {
10158 Args.ClaimAllArgs();
10159 CmdArgs.push_back("-E");
10160 } else {
10161 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10162 CmdArgs.push_back("-S");
10163 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10164 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010165 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010166 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010167
Douglas Katzmanf6071112015-08-03 14:34:22 +000010168 // Append all -I, -iquote, -isystem paths, defines/undefines,
10169 // 'f' flags, optimize flags, and warning options.
10170 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010171 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010172 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010173 options::OPT_f_Group, options::OPT_f_clang_Group,
10174 options::OPT_g_Group, options::OPT_M_Group,
10175 options::OPT_O_Group, options::OPT_W_Group});
10176
10177 // If we're producing a dependency file, and assembly is the final action,
10178 // then the name of the target in the dependency file should be the '.o'
10179 // file, not the '.s' file produced by this step. For example, instead of
10180 // /tmp/mumble.s: mumble.c .../someheader.h
10181 // the filename on the lefthand side should be "mumble.o"
10182 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10183 C.getActions().size() == 1 &&
10184 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10185 Arg *A = Args.getLastArg(options::OPT_o);
10186 if (A) {
10187 CmdArgs.push_back("-MT");
10188 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10189 }
10190 }
10191
Douglas Katzman84a75642015-06-19 14:55:19 +000010192 CmdArgs.push_back(II.getFilename());
10193 CmdArgs.push_back("-o");
10194 CmdArgs.push_back(Output.getFilename());
10195
10196 std::string Exec =
10197 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010198 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10199 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010200}
10201
Douglas Katzman95354292015-06-23 20:42:09 +000010202void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10203 const InputInfo &Output,
10204 const InputInfoList &Inputs,
10205 const ArgList &Args,
10206 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010207 ArgStringList CmdArgs;
10208
10209 assert(Inputs.size() == 1);
10210 const InputInfo &II = Inputs[0];
10211 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10212 assert(Output.getType() == types::TY_Object);
10213
10214 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010215 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010216 CmdArgs.push_back("-noSPrefixing");
10217 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010218 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10219 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10220 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010221 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010222 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010223 }
10224 CmdArgs.push_back("-elf"); // Output format.
10225 CmdArgs.push_back(II.getFilename());
10226 CmdArgs.push_back(
10227 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10228
10229 std::string Exec =
10230 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010231 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10232 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010233}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010234
10235void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10236 const InputInfo &Output,
10237 const InputInfoList &Inputs,
10238 const ArgList &Args,
10239 const char *LinkingOutput) const {
10240 const auto &TC =
10241 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10242 const llvm::Triple &T = TC.getTriple();
10243 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010244 bool UseStartfiles =
10245 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010246 bool UseDefaultLibs =
10247 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010248
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010249 if (T.getArch() == llvm::Triple::sparc)
10250 CmdArgs.push_back("-EB");
10251 else // SHAVE assumes little-endian, and sparcel is expressly so.
10252 CmdArgs.push_back("-EL");
10253
10254 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10255 // but we never pass through a --sysroot option and various other bits.
10256 // For example, there are no sanitizers (yet) nor gold linker.
10257
10258 // Eat some arguments that may be present but have no effect.
10259 Args.ClaimAllArgs(options::OPT_g_Group);
10260 Args.ClaimAllArgs(options::OPT_w);
10261 Args.ClaimAllArgs(options::OPT_static_libgcc);
10262
10263 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10264 CmdArgs.push_back("-s");
10265
10266 CmdArgs.push_back("-o");
10267 CmdArgs.push_back(Output.getFilename());
10268
10269 if (UseStartfiles) {
10270 // If you want startfiles, it means you want the builtin crti and crtbegin,
10271 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010272 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10273 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010274 }
10275
10276 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10277 options::OPT_e, options::OPT_s, options::OPT_t,
10278 options::OPT_Z_Flag, options::OPT_r});
10279
Douglas Katzman674a3122015-11-18 16:24:46 +000010280 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010281
10282 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10283
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010284 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010285 if (C.getDriver().CCCIsCXX())
10286 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010287 if (T.getOS() == llvm::Triple::RTEMS) {
10288 CmdArgs.push_back("--start-group");
10289 CmdArgs.push_back("-lc");
10290 // You must provide your own "-L" option to enable finding these.
10291 CmdArgs.push_back("-lrtemscpu");
10292 CmdArgs.push_back("-lrtemsbsp");
10293 CmdArgs.push_back("--end-group");
10294 } else {
10295 CmdArgs.push_back("-lc");
10296 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010297 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010298 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010299 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010300 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10301 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010302 }
10303
10304 std::string Exec =
10305 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10306 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10307 CmdArgs, Inputs));
10308}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010309
10310void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10311 const InputInfo &Output,
10312 const InputInfoList &Inputs,
10313 const ArgList &Args,
10314 const char *LinkingOutput) const {
10315 claimNoWarnArgs(Args);
10316 ArgStringList CmdArgs;
10317
10318 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10319
10320 CmdArgs.push_back("-o");
10321 CmdArgs.push_back(Output.getFilename());
10322
10323 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10324 const InputInfo &Input = Inputs[0];
10325 assert(Input.isFilename() && "Invalid input.");
10326 CmdArgs.push_back(Input.getFilename());
10327
10328 const char *Exec =
10329 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10330 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10331}
10332
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010333static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10334 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10335 if (SanArgs.needsUbsanRt()) {
10336 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10337 }
10338 if (SanArgs.needsAsanRt()) {
10339 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10340 }
10341}
10342
10343static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10344 const JobAction &JA, const InputInfo &Output,
10345 const InputInfoList &Inputs,
10346 const ArgList &Args,
10347 const char *LinkingOutput) {
10348 const toolchains::FreeBSD &ToolChain =
10349 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10350 const Driver &D = ToolChain.getDriver();
10351 ArgStringList CmdArgs;
10352
10353 // Silence warning for "clang -g foo.o -o foo"
10354 Args.ClaimAllArgs(options::OPT_g_Group);
10355 // and "clang -emit-llvm foo.o -o foo"
10356 Args.ClaimAllArgs(options::OPT_emit_llvm);
10357 // and for "clang -w foo.o -o foo". Other warning options are already
10358 // handled somewhere else.
10359 Args.ClaimAllArgs(options::OPT_w);
10360
10361 if (!D.SysRoot.empty())
10362 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10363
10364 if (Args.hasArg(options::OPT_pie))
10365 CmdArgs.push_back("-pie");
10366
10367 if (Args.hasArg(options::OPT_rdynamic))
10368 CmdArgs.push_back("-export-dynamic");
10369 if (Args.hasArg(options::OPT_shared))
10370 CmdArgs.push_back("--oformat=so");
10371
10372 if (Output.isFilename()) {
10373 CmdArgs.push_back("-o");
10374 CmdArgs.push_back(Output.getFilename());
10375 } else {
10376 assert(Output.isNothing() && "Invalid output.");
10377 }
10378
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010379 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10380
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010381 Args.AddAllArgs(CmdArgs, options::OPT_L);
10382 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10383 Args.AddAllArgs(CmdArgs, options::OPT_e);
10384 Args.AddAllArgs(CmdArgs, options::OPT_s);
10385 Args.AddAllArgs(CmdArgs, options::OPT_t);
10386 Args.AddAllArgs(CmdArgs, options::OPT_r);
10387
10388 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10389 CmdArgs.push_back("--no-demangle");
10390
10391 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10392
10393 if (Args.hasArg(options::OPT_pthread)) {
10394 CmdArgs.push_back("-lpthread");
10395 }
10396
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010397 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10398
10399 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10400}
10401
10402static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10403 const JobAction &JA, const InputInfo &Output,
10404 const InputInfoList &Inputs,
10405 const ArgList &Args,
10406 const char *LinkingOutput) {
10407 const toolchains::FreeBSD &ToolChain =
10408 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10409 const Driver &D = ToolChain.getDriver();
10410 ArgStringList CmdArgs;
10411
10412 // Silence warning for "clang -g foo.o -o foo"
10413 Args.ClaimAllArgs(options::OPT_g_Group);
10414 // and "clang -emit-llvm foo.o -o foo"
10415 Args.ClaimAllArgs(options::OPT_emit_llvm);
10416 // and for "clang -w foo.o -o foo". Other warning options are already
10417 // handled somewhere else.
10418 Args.ClaimAllArgs(options::OPT_w);
10419
10420 if (!D.SysRoot.empty())
10421 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10422
10423 if (Args.hasArg(options::OPT_pie))
10424 CmdArgs.push_back("-pie");
10425
10426 if (Args.hasArg(options::OPT_static)) {
10427 CmdArgs.push_back("-Bstatic");
10428 } else {
10429 if (Args.hasArg(options::OPT_rdynamic))
10430 CmdArgs.push_back("-export-dynamic");
10431 CmdArgs.push_back("--eh-frame-hdr");
10432 if (Args.hasArg(options::OPT_shared)) {
10433 CmdArgs.push_back("-Bshareable");
10434 } else {
10435 CmdArgs.push_back("-dynamic-linker");
10436 CmdArgs.push_back("/libexec/ld-elf.so.1");
10437 }
10438 CmdArgs.push_back("--enable-new-dtags");
10439 }
10440
10441 if (Output.isFilename()) {
10442 CmdArgs.push_back("-o");
10443 CmdArgs.push_back(Output.getFilename());
10444 } else {
10445 assert(Output.isNothing() && "Invalid output.");
10446 }
10447
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010448 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10449
Douglas Katzman78b37b02015-11-17 20:28:07 +000010450 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010451 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010452 if (!Args.hasArg(options::OPT_shared)) {
10453 if (Args.hasArg(options::OPT_pg))
10454 crt1 = "gcrt1.o";
10455 else if (Args.hasArg(options::OPT_pie))
10456 crt1 = "Scrt1.o";
10457 else
10458 crt1 = "crt1.o";
10459 }
10460 if (crt1)
10461 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10462
10463 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10464
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010465 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010466 if (Args.hasArg(options::OPT_static))
10467 crtbegin = "crtbeginT.o";
10468 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10469 crtbegin = "crtbeginS.o";
10470 else
10471 crtbegin = "crtbegin.o";
10472
10473 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10474 }
10475
10476 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010477 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010478 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10479 Args.AddAllArgs(CmdArgs, options::OPT_e);
10480 Args.AddAllArgs(CmdArgs, options::OPT_s);
10481 Args.AddAllArgs(CmdArgs, options::OPT_t);
10482 Args.AddAllArgs(CmdArgs, options::OPT_r);
10483
10484 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10485 CmdArgs.push_back("--no-demangle");
10486
10487 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10488
Douglas Katzman78b37b02015-11-17 20:28:07 +000010489 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010490 // For PS4, we always want to pass libm, libstdc++ and libkernel
10491 // libraries for both C and C++ compilations.
10492 CmdArgs.push_back("-lkernel");
10493 if (D.CCCIsCXX()) {
10494 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10495 if (Args.hasArg(options::OPT_pg))
10496 CmdArgs.push_back("-lm_p");
10497 else
10498 CmdArgs.push_back("-lm");
10499 }
10500 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10501 // the default system libraries. Just mimic this for now.
10502 if (Args.hasArg(options::OPT_pg))
10503 CmdArgs.push_back("-lgcc_p");
10504 else
10505 CmdArgs.push_back("-lcompiler_rt");
10506 if (Args.hasArg(options::OPT_static)) {
10507 CmdArgs.push_back("-lstdc++");
10508 } else if (Args.hasArg(options::OPT_pg)) {
10509 CmdArgs.push_back("-lgcc_eh_p");
10510 } else {
10511 CmdArgs.push_back("--as-needed");
10512 CmdArgs.push_back("-lstdc++");
10513 CmdArgs.push_back("--no-as-needed");
10514 }
10515
10516 if (Args.hasArg(options::OPT_pthread)) {
10517 if (Args.hasArg(options::OPT_pg))
10518 CmdArgs.push_back("-lpthread_p");
10519 else
10520 CmdArgs.push_back("-lpthread");
10521 }
10522
10523 if (Args.hasArg(options::OPT_pg)) {
10524 if (Args.hasArg(options::OPT_shared))
10525 CmdArgs.push_back("-lc");
10526 else {
10527 if (Args.hasArg(options::OPT_static)) {
10528 CmdArgs.push_back("--start-group");
10529 CmdArgs.push_back("-lc_p");
10530 CmdArgs.push_back("-lpthread_p");
10531 CmdArgs.push_back("--end-group");
10532 } else {
10533 CmdArgs.push_back("-lc_p");
10534 }
10535 }
10536 CmdArgs.push_back("-lgcc_p");
10537 } else {
10538 if (Args.hasArg(options::OPT_static)) {
10539 CmdArgs.push_back("--start-group");
10540 CmdArgs.push_back("-lc");
10541 CmdArgs.push_back("-lpthread");
10542 CmdArgs.push_back("--end-group");
10543 } else {
10544 CmdArgs.push_back("-lc");
10545 }
10546 CmdArgs.push_back("-lcompiler_rt");
10547 }
10548
10549 if (Args.hasArg(options::OPT_static)) {
10550 CmdArgs.push_back("-lstdc++");
10551 } else if (Args.hasArg(options::OPT_pg)) {
10552 CmdArgs.push_back("-lgcc_eh_p");
10553 } else {
10554 CmdArgs.push_back("--as-needed");
10555 CmdArgs.push_back("-lstdc++");
10556 CmdArgs.push_back("--no-as-needed");
10557 }
10558 }
10559
Douglas Katzman78b37b02015-11-17 20:28:07 +000010560 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010561 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10562 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10563 else
10564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10565 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10566 }
10567
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010568 const char *Exec =
10569#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010570 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010571#else
10572 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10573#endif
10574
10575 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10576}
10577
10578void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10579 const InputInfo &Output,
10580 const InputInfoList &Inputs,
10581 const ArgList &Args,
10582 const char *LinkingOutput) const {
10583 const toolchains::FreeBSD &ToolChain =
10584 static_cast<const toolchains::FreeBSD &>(getToolChain());
10585 const Driver &D = ToolChain.getDriver();
10586 bool PS4Linker;
10587 StringRef LinkerOptName;
10588 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10589 LinkerOptName = A->getValue();
10590 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10591 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10592 }
10593
10594 if (LinkerOptName == "gold")
10595 PS4Linker = false;
10596 else if (LinkerOptName == "ps4")
10597 PS4Linker = true;
10598 else
10599 PS4Linker = !Args.hasArg(options::OPT_shared);
10600
10601 if (PS4Linker)
10602 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10603 else
10604 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10605}