blob: e65a84cb266dc72b882593e31f354efdb9189b61 [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
Akira Hatanaka580efb22015-07-16 00:43:00 +0000941 // The kext linker doesn't know how to deal with movw/movt.
942 if (KernelOrKext)
943 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))
1441 D.Diag(diag::err_drv_invalid_mfloat_abi)
1442 << "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
Kevin Qin110db6f2014-07-18 07:03:22 +00002072// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002073static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002074 std::vector<const char *> &Features) {
2075 SmallVector<StringRef, 8> Split;
2076 text.split(Split, StringRef("+"), -1, false);
2077
Benjamin Kramer72e64312015-09-24 14:48:49 +00002078 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002079 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002080 .Case("fp", "+fp-armv8")
2081 .Case("simd", "+neon")
2082 .Case("crc", "+crc")
2083 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002084 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002085 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002086 .Case("nofp", "-fp-armv8")
2087 .Case("nosimd", "-neon")
2088 .Case("nocrc", "-crc")
2089 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002090 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002091 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002092 .Default(nullptr);
2093 if (result)
2094 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002095 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002096 D.Diag(diag::err_drv_no_neon_modifier);
2097 else
2098 return false;
2099 }
2100 return true;
2101}
2102
2103// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2104// decode CPU and feature.
2105static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2106 std::vector<const char *> &Features) {
2107 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2108 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002109 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002110 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002111 Features.push_back("+neon");
2112 Features.push_back("+crc");
2113 Features.push_back("+crypto");
2114 } else if (CPU == "generic") {
2115 Features.push_back("+neon");
2116 } else {
2117 return false;
2118 }
2119
2120 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2121 return false;
2122
2123 return true;
2124}
2125
2126static bool
2127getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2128 const ArgList &Args,
2129 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002130 std::string MarchLowerCase = March.lower();
2131 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002133 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002134 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002136 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002137 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2138 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002139 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002140 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002141 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002142
2143 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2144 return false;
2145
2146 return true;
2147}
2148
2149static bool
2150getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2151 const ArgList &Args,
2152 std::vector<const char *> &Features) {
2153 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002154 std::string McpuLowerCase = Mcpu.lower();
2155 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002156 return false;
2157
2158 return true;
2159}
2160
2161static bool
2162getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2163 const ArgList &Args,
2164 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002165 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002166 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002167 if (MtuneLowerCase == "native")
2168 MtuneLowerCase = llvm::sys::getHostCPUName();
2169 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002170 Features.push_back("+zcm");
2171 Features.push_back("+zcz");
2172 }
2173 return true;
2174}
2175
2176static bool
2177getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2178 const ArgList &Args,
2179 std::vector<const char *> &Features) {
2180 StringRef CPU;
2181 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002182 std::string McpuLowerCase = Mcpu.lower();
2183 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002184 return false;
2185
2186 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2187}
2188
Justin Bognerf9052562015-11-13 23:07:31 +00002189static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002190 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002191 Arg *A;
2192 bool success = true;
2193 // Enable NEON by default.
2194 Features.push_back("+neon");
2195 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2196 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2197 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2198 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002199 else if (Args.hasArg(options::OPT_arch))
2200 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2201 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002202
2203 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2204 success =
2205 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2206 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2207 success =
2208 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002209 else if (Args.hasArg(options::OPT_arch))
2210 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2211 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002212
2213 if (!success)
2214 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002215
2216 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2217 Features.push_back("-fp-armv8");
2218 Features.push_back("-crypto");
2219 Features.push_back("-neon");
2220 }
Bradley Smith418c5932014-05-02 15:17:51 +00002221
2222 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002224 if (A->getOption().matches(options::OPT_mcrc))
2225 Features.push_back("+crc");
2226 else
2227 Features.push_back("-crc");
2228 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002229
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002230 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2231 options::OPT_munaligned_access))
2232 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2233 Features.push_back("+strict-align");
2234
Justin Bognerf9052562015-11-13 23:07:31 +00002235 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002236 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002237}
2238
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002239static void getHexagonTargetFeatures(const ArgList &Args,
2240 std::vector<const char *> &Features) {
2241 bool HasHVX = false, HasHVXD = false;
2242
Eric Christopher49062a52015-12-22 03:12:34 +00002243 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2244 // doing dependent option handling here rather than in initFeatureMap or a
2245 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002246 for (auto &A : Args) {
2247 auto &Opt = A->getOption();
2248 if (Opt.matches(options::OPT_mhexagon_hvx))
2249 HasHVX = true;
2250 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2251 HasHVXD = HasHVX = false;
2252 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2253 HasHVXD = HasHVX = true;
2254 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2255 HasHVXD = false;
2256 else
2257 continue;
2258 A->claim();
2259 }
2260
2261 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2262 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2263}
2264
Dan Gohmanc2853072015-09-03 22:51:53 +00002265static void getWebAssemblyTargetFeatures(const ArgList &Args,
2266 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002267 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002268}
2269
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002270static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002271 const ArgList &Args, ArgStringList &CmdArgs,
2272 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002273 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002274 std::vector<const char *> Features;
2275 switch (Triple.getArch()) {
2276 default:
2277 break;
2278 case llvm::Triple::mips:
2279 case llvm::Triple::mipsel:
2280 case llvm::Triple::mips64:
2281 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002282 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002283 break;
2284
2285 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002286 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002287 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002288 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002289 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002290 break;
2291
2292 case llvm::Triple::ppc:
2293 case llvm::Triple::ppc64:
2294 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002295 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002296 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002297 case llvm::Triple::systemz:
2298 getSystemZTargetFeatures(Args, Features);
2299 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002300 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002301 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002302 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002303 break;
2304 case llvm::Triple::x86:
2305 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002306 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002307 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002308 case llvm::Triple::hexagon:
2309 getHexagonTargetFeatures(Args, Features);
2310 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002311 case llvm::Triple::wasm32:
2312 case llvm::Triple::wasm64:
2313 getWebAssemblyTargetFeatures(Args, Features);
2314 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 }
Rafael Espindola43964802013-08-21 17:34:32 +00002316
2317 // Find the last of each feature.
2318 llvm::StringMap<unsigned> LastOpt;
2319 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2320 const char *Name = Features[I];
2321 assert(Name[0] == '-' || Name[0] == '+');
2322 LastOpt[Name + 1] = I;
2323 }
2324
2325 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2326 // If this feature was overridden, ignore it.
2327 const char *Name = Features[I];
2328 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2329 assert(LastI != LastOpt.end());
2330 unsigned Last = LastI->second;
2331 if (Last != I)
2332 continue;
2333
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002334 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002335 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002336 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002337}
2338
David Majnemerae394812014-12-09 00:12:30 +00002339static bool
2340shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2341 const llvm::Triple &Triple) {
2342 // We use the zero-cost exception tables for Objective-C if the non-fragile
2343 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2344 // later.
2345 if (runtime.isNonFragile())
2346 return true;
2347
2348 if (!Triple.isMacOSX())
2349 return false;
2350
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002351 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002352 (Triple.getArch() == llvm::Triple::x86_64 ||
2353 Triple.getArch() == llvm::Triple::arm));
2354}
2355
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002356/// Adds exception related arguments to the driver command arguments. There's a
2357/// master flag, -fexceptions and also language specific flags to enable/disable
2358/// C++ and Objective-C exceptions. This makes it possible to for example
2359/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002360static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002361 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002362 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002363 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002364 const Driver &D = TC.getDriver();
2365 const llvm::Triple &Triple = TC.getTriple();
2366
Chad Rosier4fab82c2012-03-26 22:04:46 +00002367 if (KernelOrKext) {
2368 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2369 // arguments now to avoid warnings about unused arguments.
2370 Args.ClaimAllArgs(options::OPT_fexceptions);
2371 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2372 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2373 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2374 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2375 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002376 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002377 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002378
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002379 // See if the user explicitly enabled exceptions.
2380 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2381 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002382
David Majnemerae394812014-12-09 00:12:30 +00002383 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2384 // is not necessarily sensible, but follows GCC.
2385 if (types::isObjC(InputType) &&
2386 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002387 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002388 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002389
David Majnemerae394812014-12-09 00:12:30 +00002390 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002391 }
2392
2393 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002394 // Disable C++ EH by default on XCore, PS4, and MSVC.
2395 // FIXME: Remove MSVC from this list once things work.
2396 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2397 !Triple.isPS4CPU() &&
2398 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002399 Arg *ExceptionArg = Args.getLastArg(
2400 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2401 options::OPT_fexceptions, options::OPT_fno_exceptions);
2402 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002403 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002404 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2405 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002406
2407 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002408 if (Triple.isPS4CPU()) {
2409 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2410 assert(ExceptionArg &&
2411 "On the PS4 exceptions should only be enabled if passing "
2412 "an argument");
2413 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2414 const Arg *RTTIArg = TC.getRTTIArg();
2415 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2416 D.Diag(diag::err_drv_argument_not_allowed_with)
2417 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2418 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2419 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2420 } else
2421 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2422
Anders Carlssone96ab552011-02-28 02:27:16 +00002423 CmdArgs.push_back("-fcxx-exceptions");
2424
David Majnemer8de68642014-12-05 08:11:58 +00002425 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002426 }
2427 }
2428
David Majnemer8de68642014-12-05 08:11:58 +00002429 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002430 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002431}
2432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002433static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002434 bool Default = true;
2435 if (TC.getTriple().isOSDarwin()) {
2436 // The native darwin assembler doesn't support the linker_option directives,
2437 // so we disable them if we think the .s file will be passed to it.
2438 Default = TC.useIntegratedAs();
2439 }
2440 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2441 Default);
2442}
2443
Ted Kremenek62093662013-03-12 17:02:12 +00002444static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2445 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002446 bool UseDwarfDirectory =
2447 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2448 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002449 return !UseDwarfDirectory;
2450}
2451
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002452/// \brief Check whether the given input tree contains any compilation actions.
2453static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002454 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002455 return true;
2456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002457 for (const auto &Act : *A)
2458 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002459 return true;
2460
2461 return false;
2462}
2463
2464/// \brief Check if -relax-all should be passed to the internal assembler.
2465/// This is done by default when compiling non-assembler source with -O0.
2466static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2467 bool RelaxDefault = true;
2468
2469 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2470 RelaxDefault = A->getOption().matches(options::OPT_O0);
2471
2472 if (RelaxDefault) {
2473 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002474 for (const auto &Act : C.getActions()) {
2475 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002476 RelaxDefault = true;
2477 break;
2478 }
2479 }
2480 }
2481
2482 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002483 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002484}
2485
Paul Robinson0334a042015-12-19 19:41:48 +00002486// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2487// to the corresponding DebugInfoKind.
2488static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
2489 assert(A.getOption().matches(options::OPT_gN_Group) &&
2490 "Not a -g option that specifies a debug-info level");
2491 if (A.getOption().matches(options::OPT_g0) ||
2492 A.getOption().matches(options::OPT_ggdb0))
2493 return CodeGenOptions::NoDebugInfo;
2494 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2495 A.getOption().matches(options::OPT_ggdb1))
2496 return CodeGenOptions::DebugLineTablesOnly;
2497 return CodeGenOptions::LimitedDebugInfo;
2498}
2499
Douglas Katzman3459ce22015-10-08 04:24:12 +00002500// Extract the integer N from a string spelled "-dwarf-N", returning 0
2501// on mismatch. The StringRef input (rather than an Arg) allows
2502// for use by the "-Xassembler" option parser.
2503static unsigned DwarfVersionNum(StringRef ArgValue) {
2504 return llvm::StringSwitch<unsigned>(ArgValue)
2505 .Case("-gdwarf-2", 2)
2506 .Case("-gdwarf-3", 3)
2507 .Case("-gdwarf-4", 4)
2508 .Default(0);
2509}
2510
2511static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2512 CodeGenOptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002513 unsigned DwarfVersion,
2514 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002515 switch (DebugInfoKind) {
2516 case CodeGenOptions::DebugLineTablesOnly:
2517 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2518 break;
2519 case CodeGenOptions::LimitedDebugInfo:
2520 CmdArgs.push_back("-debug-info-kind=limited");
2521 break;
2522 case CodeGenOptions::FullDebugInfo:
2523 CmdArgs.push_back("-debug-info-kind=standalone");
2524 break;
2525 default:
2526 break;
2527 }
2528 if (DwarfVersion > 0)
2529 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002530 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002531 switch (DebuggerTuning) {
2532 case llvm::DebuggerKind::GDB:
2533 CmdArgs.push_back("-debugger-tuning=gdb");
2534 break;
2535 case llvm::DebuggerKind::LLDB:
2536 CmdArgs.push_back("-debugger-tuning=lldb");
2537 break;
2538 case llvm::DebuggerKind::SCE:
2539 CmdArgs.push_back("-debugger-tuning=sce");
2540 break;
2541 default:
2542 break;
2543 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002544}
2545
David Blaikie9260ed62013-07-25 21:19:01 +00002546static void CollectArgsForIntegratedAssembler(Compilation &C,
2547 const ArgList &Args,
2548 ArgStringList &CmdArgs,
2549 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002550 if (UseRelaxAll(C, Args))
2551 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002552
David Majnemer2b9349d2015-12-21 22:09:34 +00002553 // Only default to -mincremental-linker-compatible if we think we are
2554 // targeting the MSVC linker.
2555 bool DefaultIncrementalLinkerCompatible =
2556 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2557 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2558 options::OPT_mno_incremental_linker_compatible,
2559 DefaultIncrementalLinkerCompatible))
2560 CmdArgs.push_back("-mincremental-linker-compatible");
2561
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002562 // When passing -I arguments to the assembler we sometimes need to
2563 // unconditionally take the next argument. For example, when parsing
2564 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2565 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2566 // arg after parsing the '-I' arg.
2567 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002568
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002569 // When using an integrated assembler, translate -Wa, and -Xassembler
2570 // options.
2571 bool CompressDebugSections = false;
2572 for (const Arg *A :
2573 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2574 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002575
Benjamin Kramer72e64312015-09-24 14:48:49 +00002576 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002577 if (TakeNextArg) {
2578 CmdArgs.push_back(Value.data());
2579 TakeNextArg = false;
2580 continue;
2581 }
David Blaikie9260ed62013-07-25 21:19:01 +00002582
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002583 switch (C.getDefaultToolChain().getArch()) {
2584 default:
2585 break;
2586 case llvm::Triple::mips:
2587 case llvm::Triple::mipsel:
2588 case llvm::Triple::mips64:
2589 case llvm::Triple::mips64el:
2590 if (Value == "--trap") {
2591 CmdArgs.push_back("-target-feature");
2592 CmdArgs.push_back("+use-tcc-in-div");
2593 continue;
2594 }
2595 if (Value == "--break") {
2596 CmdArgs.push_back("-target-feature");
2597 CmdArgs.push_back("-use-tcc-in-div");
2598 continue;
2599 }
2600 if (Value.startswith("-msoft-float")) {
2601 CmdArgs.push_back("-target-feature");
2602 CmdArgs.push_back("+soft-float");
2603 continue;
2604 }
2605 if (Value.startswith("-mhard-float")) {
2606 CmdArgs.push_back("-target-feature");
2607 CmdArgs.push_back("-soft-float");
2608 continue;
2609 }
2610 break;
2611 }
2612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002613 if (Value == "-force_cpusubtype_ALL") {
2614 // Do nothing, this is the default and we don't support anything else.
2615 } else if (Value == "-L") {
2616 CmdArgs.push_back("-msave-temp-labels");
2617 } else if (Value == "--fatal-warnings") {
2618 CmdArgs.push_back("-massembler-fatal-warnings");
2619 } else if (Value == "--noexecstack") {
2620 CmdArgs.push_back("-mnoexecstack");
2621 } else if (Value == "-compress-debug-sections" ||
2622 Value == "--compress-debug-sections") {
2623 CompressDebugSections = true;
2624 } else if (Value == "-nocompress-debug-sections" ||
2625 Value == "--nocompress-debug-sections") {
2626 CompressDebugSections = false;
2627 } else if (Value.startswith("-I")) {
2628 CmdArgs.push_back(Value.data());
2629 // We need to consume the next argument if the current arg is a plain
2630 // -I. The next arg will be the include directory.
2631 if (Value == "-I")
2632 TakeNextArg = true;
2633 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002634 // "-gdwarf-N" options are not cc1as options.
2635 unsigned DwarfVersion = DwarfVersionNum(Value);
2636 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2637 CmdArgs.push_back(Value.data());
2638 } else {
2639 RenderDebugEnablingArgs(
Paul Robinson0334a042015-12-19 19:41:48 +00002640 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion,
2641 llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002642 }
Renato Golin7c542b42015-07-27 23:44:45 +00002643 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2644 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2645 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646 } else {
2647 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002648 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002649 }
2650 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002651 }
2652 if (CompressDebugSections) {
2653 if (llvm::zlib::isAvailable())
2654 CmdArgs.push_back("-compress-debug-sections");
2655 else
2656 D.Diag(diag::warn_debug_compression_unavailable);
2657 }
David Blaikie9260ed62013-07-25 21:19:01 +00002658}
2659
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002660// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002661// FIXME: Make sure we can also emit shared objects if they're requested
2662// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002663static void addClangRT(const ToolChain &TC, const ArgList &Args,
2664 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002665 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002666}
2667
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002668namespace {
2669enum OpenMPRuntimeKind {
2670 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2671 /// without knowing what runtime to target.
2672 OMPRT_Unknown,
2673
2674 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2675 /// the default for Clang.
2676 OMPRT_OMP,
2677
2678 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2679 /// this runtime but can swallow the pragmas, and find and link against the
2680 /// runtime library itself.
2681 OMPRT_GOMP,
2682
Chandler Carruthc6625c62015-05-28 21:10:31 +00002683 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002684 /// OpenMP runtime. We support this mode for users with existing dependencies
2685 /// on this runtime library name.
2686 OMPRT_IOMP5
2687};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002688}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002689
2690/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002691static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2692 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002693 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2694
2695 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2696 if (A)
2697 RuntimeName = A->getValue();
2698
2699 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002700 .Case("libomp", OMPRT_OMP)
2701 .Case("libgomp", OMPRT_GOMP)
2702 .Case("libiomp5", OMPRT_IOMP5)
2703 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002704
2705 if (RT == OMPRT_Unknown) {
2706 if (A)
2707 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002708 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002709 else
2710 // FIXME: We could use a nicer diagnostic here.
2711 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2712 }
2713
2714 return RT;
2715}
2716
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002717static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2718 const ArgList &Args) {
2719 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2720 options::OPT_fno_openmp, false))
2721 return;
2722
2723 switch (getOpenMPRuntime(TC, Args)) {
2724 case OMPRT_OMP:
2725 CmdArgs.push_back("-lomp");
2726 break;
2727 case OMPRT_GOMP:
2728 CmdArgs.push_back("-lgomp");
2729 break;
2730 case OMPRT_IOMP5:
2731 CmdArgs.push_back("-liomp5");
2732 break;
2733 case OMPRT_Unknown:
2734 // Already diagnosed.
2735 break;
2736 }
2737}
2738
Alexey Samsonov52550342014-09-15 19:58:40 +00002739static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2740 ArgStringList &CmdArgs, StringRef Sanitizer,
2741 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002742 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002743 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002744 if (!IsShared) CmdArgs.push_back("-whole-archive");
2745 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2746 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002747}
2748
Alexey Samsonov52550342014-09-15 19:58:40 +00002749// Tries to use a file with the list of dynamic symbols that need to be exported
2750// from the runtime library. Returns true if the file was found.
2751static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2752 ArgStringList &CmdArgs,
2753 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002754 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002755 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2756 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002757 return true;
2758 }
2759 return false;
2760}
2761
2762static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2763 ArgStringList &CmdArgs) {
2764 // Force linking against the system libraries sanitizers depends on
2765 // (see PR15823 why this is necessary).
2766 CmdArgs.push_back("--no-as-needed");
2767 CmdArgs.push_back("-lpthread");
2768 CmdArgs.push_back("-lrt");
2769 CmdArgs.push_back("-lm");
2770 // There's no libdl on FreeBSD.
2771 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2772 CmdArgs.push_back("-ldl");
2773}
2774
2775static void
2776collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2777 SmallVectorImpl<StringRef> &SharedRuntimes,
2778 SmallVectorImpl<StringRef> &StaticRuntimes,
2779 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2780 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2781 // Collect shared runtimes.
2782 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2783 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002784 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002785
Alexey Samsonov52550342014-09-15 19:58:40 +00002786 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002787 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002788 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002789 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002790 }
2791 if (SanArgs.needsAsanRt()) {
2792 if (SanArgs.needsSharedAsanRt()) {
2793 HelperStaticRuntimes.push_back("asan-preinit");
2794 } else {
2795 StaticRuntimes.push_back("asan");
2796 if (SanArgs.linkCXXRuntimes())
2797 StaticRuntimes.push_back("asan_cxx");
2798 }
2799 }
2800 if (SanArgs.needsDfsanRt())
2801 StaticRuntimes.push_back("dfsan");
2802 if (SanArgs.needsLsanRt())
2803 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002804 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002805 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002806 if (SanArgs.linkCXXRuntimes())
2807 StaticRuntimes.push_back("msan_cxx");
2808 }
2809 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002810 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002811 if (SanArgs.linkCXXRuntimes())
2812 StaticRuntimes.push_back("tsan_cxx");
2813 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002814 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002815 StaticRuntimes.push_back("ubsan_standalone");
2816 if (SanArgs.linkCXXRuntimes())
2817 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002818 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002819 if (SanArgs.needsSafeStackRt())
2820 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002821 if (SanArgs.needsCfiRt())
2822 StaticRuntimes.push_back("cfi");
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002823 if (SanArgs.needsCfiDiagRt())
2824 StaticRuntimes.push_back("cfi_diag");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002825}
2826
Alexey Samsonov52550342014-09-15 19:58:40 +00002827// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2828// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2829static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002830 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002831 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2832 HelperStaticRuntimes;
2833 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2834 HelperStaticRuntimes);
2835 for (auto RT : SharedRuntimes)
2836 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2837 for (auto RT : HelperStaticRuntimes)
2838 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2839 bool AddExportDynamic = false;
2840 for (auto RT : StaticRuntimes) {
2841 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2842 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2843 }
2844 // If there is a static runtime with no dynamic list, force all the symbols
2845 // to be dynamic to be sure we export sanitizer interface functions.
2846 if (AddExportDynamic)
2847 CmdArgs.push_back("-export-dynamic");
2848 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002849}
2850
Reid Kleckner86ea7702015-02-04 23:45:07 +00002851static bool areOptimizationsEnabled(const ArgList &Args) {
2852 // Find the last -O arg and see if it is non-zero.
2853 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2854 return !A->getOption().matches(options::OPT_O0);
2855 // Defaults to -O0.
2856 return false;
2857}
2858
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002859static bool shouldUseFramePointerForTarget(const ArgList &Args,
2860 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002861 switch (Triple.getArch()) {
2862 case llvm::Triple::xcore:
2863 case llvm::Triple::wasm32:
2864 case llvm::Triple::wasm64:
2865 // XCore never wants frame pointers, regardless of OS.
2866 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002867 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002868 default:
2869 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002870 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002871
2872 if (Triple.isOSLinux()) {
2873 switch (Triple.getArch()) {
2874 // Don't use a frame pointer on linux if optimizing for certain targets.
2875 case llvm::Triple::mips64:
2876 case llvm::Triple::mips64el:
2877 case llvm::Triple::mips:
2878 case llvm::Triple::mipsel:
2879 case llvm::Triple::systemz:
2880 case llvm::Triple::x86:
2881 case llvm::Triple::x86_64:
2882 return !areOptimizationsEnabled(Args);
2883 default:
2884 return true;
2885 }
2886 }
2887
2888 if (Triple.isOSWindows()) {
2889 switch (Triple.getArch()) {
2890 case llvm::Triple::x86:
2891 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002892 case llvm::Triple::arm:
2893 case llvm::Triple::thumb:
2894 // Windows on ARM builds with FPO disabled to aid fast stack walking
2895 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002896 default:
2897 // All other supported Windows ISAs use xdata unwind information, so frame
2898 // pointers are not generally useful.
2899 return false;
2900 }
2901 }
2902
2903 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002904}
2905
Rafael Espindola224dd632011-12-14 21:02:23 +00002906static bool shouldUseFramePointer(const ArgList &Args,
2907 const llvm::Triple &Triple) {
2908 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2909 options::OPT_fomit_frame_pointer))
2910 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002911 if (Args.hasArg(options::OPT_pg))
2912 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002913
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002914 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002915}
2916
Eric Christopherb7d97e92013-04-03 01:58:53 +00002917static bool shouldUseLeafFramePointer(const ArgList &Args,
2918 const llvm::Triple &Triple) {
2919 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2920 options::OPT_momit_leaf_frame_pointer))
2921 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002922 if (Args.hasArg(options::OPT_pg))
2923 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002924
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002925 if (Triple.isPS4CPU())
2926 return false;
2927
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002928 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002929}
2930
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002931/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002932static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002933 SmallString<128> cwd;
2934 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002935 CmdArgs.push_back("-fdebug-compilation-dir");
2936 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002937 }
2938}
2939
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002940static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002941 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2942 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2943 SmallString<128> T(FinalOutput->getValue());
2944 llvm::sys::path::replace_extension(T, "dwo");
2945 return Args.MakeArgString(T);
2946 } else {
2947 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002948 SmallString<128> T(
2949 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002950 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002951 llvm::sys::path::replace_extension(F, "dwo");
2952 T += F;
2953 return Args.MakeArgString(F);
2954 }
2955}
2956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002957static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2958 const JobAction &JA, const ArgList &Args,
2959 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002960 ArgStringList ExtractArgs;
2961 ExtractArgs.push_back("--extract-dwo");
2962
2963 ArgStringList StripArgs;
2964 StripArgs.push_back("--strip-dwo");
2965
2966 // Grabbing the output of the earlier compile step.
2967 StripArgs.push_back(Output.getFilename());
2968 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002969 ExtractArgs.push_back(OutFile);
2970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002972 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002973
2974 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002975 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002976
2977 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002978 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002979}
2980
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002981/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002982/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2983static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002984 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002985 if (A->getOption().matches(options::OPT_O4) ||
2986 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002987 return true;
2988
2989 if (A->getOption().matches(options::OPT_O0))
2990 return false;
2991
2992 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2993
Rafael Espindola91780de2013-08-26 14:05:41 +00002994 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002995 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002996 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002997 return true;
2998
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002999 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003000 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003001 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003002
3003 unsigned OptLevel = 0;
3004 if (S.getAsInteger(10, OptLevel))
3005 return false;
3006
3007 return OptLevel > 1;
3008 }
3009
3010 return false;
3011}
3012
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003013/// Add -x lang to \p CmdArgs for \p Input.
3014static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3015 ArgStringList &CmdArgs) {
3016 // When using -verify-pch, we don't want to provide the type
3017 // 'precompiled-header' if it was inferred from the file extension
3018 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3019 return;
3020
3021 CmdArgs.push_back("-x");
3022 if (Args.hasArg(options::OPT_rewrite_objc))
3023 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3024 else
3025 CmdArgs.push_back(types::getTypeName(Input.getType()));
3026}
3027
David Majnemerc371ff02015-03-22 08:39:22 +00003028static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003029 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003030 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003031
3032 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003033 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003034
3035 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003036 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003037 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003038 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003039}
3040
Rafael Espindola577637a2015-01-03 00:06:04 +00003041// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003042// options that build systems might add but are unused when assembling or only
3043// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003044static void claimNoWarnArgs(const ArgList &Args) {
3045 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003046 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003047 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003048 Args.ClaimAllArgs(options::OPT_flto);
3049 Args.ClaimAllArgs(options::OPT_fno_lto);
3050}
3051
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003052static void appendUserToPath(SmallVectorImpl<char> &Result) {
3053#ifdef LLVM_ON_UNIX
3054 const char *Username = getenv("LOGNAME");
3055#else
3056 const char *Username = getenv("USERNAME");
3057#endif
3058 if (Username) {
3059 // Validate that LoginName can be used in a path, and get its length.
3060 size_t Len = 0;
3061 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003062 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003063 Username = nullptr;
3064 break;
3065 }
3066 }
3067
3068 if (Username && Len > 0) {
3069 Result.append(Username, Username + Len);
3070 return;
3071 }
3072 }
3073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003074// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003075#ifdef LLVM_ON_UNIX
3076 std::string UID = llvm::utostr(getuid());
3077#else
3078 // FIXME: Windows seems to have an 'SID' that might work.
3079 std::string UID = "9999";
3080#endif
3081 Result.append(UID.begin(), UID.end());
3082}
3083
David Majnemere11d3732015-06-08 00:22:46 +00003084VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3085 const llvm::Triple &Triple,
3086 const llvm::opt::ArgList &Args,
3087 bool IsWindowsMSVC) {
3088 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3089 IsWindowsMSVC) ||
3090 Args.hasArg(options::OPT_fmsc_version) ||
3091 Args.hasArg(options::OPT_fms_compatibility_version)) {
3092 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3093 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003094 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003095
3096 if (MSCVersion && MSCompatibilityVersion) {
3097 if (D)
3098 D->Diag(diag::err_drv_argument_not_allowed_with)
3099 << MSCVersion->getAsString(Args)
3100 << MSCompatibilityVersion->getAsString(Args);
3101 return VersionTuple();
3102 }
3103
3104 if (MSCompatibilityVersion) {
3105 VersionTuple MSVT;
3106 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3107 D->Diag(diag::err_drv_invalid_value)
3108 << MSCompatibilityVersion->getAsString(Args)
3109 << MSCompatibilityVersion->getValue();
3110 return MSVT;
3111 }
3112
3113 if (MSCVersion) {
3114 unsigned Version = 0;
3115 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3116 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3117 << MSCVersion->getValue();
3118 return getMSCompatibilityVersion(Version);
3119 }
3120
3121 unsigned Major, Minor, Micro;
3122 Triple.getEnvironmentVersion(Major, Minor, Micro);
3123 if (Major || Minor || Micro)
3124 return VersionTuple(Major, Minor, Micro);
3125
3126 return VersionTuple(18);
3127 }
3128 return VersionTuple();
3129}
3130
Diego Novilloa0545962015-07-10 18:00:07 +00003131static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3132 const InputInfo &Output, const ArgList &Args,
3133 ArgStringList &CmdArgs) {
3134 auto *ProfileGenerateArg = Args.getLastArg(
3135 options::OPT_fprofile_instr_generate,
3136 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003137 options::OPT_fprofile_generate_EQ,
3138 options::OPT_fno_profile_instr_generate);
3139 if (ProfileGenerateArg &&
3140 ProfileGenerateArg->getOption().matches(
3141 options::OPT_fno_profile_instr_generate))
3142 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003143
3144 auto *ProfileUseArg = Args.getLastArg(
3145 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003146 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3147 options::OPT_fno_profile_instr_use);
3148 if (ProfileUseArg &&
3149 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3150 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003151
3152 if (ProfileGenerateArg && ProfileUseArg)
3153 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003154 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003155
Diego Novillo758f3f52015-08-05 21:49:51 +00003156 if (ProfileGenerateArg) {
3157 if (ProfileGenerateArg->getOption().matches(
3158 options::OPT_fprofile_instr_generate_EQ))
3159 ProfileGenerateArg->render(Args, CmdArgs);
3160 else if (ProfileGenerateArg->getOption().matches(
3161 options::OPT_fprofile_generate_EQ)) {
3162 SmallString<128> Path(ProfileGenerateArg->getValue());
3163 llvm::sys::path::append(Path, "default.profraw");
3164 CmdArgs.push_back(
3165 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3166 } else
3167 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3168 }
Diego Novilloa0545962015-07-10 18:00:07 +00003169
Diego Novillo758f3f52015-08-05 21:49:51 +00003170 if (ProfileUseArg) {
3171 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3172 ProfileUseArg->render(Args, CmdArgs);
3173 else if ((ProfileUseArg->getOption().matches(
3174 options::OPT_fprofile_use_EQ) ||
3175 ProfileUseArg->getOption().matches(
3176 options::OPT_fprofile_instr_use))) {
3177 SmallString<128> Path(
3178 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3179 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3180 llvm::sys::path::append(Path, "default.profdata");
3181 CmdArgs.push_back(
3182 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3183 }
Diego Novilloa0545962015-07-10 18:00:07 +00003184 }
3185
3186 if (Args.hasArg(options::OPT_ftest_coverage) ||
3187 Args.hasArg(options::OPT_coverage))
3188 CmdArgs.push_back("-femit-coverage-notes");
3189 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3190 false) ||
3191 Args.hasArg(options::OPT_coverage))
3192 CmdArgs.push_back("-femit-coverage-data");
3193
Diego Novilloc4b94da2015-08-05 23:27:40 +00003194 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3195 options::OPT_fno_coverage_mapping, false) &&
3196 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003197 D.Diag(diag::err_drv_argument_only_allowed_with)
3198 << "-fcoverage-mapping"
3199 << "-fprofile-instr-generate";
3200
Diego Novilloc4b94da2015-08-05 23:27:40 +00003201 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3202 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003203 CmdArgs.push_back("-fcoverage-mapping");
3204
3205 if (C.getArgs().hasArg(options::OPT_c) ||
3206 C.getArgs().hasArg(options::OPT_S)) {
3207 if (Output.isFilename()) {
3208 CmdArgs.push_back("-coverage-file");
3209 SmallString<128> CoverageFilename;
3210 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3211 CoverageFilename = FinalOutput->getValue();
3212 } else {
3213 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3214 }
3215 if (llvm::sys::path::is_relative(CoverageFilename)) {
3216 SmallString<128> Pwd;
3217 if (!llvm::sys::fs::current_path(Pwd)) {
3218 llvm::sys::path::append(Pwd, CoverageFilename);
3219 CoverageFilename.swap(Pwd);
3220 }
3221 }
3222 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3223 }
3224 }
3225}
3226
Paul Robinsond083b9a2015-12-16 17:25:27 +00003227static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3228 ArgStringList &CmdArgs) {
3229 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3230 false) ||
3231 Args.hasFlag(options::OPT_fprofile_generate,
3232 options::OPT_fno_profile_instr_generate, false) ||
3233 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3234 options::OPT_fno_profile_instr_generate, false) ||
3235 Args.hasFlag(options::OPT_fprofile_instr_generate,
3236 options::OPT_fno_profile_instr_generate, false) ||
3237 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3238 options::OPT_fno_profile_instr_generate, false) ||
3239 Args.hasArg(options::OPT_fcreate_profile) ||
3240 Args.hasArg(options::OPT_coverage)))
3241 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3242}
3243
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003244/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3245/// smooshes them together with platform defaults, to decide whether
3246/// this compile should be using PIC mode or not. Returns a tuple of
3247/// (RelocationModel, PICLevel, IsPIE).
3248static std::tuple<llvm::Reloc::Model, unsigned, bool>
3249ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3250 const ArgList &Args) {
3251 // FIXME: why does this code...and so much everywhere else, use both
3252 // ToolChain.getTriple() and Triple?
3253 bool PIE = ToolChain.isPIEDefault();
3254 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003255 // The Darwin default to use PIC does not apply when using -static.
3256 if (ToolChain.getTriple().isOSDarwin() && Args.hasArg(options::OPT_static))
3257 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003258 bool IsPICLevelTwo = PIC;
3259
3260 bool KernelOrKext =
3261 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3262
3263 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003264 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003265 switch (ToolChain.getArch()) {
3266 case llvm::Triple::arm:
3267 case llvm::Triple::armeb:
3268 case llvm::Triple::thumb:
3269 case llvm::Triple::thumbeb:
3270 case llvm::Triple::aarch64:
3271 case llvm::Triple::mips:
3272 case llvm::Triple::mipsel:
3273 case llvm::Triple::mips64:
3274 case llvm::Triple::mips64el:
3275 PIC = true; // "-fpic"
3276 break;
3277
3278 case llvm::Triple::x86:
3279 case llvm::Triple::x86_64:
3280 PIC = true; // "-fPIC"
3281 IsPICLevelTwo = true;
3282 break;
3283
3284 default:
3285 break;
3286 }
3287 }
3288
3289 // OpenBSD-specific defaults for PIE
3290 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3291 switch (ToolChain.getArch()) {
3292 case llvm::Triple::mips64:
3293 case llvm::Triple::mips64el:
3294 case llvm::Triple::sparcel:
3295 case llvm::Triple::x86:
3296 case llvm::Triple::x86_64:
3297 IsPICLevelTwo = false; // "-fpie"
3298 break;
3299
3300 case llvm::Triple::ppc:
3301 case llvm::Triple::sparc:
3302 case llvm::Triple::sparcv9:
3303 IsPICLevelTwo = true; // "-fPIE"
3304 break;
3305
3306 default:
3307 break;
3308 }
3309 }
3310
3311 // The last argument relating to either PIC or PIE wins, and no
3312 // other argument is used. If the last argument is any flavor of the
3313 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3314 // option implicitly enables PIC at the same level.
3315 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3316 options::OPT_fpic, options::OPT_fno_pic,
3317 options::OPT_fPIE, options::OPT_fno_PIE,
3318 options::OPT_fpie, options::OPT_fno_pie);
3319 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3320 // is forced, then neither PIC nor PIE flags will have no effect.
3321 if (!ToolChain.isPICDefaultForced()) {
3322 if (LastPICArg) {
3323 Option O = LastPICArg->getOption();
3324 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3325 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3326 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3327 PIC =
3328 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3329 IsPICLevelTwo =
3330 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3331 } else {
3332 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003333 if (Triple.isPS4CPU()) {
3334 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3335 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3336 if (Model != "kernel") {
3337 PIC = true;
3338 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3339 << LastPICArg->getSpelling();
3340 }
3341 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003342 }
3343 }
3344 }
3345
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003346 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3347 // PIC level would've been set to level 1, force it back to level 2 PIC
3348 // instead.
3349 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003350 IsPICLevelTwo |= ToolChain.isPICDefault();
3351
James Y Knightc4015d32015-08-21 04:14:55 +00003352 // This kernel flags are a trump-card: they will disable PIC/PIE
3353 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003354 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3355 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003356 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003357
3358 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3359 // This is a very special mode. It trumps the other modes, almost no one
3360 // uses it, and it isn't even valid on any OS but Darwin.
3361 if (!ToolChain.getTriple().isOSDarwin())
3362 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3363 << A->getSpelling() << ToolChain.getTriple().str();
3364
3365 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3366
3367 // Only a forced PIC mode can cause the actual compile to have PIC defines
3368 // etc., no flags are sufficient. This behavior was selected to closely
3369 // match that of llvm-gcc and Apple GCC before that.
3370 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3371
3372 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3373 }
3374
3375 if (PIC)
3376 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3377
3378 return std::make_tuple(llvm::Reloc::Static, 0, false);
3379}
3380
3381static const char *RelocationModelName(llvm::Reloc::Model Model) {
3382 switch (Model) {
3383 case llvm::Reloc::Default:
3384 return nullptr;
3385 case llvm::Reloc::Static:
3386 return "static";
3387 case llvm::Reloc::PIC_:
3388 return "pic";
3389 case llvm::Reloc::DynamicNoPIC:
3390 return "dynamic-no-pic";
3391 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003392 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003393}
3394
3395static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3396 ArgStringList &CmdArgs) {
3397 llvm::Reloc::Model RelocationModel;
3398 unsigned PICLevel;
3399 bool IsPIE;
3400 std::tie(RelocationModel, PICLevel, IsPIE) =
3401 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3402
3403 if (RelocationModel != llvm::Reloc::Static)
3404 CmdArgs.push_back("-KPIC");
3405}
3406
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003407void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003408 const InputInfo &Output, const InputInfoList &Inputs,
3409 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003410 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3411 const llvm::Triple Triple(TripleStr);
3412
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003413 bool KernelOrKext =
3414 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003415 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003416 ArgStringList CmdArgs;
3417
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003418 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003419 bool IsWindowsCygnus =
3420 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003421 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003422 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003423
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003424 // Check number of inputs for sanity. We need at least one input.
3425 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003426 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003427 // CUDA compilation may have multiple inputs (source file + results of
3428 // device-side compilations). All other jobs are expected to have exactly one
3429 // input.
3430 bool IsCuda = types::isCuda(Input.getType());
3431 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003432
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003433 // Invoke ourselves in -cc1 mode.
3434 //
3435 // FIXME: Implement custom jobs for internal actions.
3436 CmdArgs.push_back("-cc1");
3437
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003438 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003439 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003440 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003441
Artem Belevichfa11ab52015-11-17 22:28:46 +00003442 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003443 if (IsCuda) {
3444 // FIXME: We need a (better) way to pass information about
3445 // particular compilation pass we're constructing here. For now we
3446 // can check which toolchain we're using and pick the other one to
3447 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003448 if (&getToolChain() == C.getCudaDeviceToolChain())
3449 AuxToolChain = C.getCudaHostToolChain();
3450 else if (&getToolChain() == C.getCudaHostToolChain())
3451 AuxToolChain = C.getCudaDeviceToolChain();
3452 else
3453 llvm_unreachable("Can't figure out CUDA compilation mode.");
3454 assert(AuxToolChain != nullptr && "No aux toolchain.");
3455 CmdArgs.push_back("-aux-triple");
3456 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003457 CmdArgs.push_back("-fcuda-target-overloads");
3458 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003459 }
3460
James Y Knight2db38f32015-08-15 03:45:25 +00003461 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3462 Triple.getArch() == llvm::Triple::thumb)) {
3463 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003464 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003465 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003466 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003467 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003468 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003469 }
3470
Tim Northover336f1892014-03-29 13:16:12 +00003471 // Push all default warning arguments that are specific to
3472 // the given target. These come before user provided warning options
3473 // are provided.
3474 getToolChain().addClangWarningOptions(CmdArgs);
3475
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003476 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003477 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003478
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003479 if (isa<AnalyzeJobAction>(JA)) {
3480 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3481 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003482 } else if (isa<MigrateJobAction>(JA)) {
3483 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003484 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003485 if (Output.getType() == types::TY_Dependencies)
3486 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003487 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003488 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003489 if (Args.hasArg(options::OPT_rewrite_objc) &&
3490 !Args.hasArg(options::OPT_g_Group))
3491 CmdArgs.push_back("-P");
3492 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003493 } else if (isa<AssembleJobAction>(JA)) {
3494 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003495
David Blaikie9260ed62013-07-25 21:19:01 +00003496 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003497
3498 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003499 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003500 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003501 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003502 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003503
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003504 if (JA.getType() == types::TY_Nothing)
3505 CmdArgs.push_back("-fsyntax-only");
3506 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003507 CmdArgs.push_back("-emit-pch");
3508 else
3509 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003510 } else if (isa<VerifyPCHJobAction>(JA)) {
3511 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003512 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003513 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3514 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003515 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003516 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003517 } else if (JA.getType() == types::TY_LLVM_IR ||
3518 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003519 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003520 } else if (JA.getType() == types::TY_LLVM_BC ||
3521 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003522 CmdArgs.push_back("-emit-llvm-bc");
3523 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003524 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003525 } else if (JA.getType() == types::TY_AST) {
3526 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003527 } else if (JA.getType() == types::TY_ModuleFile) {
3528 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003529 } else if (JA.getType() == types::TY_RewrittenObjC) {
3530 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003531 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003532 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3533 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003534 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003535 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003536 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003537 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003538
3539 // Preserve use-list order by default when emitting bitcode, so that
3540 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3541 // same result as running passes here. For LTO, we don't need to preserve
3542 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003543 if (JA.getType() == types::TY_LLVM_BC)
3544 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003545
3546 if (D.isUsingLTO())
3547 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003548 }
3549
Teresa Johnsonaff22322015-12-07 19:21:34 +00003550 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3551 if (!types::isLLVMIR(Input.getType()))
3552 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3553 << "-x ir";
3554 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3555 }
3556
Justin Bognera88f0122014-06-20 22:59:50 +00003557 // We normally speed up the clang process a bit by skipping destructors at
3558 // exit, but when we're generating diagnostics we can rely on some of the
3559 // cleanup.
3560 if (!C.isForDiagnostics())
3561 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003563// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003564#ifdef NDEBUG
3565 CmdArgs.push_back("-disable-llvm-verifier");
3566#endif
3567
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003568 // Set the main file name, so that debug info works even with
3569 // -save-temps.
3570 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003571 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003572
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003573 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003574 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003575 if (Args.hasArg(options::OPT_static))
3576 CmdArgs.push_back("-static-define");
3577
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003578 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003579 // Enable region store model by default.
3580 CmdArgs.push_back("-analyzer-store=region");
3581
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003582 // Treat blocks as analysis entry points.
3583 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3584
Ted Kremenek49c79792011-03-24 00:28:47 +00003585 CmdArgs.push_back("-analyzer-eagerly-assume");
3586
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003588 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003589 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003590
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003591 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003592 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003593
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003594 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003595 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003596
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003597 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003598
Artem Belevichba558952015-05-06 18:20:23 +00003599 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003600 CmdArgs.push_back("-analyzer-checker=cplusplus");
3601
Nico Webere8e53112014-05-11 01:04:02 +00003602 // Enable the following experimental checkers for testing.
3603 CmdArgs.push_back(
3604 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003605 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3606 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003610
3611 // Default nullability checks.
3612 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3613 CmdArgs.push_back(
3614 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003615 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003616
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003617 // Set the output format. The default is plist, for (lame) historical
3618 // reasons.
3619 CmdArgs.push_back("-analyzer-output");
3620 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003621 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003622 else
3623 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003624
Ted Kremenekfe449a22010-03-22 22:32:05 +00003625 // Disable the presentation of standard compiler warnings when
3626 // using --analyze. We only want to show static analyzer diagnostics
3627 // or frontend errors.
3628 CmdArgs.push_back("-w");
3629
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003630 // Add -Xanalyzer arguments when running as analyzer.
3631 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003632 }
3633
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003634 CheckCodeGenerationOptions(D, Args);
3635
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003636 llvm::Reloc::Model RelocationModel;
3637 unsigned PICLevel;
3638 bool IsPIE;
3639 std::tie(RelocationModel, PICLevel, IsPIE) =
3640 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003641
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003642 const char *RMName = RelocationModelName(RelocationModel);
3643 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003644 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003645 CmdArgs.push_back(RMName);
3646 }
3647 if (PICLevel > 0) {
3648 CmdArgs.push_back("-pic-level");
3649 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3650 if (IsPIE) {
3651 CmdArgs.push_back("-pie-level");
3652 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003653 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003654 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003655
Renato Golin4854d802015-11-09 12:40:41 +00003656 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3657 CmdArgs.push_back("-meabi");
3658 CmdArgs.push_back(A->getValue());
3659 }
3660
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003661 CmdArgs.push_back("-mthread-model");
3662 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3663 CmdArgs.push_back(A->getValue());
3664 else
3665 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3666
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003667 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3668
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003669 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3670 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003671 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003672
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003673 // LLVM Code Generator Options.
3674
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003675 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3676 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003677 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3678 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003679 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003680 CmdArgs.push_back(A->getValue());
3681 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003682 }
3683 }
3684
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003685 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3686 StringRef v = A->getValue();
3687 CmdArgs.push_back("-mllvm");
3688 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3689 A->claim();
3690 }
3691
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003692 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3693 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003694 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003695 }
3696
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003697 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3698 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003699 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003700 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003701 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003702 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3703 CmdArgs.push_back("-fpcc-struct-return");
3704 } else {
3705 assert(A->getOption().matches(options::OPT_freg_struct_return));
3706 CmdArgs.push_back("-freg-struct-return");
3707 }
3708 }
3709
Roman Divacky65b88cd2011-03-01 17:40:53 +00003710 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3711 CmdArgs.push_back("-mrtd");
3712
Rafael Espindola224dd632011-12-14 21:02:23 +00003713 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003714 CmdArgs.push_back("-mdisable-fp-elim");
3715 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3716 options::OPT_fno_zero_initialized_in_bss))
3717 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003718
3719 bool OFastEnabled = isOptimizationLevelFast(Args);
3720 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3721 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003722 OptSpecifier StrictAliasingAliasOption =
3723 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003724 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3725 // doesn't do any TBAA.
3726 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003727 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003728 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003729 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003730 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3731 options::OPT_fno_struct_path_tbaa))
3732 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003733 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3734 false))
3735 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003736 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3737 options::OPT_fno_strict_vtable_pointers,
3738 false))
3739 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003740 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3741 options::OPT_fno_optimize_sibling_calls))
3742 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003743
Eric Christopher006208c2013-04-04 06:29:47 +00003744 // Handle segmented stacks.
3745 if (Args.hasArg(options::OPT_fsplit_stack))
3746 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003747
3748 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3749 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 OptSpecifier FastMathAliasOption =
3751 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3752
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003753 // Handle various floating point optimization flags, mapping them to the
3754 // appropriate LLVM code generation flags. The pattern for all of these is to
3755 // default off the codegen optimizations, and if any flag enables them and no
3756 // flag disables them after the flag enabling them, enable the codegen
3757 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003758 if (Arg *A = Args.getLastArg(
3759 options::OPT_ffast_math, FastMathAliasOption,
3760 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3761 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3762 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003763 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3764 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003765 A->getOption().getID() != options::OPT_fhonor_infinities)
3766 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767 if (Arg *A = Args.getLastArg(
3768 options::OPT_ffast_math, FastMathAliasOption,
3769 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3770 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3771 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003772 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3773 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003774 A->getOption().getID() != options::OPT_fhonor_nans)
3775 CmdArgs.push_back("-menable-no-nans");
3776
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003777 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3778 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003779 if (Arg *A =
3780 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3781 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3782 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003783 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3784 // However, turning *off* -ffast_math merely restores the toolchain default
3785 // (which may be false).
3786 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3787 A->getOption().getID() == options::OPT_ffast_math ||
3788 A->getOption().getID() == options::OPT_Ofast)
3789 MathErrno = false;
3790 else if (A->getOption().getID() == options::OPT_fmath_errno)
3791 MathErrno = true;
3792 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003793 if (MathErrno)
3794 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003795
3796 // There are several flags which require disabling very specific
3797 // optimizations. Any of these being disabled forces us to turn off the
3798 // entire set of LLVM optimizations, so collect them through all the flag
3799 // madness.
3800 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003801 if (Arg *A = Args.getLastArg(
3802 options::OPT_ffast_math, FastMathAliasOption,
3803 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3804 options::OPT_fno_unsafe_math_optimizations,
3805 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003806 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3807 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003808 A->getOption().getID() != options::OPT_fno_associative_math)
3809 AssociativeMath = true;
3810 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003811 if (Arg *A = Args.getLastArg(
3812 options::OPT_ffast_math, FastMathAliasOption,
3813 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3814 options::OPT_fno_unsafe_math_optimizations,
3815 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003816 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3817 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003818 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3819 ReciprocalMath = true;
3820 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003821 if (Arg *A = Args.getLastArg(
3822 options::OPT_ffast_math, FastMathAliasOption,
3823 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3824 options::OPT_fno_unsafe_math_optimizations,
3825 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003826 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3827 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003828 A->getOption().getID() != options::OPT_fsigned_zeros)
3829 SignedZeros = false;
3830 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831 if (Arg *A = Args.getLastArg(
3832 options::OPT_ffast_math, FastMathAliasOption,
3833 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3834 options::OPT_fno_unsafe_math_optimizations,
3835 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003836 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3837 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003838 A->getOption().getID() != options::OPT_ftrapping_math)
3839 TrappingMath = false;
3840 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3841 !TrappingMath)
3842 CmdArgs.push_back("-menable-unsafe-fp-math");
3843
Sanjay Patel76c9e092015-01-23 16:40:50 +00003844 if (!SignedZeros)
3845 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003846
Sanjay Patel359b1052015-04-09 15:03:23 +00003847 if (ReciprocalMath)
3848 CmdArgs.push_back("-freciprocal-math");
3849
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003850 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003851 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003852 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003853 options::OPT_ffp_contract)) {
3854 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003855 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003856 if (Val == "fast" || Val == "on" || Val == "off") {
3857 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3858 } else {
3859 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003860 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003861 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003862 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3863 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003864 // If fast-math is set then set the fp-contract mode to fast.
3865 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3866 }
3867 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868
Sanjay Patel2987c292015-06-11 14:53:41 +00003869 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003870
Bob Wilson6a039162012-07-19 03:52:53 +00003871 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3872 // and if we find them, tell the frontend to provide the appropriate
3873 // preprocessor macros. This is distinct from enabling any optimizations as
3874 // these options induce language changes which must survive serialization
3875 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003876 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3877 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003878 if (!A->getOption().matches(options::OPT_fno_fast_math))
3879 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003880 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3881 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003882 if (A->getOption().matches(options::OPT_ffinite_math_only))
3883 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003884
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003885 // Decide whether to use verbose asm. Verbose assembly is the default on
3886 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003887 bool IsIntegratedAssemblerDefault =
3888 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003889 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003890 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003891 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003892 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003893
Rafael Espindolab8a12932015-05-22 20:44:03 +00003894 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3895 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003896 CmdArgs.push_back("-no-integrated-as");
3897
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003898 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3899 CmdArgs.push_back("-mdebug-pass");
3900 CmdArgs.push_back("Structure");
3901 }
3902 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3903 CmdArgs.push_back("-mdebug-pass");
3904 CmdArgs.push_back("Arguments");
3905 }
3906
John McCall8517abc2010-02-19 02:45:38 +00003907 // Enable -mconstructor-aliases except on darwin, where we have to
3908 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003909 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003910 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003911
John McCall7ef5cb32011-03-18 02:56:14 +00003912 // Darwin's kernel doesn't support guard variables; just die if we
3913 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003914 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003915 CmdArgs.push_back("-fforbid-guard-variables");
3916
Akira Hatanaka02028482015-11-12 17:21:22 +00003917 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3918 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003919 CmdArgs.push_back("-mms-bitfields");
3920 }
John McCall8517abc2010-02-19 02:45:38 +00003921
Daniel Dunbar306945d2009-09-16 06:17:29 +00003922 // This is a coarse approximation of what llvm-gcc actually does, both
3923 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3924 // complicated ways.
3925 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003926 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3927 options::OPT_fno_asynchronous_unwind_tables,
3928 (getToolChain().IsUnwindTablesDefault() ||
3929 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3930 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003931 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3932 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003933 CmdArgs.push_back("-munwind-tables");
3934
Chandler Carruth05fb5852012-11-21 23:40:23 +00003935 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003936
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003937 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3938 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003939 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003940 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003941
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003942 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003943 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003944
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003945 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003946 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003947 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003948 }
3949
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003950 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003951 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003952 if (!CPU.empty()) {
3953 CmdArgs.push_back("-target-cpu");
3954 CmdArgs.push_back(Args.MakeArgString(CPU));
3955 }
3956
Rafael Espindolaeb265472013-08-21 21:59:03 +00003957 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3958 CmdArgs.push_back("-mfpmath");
3959 CmdArgs.push_back(A->getValue());
3960 }
3961
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003962 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003963 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003964
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003965 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003967 default:
3968 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003969
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003970 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003971 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003972 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003973 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003974 // Use the effective triple, which takes into account the deployment target.
3975 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003976 break;
3977
Tim Northover573cbee2014-05-24 12:52:07 +00003978 case llvm::Triple::aarch64:
3979 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003980 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003981 break;
3982
Eric Christopher0b26a612010-03-02 02:41:08 +00003983 case llvm::Triple::mips:
3984 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003985 case llvm::Triple::mips64:
3986 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003987 AddMIPSTargetArgs(Args, CmdArgs);
3988 break;
3989
Ulrich Weigand8afad612014-07-28 13:17:52 +00003990 case llvm::Triple::ppc:
3991 case llvm::Triple::ppc64:
3992 case llvm::Triple::ppc64le:
3993 AddPPCTargetArgs(Args, CmdArgs);
3994 break;
3995
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003996 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003997 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003998 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003999 AddSparcTargetArgs(Args, CmdArgs);
4000 break;
4001
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004002 case llvm::Triple::x86:
4003 case llvm::Triple::x86_64:
4004 AddX86TargetArgs(Args, CmdArgs);
4005 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004006
4007 case llvm::Triple::hexagon:
4008 AddHexagonTargetArgs(Args, CmdArgs);
4009 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004010 }
4011
Douglas Katzman3459ce22015-10-08 04:24:12 +00004012 // The 'g' groups options involve a somewhat intricate sequence of decisions
4013 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004014 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004015 // * what level of debug info to generate
4016 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004017 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004018 // This avoids having to monkey around further in cc1 other than to disable
4019 // codeview if not running in a Windows environment. Perhaps even that
4020 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004021 unsigned DwarfVersion = 0;
4022 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4023 // These two are potentially updated by AddClangCLArgs.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004024 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
4025 CodeGenOptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004026 bool EmitCodeView = false;
4027
Hans Wennborg75958c42013-08-08 00:17:41 +00004028 // Add clang-cl arguments.
4029 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004030 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004031
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004032 // Pass the linker version in use.
4033 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4034 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004035 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004036 }
4037
Eric Christopherb7d97e92013-04-03 01:58:53 +00004038 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004039 CmdArgs.push_back("-momit-leaf-frame-pointer");
4040
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004041 // Explicitly error on some things we know we don't support and can't just
4042 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004043 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004044 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4045 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004046 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004047 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004048 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4049 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004050 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004051 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004052 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004053 }
4054
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004055 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004056 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004057 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004058 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004059 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4060 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004061 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004062 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004063 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004064
Chad Rosierbe10f982011-08-02 17:58:04 +00004065 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004066 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004067 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4068 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004069 }
4070
Rafael Espindola08a692a2010-03-07 04:46:18 +00004071 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004072 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004073 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004074 // If the last option explicitly specified a debug-info level, use it.
4075 if (A->getOption().matches(options::OPT_gN_Group)) {
4076 DebugInfoKind = DebugLevelToInfoKind(*A);
4077 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4078 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4079 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
4080 if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo &&
4081 A->getIndex() > SplitDwarfArg->getIndex())
4082 SplitDwarfArg = nullptr;
4083 } else
4084 // For any other 'g' option, use Limited.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004085 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004086 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004087
Paul Robinson0334a042015-12-19 19:41:48 +00004088 // If a debugger tuning argument appeared, remember it.
4089 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4090 options::OPT_ggdbN_Group)) {
4091 if (A->getOption().matches(options::OPT_glldb))
4092 DebuggerTuning = llvm::DebuggerKind::LLDB;
4093 else if (A->getOption().matches(options::OPT_gsce))
4094 DebuggerTuning = llvm::DebuggerKind::SCE;
4095 else
4096 DebuggerTuning = llvm::DebuggerKind::GDB;
4097 }
4098
4099 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004100 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
4101 options::OPT_gdwarf_4))
4102 DwarfVersion = DwarfVersionNum(A->getSpelling());
4103
Reid Kleckner124955a2015-08-05 18:51:13 +00004104 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004105 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4106 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4107 // DwarfVersion remains at 0 if no explicit choice was made.
4108 CmdArgs.push_back("-gcodeview");
4109 } else if (DwarfVersion == 0 &&
4110 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
4111 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4112 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004113
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004114 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4115 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004116
4117 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004118 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004119 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004120 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004121
Eric Christopher138c32b2013-09-13 22:37:55 +00004122 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004123 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004124 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004125 CmdArgs.push_back("-dwarf-ext-refs");
4126 CmdArgs.push_back("-fmodule-format=obj");
4127 }
4128
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004129 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4130 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004131 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004132 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004133 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004134 CmdArgs.push_back("-backend-option");
4135 CmdArgs.push_back("-split-dwarf=Enable");
4136 }
4137
Douglas Katzman3459ce22015-10-08 04:24:12 +00004138 // After we've dealt with all combinations of things that could
4139 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4140 // figure out if we need to "upgrade" it to standalone debug info.
4141 // We parse these two '-f' options whether or not they will be used,
4142 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4143 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4144 options::OPT_fno_standalone_debug,
4145 getToolChain().GetDefaultStandaloneDebug());
4146 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4147 DebugInfoKind = CodeGenOptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004148 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4149 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004150
Eric Christopher138c32b2013-09-13 22:37:55 +00004151 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4152 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4153 CmdArgs.push_back("-backend-option");
4154 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4155 }
Eric Christophereec89c22013-06-18 00:03:50 +00004156
Eric Christopher0d403d22014-02-14 01:27:03 +00004157 // -gdwarf-aranges turns on the emission of the aranges section in the
4158 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004159 // Always enabled on the PS4.
4160 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004161 CmdArgs.push_back("-backend-option");
4162 CmdArgs.push_back("-generate-arange-section");
4163 }
4164
David Blaikief36d9ba2014-01-27 18:52:43 +00004165 if (Args.hasFlag(options::OPT_fdebug_types_section,
4166 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004167 CmdArgs.push_back("-backend-option");
4168 CmdArgs.push_back("-generate-type-units");
4169 }
Eric Christophereec89c22013-06-18 00:03:50 +00004170
Ed Schouten6e576152015-03-26 17:50:28 +00004171 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4172 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4173
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004174 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004175 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004176 CmdArgs.push_back("-ffunction-sections");
4177 }
4178
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004179 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4180 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004181 CmdArgs.push_back("-fdata-sections");
4182 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004183
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004184 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004185 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004186 CmdArgs.push_back("-fno-unique-section-names");
4187
Chris Lattner3c77a352010-06-22 00:03:40 +00004188 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4189
Diego Novilloa0545962015-07-10 18:00:07 +00004190 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004191
Paul Robinsond083b9a2015-12-16 17:25:27 +00004192 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4193 if (getToolChain().getTriple().isPS4CPU())
4194 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4195
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004196 // Pass options for controlling the default header search paths.
4197 if (Args.hasArg(options::OPT_nostdinc)) {
4198 CmdArgs.push_back("-nostdsysteminc");
4199 CmdArgs.push_back("-nobuiltininc");
4200 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004201 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004202 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004203 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4204 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4205 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004206
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004207 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004208 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004209 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004210
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004211 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4212
Ted Kremenekf7639e12012-03-06 20:06:33 +00004213 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004214 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004215 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004216 options::OPT_ccc_arcmt_modify,
4217 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004218 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004219 switch (A->getOption().getID()) {
4220 default:
4221 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004222 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004223 CmdArgs.push_back("-arcmt-check");
4224 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004225 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004226 CmdArgs.push_back("-arcmt-modify");
4227 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004228 case options::OPT_ccc_arcmt_migrate:
4229 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004230 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004231 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004232
4233 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4234 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004235 break;
John McCalld70fb982011-06-15 23:25:17 +00004236 }
4237 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004238 } else {
4239 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4240 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4241 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004242 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004243
Ted Kremenekf7639e12012-03-06 20:06:33 +00004244 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4245 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004246 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4247 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004248 }
4249 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004250 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004251
4252 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004253 options::OPT_objcmt_migrate_subscripting,
4254 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004255 // None specified, means enable them all.
4256 CmdArgs.push_back("-objcmt-migrate-literals");
4257 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004258 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004259 } else {
4260 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4261 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004262 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004263 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004264 } else {
4265 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4266 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4267 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4268 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4269 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4270 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004271 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004272 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4273 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4274 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4275 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4276 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4277 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4278 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004279 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004280 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004281 }
4282
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004283 // Add preprocessing options like -I, -D, etc. if we are using the
4284 // preprocessor.
4285 //
4286 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004287 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004288 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4289 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004290
Rafael Espindolaa7431922011-07-21 23:40:37 +00004291 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4292 // that "The compiler can only warn and ignore the option if not recognized".
4293 // When building with ccache, it will pass -D options to clang even on
4294 // preprocessed inputs and configure concludes that -fPIC is not supported.
4295 Args.ClaimAllArgs(options::OPT_D);
4296
Alp Toker7874bdc2013-11-15 20:40:58 +00004297 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004298 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4299 if (A->getOption().matches(options::OPT_O4)) {
4300 CmdArgs.push_back("-O3");
4301 D.Diag(diag::warn_O4_is_O3);
4302 } else {
4303 A->render(Args, CmdArgs);
4304 }
4305 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004306
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004307 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004308 for (const Arg *A :
4309 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4310 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004311 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004312 }
4313
Rafael Espindola577637a2015-01-03 00:06:04 +00004314 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004315
Richard Smith3be1cb22014-08-07 00:24:21 +00004316 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004317 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004318 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4319 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004320 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004321 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004322
4323 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004324 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004325 //
4326 // If a std is supplied, only add -trigraphs if it follows the
4327 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004328 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004329 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4330 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004331 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004332 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004333 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004334 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004335 else
4336 Std->render(Args, CmdArgs);
4337
Nico Weber00721502014-12-23 22:32:37 +00004338 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004339 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004340 options::OPT_ftrigraphs,
4341 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004342 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004343 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004344 } else {
4345 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004346 //
4347 // FIXME: Clang doesn't correctly handle -std= when the input language
4348 // doesn't match. For the time being just ignore this for C++ inputs;
4349 // eventually we want to do all the standard defaulting here instead of
4350 // splitting it between the driver and clang -cc1.
4351 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004352 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4353 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004354 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004355 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004356
Nico Weber00721502014-12-23 22:32:37 +00004357 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4358 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004359 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004360
Richard Smith282b4492013-09-04 22:50:31 +00004361 // GCC's behavior for -Wwrite-strings is a bit strange:
4362 // * In C, this "warning flag" changes the types of string literals from
4363 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4364 // for the discarded qualifier.
4365 // * In C++, this is just a normal warning flag.
4366 //
4367 // Implementing this warning correctly in C is hard, so we follow GCC's
4368 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4369 // a non-const char* in C, rather than using this crude hack.
4370 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004371 // FIXME: This should behave just like a warning flag, and thus should also
4372 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4373 Arg *WriteStrings =
4374 Args.getLastArg(options::OPT_Wwrite_strings,
4375 options::OPT_Wno_write_strings, options::OPT_w);
4376 if (WriteStrings &&
4377 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004378 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004379 }
4380
Chandler Carruth61fbf622011-04-23 09:27:53 +00004381 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004382 // during C++ compilation, which it is by default. GCC keeps this define even
4383 // in the presence of '-w', match this behavior bug-for-bug.
4384 if (types::isCXX(InputType) &&
4385 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4386 true)) {
4387 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004388 }
4389
Chandler Carruthe0391482010-05-22 02:21:53 +00004390 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4391 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4392 if (Asm->getOption().matches(options::OPT_fasm))
4393 CmdArgs.push_back("-fgnu-keywords");
4394 else
4395 CmdArgs.push_back("-fno-gnu-keywords");
4396 }
4397
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004398 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4399 CmdArgs.push_back("-fno-dwarf-directory-asm");
4400
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004401 if (ShouldDisableAutolink(Args, getToolChain()))
4402 CmdArgs.push_back("-fno-autolink");
4403
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004404 // Add in -fdebug-compilation-dir if necessary.
4405 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004406
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004407 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4408 StringRef Map = A->getValue();
4409 if (Map.find('=') == StringRef::npos)
4410 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4411 else
4412 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4413 A->claim();
4414 }
4415
Richard Smith9a568822011-11-21 19:36:32 +00004416 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4417 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004418 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004419 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004420 }
4421
Richard Smith79c927b2013-11-06 19:31:51 +00004422 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4423 CmdArgs.push_back("-foperator-arrow-depth");
4424 CmdArgs.push_back(A->getValue());
4425 }
4426
Richard Smith9a568822011-11-21 19:36:32 +00004427 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4428 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004429 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004430 }
4431
Richard Smitha3d3bd22013-05-08 02:12:03 +00004432 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4433 CmdArgs.push_back("-fconstexpr-steps");
4434 CmdArgs.push_back(A->getValue());
4435 }
4436
Richard Smithb3a14522013-02-22 01:59:51 +00004437 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4438 CmdArgs.push_back("-fbracket-depth");
4439 CmdArgs.push_back(A->getValue());
4440 }
4441
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004442 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4443 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004444 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004445 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004446 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4447 } else
4448 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004449 }
4450
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004451 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004452 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004453
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004454 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4455 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004456 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004457 }
David Chisnall5778fce2009-08-31 16:41:57 +00004458
Chris Lattnere23003d2010-01-09 21:54:33 +00004459 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4460 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004461 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004462 }
4463
Chris Lattnerb35583d2010-04-07 20:49:23 +00004464 CmdArgs.push_back("-ferror-limit");
4465 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004466 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004467 else
4468 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004469
Chandler Carrutha77a7272010-05-06 04:55:18 +00004470 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4471 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004472 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004473 }
4474
4475 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4476 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004477 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004478 }
4479
Richard Smithf6f003a2011-12-16 19:06:07 +00004480 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4481 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004482 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004483 }
4484
Nick Lewycky24653262014-12-16 21:39:02 +00004485 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4486 CmdArgs.push_back("-fspell-checking-limit");
4487 CmdArgs.push_back(A->getValue());
4488 }
4489
Daniel Dunbar2c978472009-11-04 06:24:47 +00004490 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004491 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004492 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004493 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004494 } else {
4495 // If -fmessage-length=N was not specified, determine whether this is a
4496 // terminal and, if so, implicitly define -fmessage-length appropriately.
4497 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004498 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004499 }
4500
John McCallb4a99d32013-02-19 01:57:35 +00004501 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4502 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4503 options::OPT_fvisibility_ms_compat)) {
4504 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4505 CmdArgs.push_back("-fvisibility");
4506 CmdArgs.push_back(A->getValue());
4507 } else {
4508 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4509 CmdArgs.push_back("-fvisibility");
4510 CmdArgs.push_back("hidden");
4511 CmdArgs.push_back("-ftype-visibility");
4512 CmdArgs.push_back("default");
4513 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004514 }
4515
Douglas Gregor08329632010-06-15 17:05:35 +00004516 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004517
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004518 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4519
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004520 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004521 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4522 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004523 CmdArgs.push_back("-ffreestanding");
4524
Daniel Dunbare357d562009-12-03 18:42:11 +00004525 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004526 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004527 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004528 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004529 // Emulated TLS is enabled by default on Android, and can be enabled manually
4530 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004531 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004532 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4533 EmulatedTLSDefault))
4534 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004535 // AltiVec-like language extensions aren't relevant for assembling.
4536 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004537 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004538 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4539 }
Richard Trieu91844232012-06-26 18:18:47 +00004540 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4541 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004542
Alexey Bataevdb390212015-05-20 04:24:19 +00004543 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004544 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4545 options::OPT_fno_openmp, false))
4546 switch (getOpenMPRuntime(getToolChain(), Args)) {
4547 case OMPRT_OMP:
4548 case OMPRT_IOMP5:
4549 // Clang can generate useful OpenMP code for these two runtime libraries.
4550 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004551
4552 // If no option regarding the use of TLS in OpenMP codegeneration is
4553 // given, decide a default based on the target. Otherwise rely on the
4554 // options and pass the right information to the frontend.
4555 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004556 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004557 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004558 break;
4559 default:
4560 // By default, if Clang doesn't know how to generate useful OpenMP code
4561 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4562 // down to the actual compilation.
4563 // FIXME: It would be better to have a mode which *only* omits IR
4564 // generation based on the OpenMP support so that we get consistent
4565 // semantic analysis, etc.
4566 break;
4567 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004568
Peter Collingbourne32701642013-11-01 18:16:25 +00004569 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004570 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004571
Eric Christopher459d2712013-02-19 06:16:53 +00004572 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004573 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4574 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4575 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4576 Arch == llvm::Triple::ppc64le))
4577 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4578 << "ppc/ppc64/ppc64le";
4579 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004580
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004581 // -fzvector is incompatible with -faltivec.
4582 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4583 if (Args.hasArg(options::OPT_faltivec))
4584 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4585 << "-faltivec";
4586
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004587 if (getToolChain().SupportsProfiling())
4588 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004589
4590 // -flax-vector-conversions is default.
4591 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4592 options::OPT_fno_lax_vector_conversions))
4593 CmdArgs.push_back("-fno-lax-vector-conversions");
4594
John Brawna7b4ec02015-08-10 11:11:28 +00004595 if (Args.getLastArg(options::OPT_fapple_kext) ||
4596 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004597 CmdArgs.push_back("-fapple-kext");
4598
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004599 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004600 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004601 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004602 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4603 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004604
4605 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4606 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004607 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004608 }
4609
Bob Wilson14adb362012-02-03 06:27:22 +00004610 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004611
Chandler Carruth6e501032011-03-27 00:04:55 +00004612 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4613 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004614 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004615 if (A->getOption().matches(options::OPT_fwrapv))
4616 CmdArgs.push_back("-fwrapv");
4617 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4618 options::OPT_fno_strict_overflow)) {
4619 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4620 CmdArgs.push_back("-fwrapv");
4621 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004622
4623 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4624 options::OPT_fno_reroll_loops))
4625 if (A->getOption().matches(options::OPT_freroll_loops))
4626 CmdArgs.push_back("-freroll-loops");
4627
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004628 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004629 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4630 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004631
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004632 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4633
Daniel Dunbar4930e332009-11-17 08:07:36 +00004634 // -stack-protector=0 is default.
4635 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004636 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4637 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4638 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4639 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4640 Args.ClaimAllArgs(options::OPT_fstack_protector);
4641 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004642 options::OPT_fstack_protector_all,
4643 options::OPT_fstack_protector_strong,
4644 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004645 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004646 StackProtectorLevel = std::max<unsigned>(
4647 LangOptions::SSPOn,
4648 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004649 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004650 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004651 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004652 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004653 } else {
4654 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004655 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004656 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004657 if (StackProtectorLevel) {
4658 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004659 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004660 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004661
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004662 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004663 for (const Arg *A : Args.filtered(options::OPT__param)) {
4664 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004665 if (Str.startswith("ssp-buffer-size=")) {
4666 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004667 CmdArgs.push_back("-stack-protector-buffer-size");
4668 // FIXME: Verify the argument is a valid integer.
4669 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004670 }
Sean Silva14facf32015-06-09 01:57:17 +00004671 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004672 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004673 }
4674
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004675 // Translate -mstackrealign
4676 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004677 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004678 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004679
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004680 if (Args.hasArg(options::OPT_mstack_alignment)) {
4681 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4682 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004683 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004684
Hans Wennborg77dc2362015-01-20 19:45:50 +00004685 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4686 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4687
4688 if (!Size.empty())
4689 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4690 else
4691 CmdArgs.push_back("-mstack-probe-size=0");
4692 }
4693
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004694 switch (getToolChain().getArch()) {
4695 case llvm::Triple::aarch64:
4696 case llvm::Triple::aarch64_be:
4697 case llvm::Triple::arm:
4698 case llvm::Triple::armeb:
4699 case llvm::Triple::thumb:
4700 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004701 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004702 break;
4703
4704 default:
4705 break;
4706 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004707
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004708 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4709 options::OPT_mno_restrict_it)) {
4710 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4711 CmdArgs.push_back("-backend-option");
4712 CmdArgs.push_back("-arm-restrict-it");
4713 } else {
4714 CmdArgs.push_back("-backend-option");
4715 CmdArgs.push_back("-arm-no-restrict-it");
4716 }
James Y Knight2db38f32015-08-15 03:45:25 +00004717 } else if (Triple.isOSWindows() &&
4718 (Triple.getArch() == llvm::Triple::arm ||
4719 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004720 // Windows on ARM expects restricted IT blocks
4721 CmdArgs.push_back("-backend-option");
4722 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004723 }
4724
Daniel Dunbard18049a2009-04-07 21:16:11 +00004725 // Forward -f options with positive and negative forms; we translate
4726 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004727 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4728 StringRef fname = A->getValue();
4729 if (!llvm::sys::fs::exists(fname))
4730 D.Diag(diag::err_drv_no_such_file) << fname;
4731 else
4732 A->render(Args, CmdArgs);
4733 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004734
John Brawna7b4ec02015-08-10 11:11:28 +00004735 // -fbuiltin is default unless -mkernel is used
4736 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4737 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004738 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004739
Nuno Lopes13c88c72009-12-16 16:59:22 +00004740 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4741 options::OPT_fno_assume_sane_operator_new))
4742 CmdArgs.push_back("-fno-assume-sane-operator-new");
4743
Daniel Dunbar4930e332009-11-17 08:07:36 +00004744 // -fblocks=0 is default.
4745 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004746 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004747 (Args.hasArg(options::OPT_fgnu_runtime) &&
4748 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4749 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004750 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004752 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004753 !getToolChain().hasBlocksRuntime())
4754 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004755 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004756
Richard Smith47972af2015-06-16 00:08:24 +00004757 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004758 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004759 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004760 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004761 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004762 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4763 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004764 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004765 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004766 HaveModules = true;
4767 }
4768 }
4769
Richard Smith47972af2015-06-16 00:08:24 +00004770 // -fmodule-maps enables implicit reading of module map files. By default,
4771 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004772 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4773 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004774 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004775 }
4776
Daniel Jasperac42b752013-10-21 06:34:34 +00004777 // -fmodules-decluse checks that modules used are declared so (off by
4778 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004779 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004780 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004781 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004782 }
4783
Daniel Jasper962b38e2014-04-11 11:47:45 +00004784 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4785 // all #included headers are part of modules.
4786 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004787 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004788 CmdArgs.push_back("-fmodules-strict-decluse");
4789 }
4790
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004791 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4792 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4793 options::OPT_fno_implicit_modules)) {
4794 CmdArgs.push_back("-fno-implicit-modules");
4795 }
4796
Daniel Jasperac42b752013-10-21 06:34:34 +00004797 // -fmodule-name specifies the module that is currently being built (or
4798 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004799 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004800
Richard Smith9887d792014-10-17 01:42:53 +00004801 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004802 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004803 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004804
Richard Smithe842a472014-10-22 02:05:46 +00004805 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004806 if (HaveModules)
4807 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4808 else
4809 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004810
4811 // -fmodule-cache-path specifies where our implicitly-built module files
4812 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004813 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004814 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004815 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004816 if (HaveModules) {
4817 if (C.isForDiagnostics()) {
4818 // When generating crash reports, we want to emit the modules along with
4819 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004820 Path = Output.getFilename();
4821 llvm::sys::path::replace_extension(Path, ".cache");
4822 llvm::sys::path::append(Path, "modules");
4823 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004824 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004825 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004826 llvm::sys::path::append(Path, "org.llvm.clang.");
4827 appendUserToPath(Path);
4828 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004829 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004830 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004831 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4832 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004833 }
4834
4835 // When building modules and generating crashdumps, we need to dump a module
4836 // dependency VFS alongside the output.
4837 if (HaveModules && C.isForDiagnostics()) {
4838 SmallString<128> VFSDir(Output.getFilename());
4839 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004840 // Add the cache directory as a temp so the crash diagnostics pick it up.
4841 C.addTempFile(Args.MakeArgString(VFSDir));
4842
Justin Bognera88f0122014-06-20 22:59:50 +00004843 llvm::sys::path::append(VFSDir, "vfs");
4844 CmdArgs.push_back("-module-dependency-dir");
4845 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004846 }
4847
Richard Smith9887d792014-10-17 01:42:53 +00004848 if (HaveModules)
4849 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004850
Douglas Gregor35b04d62013-02-07 19:01:24 +00004851 // Pass through all -fmodules-ignore-macro arguments.
4852 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004853 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4854 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004855
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004856 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4857
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004858 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4859 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4860 D.Diag(diag::err_drv_argument_not_allowed_with)
4861 << A->getAsString(Args) << "-fbuild-session-timestamp";
4862
4863 llvm::sys::fs::file_status Status;
4864 if (llvm::sys::fs::status(A->getValue(), Status))
4865 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004866 CmdArgs.push_back(Args.MakeArgString(
4867 "-fbuild-session-timestamp=" +
4868 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004869 }
4870
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004871 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004872 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4873 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004874 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4875
4876 Args.AddLastArg(CmdArgs,
4877 options::OPT_fmodules_validate_once_per_build_session);
4878 }
4879
Ben Langmuirdcf73862014-03-12 00:06:17 +00004880 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4881
John McCalldfea9982010-04-09 19:12:06 +00004882 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004883 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004885 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004886
Anders Carlssond470fef2010-11-21 00:09:52 +00004887 // -felide-constructors is the default.
4888 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004889 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004890 CmdArgs.push_back("-fno-elide-constructors");
4891
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004892 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004893
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004894 if (KernelOrKext || (types::isCXX(InputType) &&
4895 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4896 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004897 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004898
Tony Linthicum76329bf2011-12-12 21:14:55 +00004899 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004900 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4901 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004902 CmdArgs.push_back("-fshort-enums");
4903
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004904 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004905 if (Arg *A = Args.getLastArg(
4906 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4907 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4908 if (A->getOption().matches(options::OPT_funsigned_char) ||
4909 A->getOption().matches(options::OPT_fno_signed_char)) {
4910 CmdArgs.push_back("-fno-signed-char");
4911 }
4912 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004913 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004914 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004915
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004916 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004917 if (!Args.hasFlag(
4918 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4919 !IsWindowsCygnus && !IsWindowsGNU &&
4920 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4921 getToolChain().getArch() != llvm::Triple::hexagon &&
4922 getToolChain().getArch() != llvm::Triple::xcore &&
4923 ((getToolChain().getTriple().getVendor() !=
4924 llvm::Triple::MipsTechnologies) ||
4925 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004926 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004927 CmdArgs.push_back("-fno-use-cxa-atexit");
4928
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004929 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004930 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004931 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004932 CmdArgs.push_back("-fms-extensions");
4933
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004934 // -fno-use-line-directives is default.
4935 if (Args.hasFlag(options::OPT_fuse_line_directives,
4936 options::OPT_fno_use_line_directives, false))
4937 CmdArgs.push_back("-fuse-line-directives");
4938
Francois Pichet1b4f1632011-09-17 04:32:15 +00004939 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004940 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004941 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004942 (IsWindowsMSVC &&
4943 Args.hasFlag(options::OPT_fms_extensions,
4944 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004945 CmdArgs.push_back("-fms-compatibility");
4946
David Majnemerc371ff02015-03-22 08:39:22 +00004947 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004948 VersionTuple MSVT = visualstudio::getMSVCVersion(
4949 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4950 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004951 CmdArgs.push_back(
4952 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004953
David Majnemer8db91762015-05-18 04:49:30 +00004954 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4955 if (ImplyVCPPCXXVer) {
4956 if (IsMSVC2015Compatible)
4957 CmdArgs.push_back("-std=c++14");
4958 else
4959 CmdArgs.push_back("-std=c++11");
4960 }
4961
Eric Christopher5ecce122013-02-18 00:38:31 +00004962 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004963 if (Args.hasFlag(options::OPT_fborland_extensions,
4964 options::OPT_fno_borland_extensions, false))
4965 CmdArgs.push_back("-fborland-extensions");
4966
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004967 // -fno-declspec is default, except for PS4.
4968 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4969 getToolChain().getTriple().isPS4()))
4970 CmdArgs.push_back("-fdeclspec");
4971 else if (Args.hasArg(options::OPT_fno_declspec))
4972 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4973
David Majnemerc371ff02015-03-22 08:39:22 +00004974 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4975 // than 19.
4976 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4977 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004978 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004979 CmdArgs.push_back("-fno-threadsafe-statics");
4980
Francois Pichet02744872011-09-01 16:38:08 +00004981 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4982 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004983 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004984 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004985 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004986
Chandler Carruthe03aa552010-04-17 20:17:31 +00004987 // -fgnu-keywords default varies depending on language; only pass if
4988 // specified.
4989 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004990 options::OPT_fno_gnu_keywords))
4991 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004993 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004994 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004995 CmdArgs.push_back("-fgnu89-inline");
4996
Chad Rosier9c76d242012-03-15 22:31:42 +00004997 if (Args.hasArg(options::OPT_fno_inline))
4998 CmdArgs.push_back("-fno-inline");
4999
Chad Rosier64d6be92012-03-06 21:17:19 +00005000 if (Args.hasArg(options::OPT_fno_inline_functions))
5001 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005002
John McCall5fb5df92012-06-20 06:18:46 +00005003 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005004
John McCall5fb5df92012-06-20 06:18:46 +00005005 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005006 // legacy is the default. Except for deployment taget of 10.5,
5007 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5008 // gets ignored silently.
5009 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005010 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5011 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005012 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005013 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005014 if (getToolChain().UseObjCMixedDispatch())
5015 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5016 else
5017 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5018 }
5019 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005020
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005021 // When ObjectiveC legacy runtime is in effect on MacOSX,
5022 // turn on the option to do Array/Dictionary subscripting
5023 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005024 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005025 getToolChain().getTriple().isMacOSX() &&
5026 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5027 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005028 objcRuntime.isNeXTFamily())
5029 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005030
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005031 // -fencode-extended-block-signature=1 is default.
5032 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5033 CmdArgs.push_back("-fencode-extended-block-signature");
5034 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005035
John McCall24fc0de2011-07-06 00:26:06 +00005036 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5037 // NOTE: This logic is duplicated in ToolChains.cpp.
5038 bool ARC = isObjCAutoRefCount(Args);
5039 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005040 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005041
John McCall24fc0de2011-07-06 00:26:06 +00005042 CmdArgs.push_back("-fobjc-arc");
5043
Chandler Carruth491db322011-11-04 07:34:47 +00005044 // FIXME: It seems like this entire block, and several around it should be
5045 // wrapped in isObjC, but for now we just use it here as this is where it
5046 // was being used previously.
5047 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5048 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5049 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5050 else
5051 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5052 }
5053
John McCall24fc0de2011-07-06 00:26:06 +00005054 // Allow the user to enable full exceptions code emission.
5055 // We define off for Objective-CC, on for Objective-C++.
5056 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5057 options::OPT_fno_objc_arc_exceptions,
5058 /*default*/ types::isCXX(InputType)))
5059 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005060
John McCall24fc0de2011-07-06 00:26:06 +00005061 }
5062
5063 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5064 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005065 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005066 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005067
John McCall24fc0de2011-07-06 00:26:06 +00005068 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5069 // takes precedence.
5070 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5071 if (!GCArg)
5072 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5073 if (GCArg) {
5074 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005075 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005076 } else if (getToolChain().SupportsObjCGC()) {
5077 GCArg->render(Args, CmdArgs);
5078 } else {
5079 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005080 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005081 }
5082 }
5083
John McCallfbe5ed72015-11-05 19:19:56 +00005084 // Pass down -fobjc-weak or -fno-objc-weak if present.
5085 if (types::isObjC(InputType)) {
5086 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5087 options::OPT_fno_objc_weak);
5088 if (!WeakArg) {
5089 // nothing to do
5090 } else if (GCArg) {
5091 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5092 D.Diag(diag::err_objc_weak_with_gc);
5093 } else if (!objcRuntime.allowsWeak()) {
5094 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5095 D.Diag(diag::err_objc_weak_unsupported);
5096 } else {
5097 WeakArg->render(Args, CmdArgs);
5098 }
5099 }
5100
Bob Wilsonb111ec92015-03-02 19:01:14 +00005101 if (Args.hasFlag(options::OPT_fapplication_extension,
5102 options::OPT_fno_application_extension, false))
5103 CmdArgs.push_back("-fapplication-extension");
5104
Reid Klecknerc542d372014-06-27 17:02:02 +00005105 // Handle GCC-style exception args.
5106 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005107 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5108 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005109
Tim Northovere931f9f2015-10-30 16:30:41 +00005110 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005111 CmdArgs.push_back("-fsjlj-exceptions");
5112
5113 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005114 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5115 options::OPT_fno_assume_sane_operator_new))
5116 CmdArgs.push_back("-fno-assume-sane-operator-new");
5117
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005118 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5119 // most platforms.
5120 if (Args.hasFlag(options::OPT_fsized_deallocation,
5121 options::OPT_fno_sized_deallocation, false))
5122 CmdArgs.push_back("-fsized-deallocation");
5123
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005124 // -fconstant-cfstrings is default, and may be subject to argument translation
5125 // on Darwin.
5126 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5127 options::OPT_fno_constant_cfstrings) ||
5128 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5129 options::OPT_mno_constant_cfstrings))
5130 CmdArgs.push_back("-fno-constant-cfstrings");
5131
John Thompsoned4e2952009-11-05 20:14:16 +00005132 // -fshort-wchar default varies depending on platform; only
5133 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005134 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5135 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005136 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005137
Hans Wennborg28c96312013-07-31 23:39:13 +00005138 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005139 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005140 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005141 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005142
Daniel Dunbar096ed292011-10-05 21:04:55 +00005143 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5144 // -fno-pack-struct doesn't apply to -fpack-struct=.
5145 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005146 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005147 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005148 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005149 } else if (Args.hasFlag(options::OPT_fpack_struct,
5150 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005151 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005152 }
5153
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005154 // Handle -fmax-type-align=N and -fno-type-align
5155 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5156 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5157 if (!SkipMaxTypeAlign) {
5158 std::string MaxTypeAlignStr = "-fmax-type-align=";
5159 MaxTypeAlignStr += A->getValue();
5160 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5161 }
5162 } else if (getToolChain().getTriple().isOSDarwin()) {
5163 if (!SkipMaxTypeAlign) {
5164 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5165 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5166 }
5167 }
5168
John Brawna7b4ec02015-08-10 11:11:28 +00005169 // -fcommon is the default unless compiling kernel code or the target says so
5170 bool NoCommonDefault =
5171 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5172 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5173 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005174 CmdArgs.push_back("-fno-common");
5175
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005176 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005177 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005178 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005179 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005180 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005181 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005182
Daniel Dunbar6358d682010-10-15 22:30:42 +00005183 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005184 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005185 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005186 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005187
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005188 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005189 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5190 StringRef value = inputCharset->getValue();
5191 if (value != "UTF-8")
5192 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5193 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005194 }
5195
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005196 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005197 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5198 StringRef value = execCharset->getValue();
5199 if (value != "UTF-8")
5200 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5201 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005202 }
5203
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005204 // -fcaret-diagnostics is default.
5205 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5206 options::OPT_fno_caret_diagnostics, true))
5207 CmdArgs.push_back("-fno-caret-diagnostics");
5208
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005209 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005210 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005211 options::OPT_fno_diagnostics_fixit_info))
5212 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005213
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005214 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005215 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005216 options::OPT_fno_diagnostics_show_option))
5217 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005218
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005219 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005221 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005222 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005223 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005224
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005225 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005226 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005227 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005228 }
5229
Chandler Carruthb6766f02011-03-27 01:50:55 +00005230 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005231 options::OPT_fdiagnostics_show_note_include_stack,
5232 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005233 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005234 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005235 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5236 else
5237 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5238 }
5239
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005240 // Color diagnostics are the default, unless the terminal doesn't support
5241 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005242 // Support both clang's -f[no-]color-diagnostics and gcc's
5243 // -f[no-]diagnostics-colors[=never|always|auto].
5244 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005245 for (const auto &Arg : Args) {
5246 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005247 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5248 !O.matches(options::OPT_fdiagnostics_color) &&
5249 !O.matches(options::OPT_fno_color_diagnostics) &&
5250 !O.matches(options::OPT_fno_diagnostics_color) &&
5251 !O.matches(options::OPT_fdiagnostics_color_EQ))
5252 continue;
5253
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005254 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005255 if (O.matches(options::OPT_fcolor_diagnostics) ||
5256 O.matches(options::OPT_fdiagnostics_color)) {
5257 ShowColors = Colors_On;
5258 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5259 O.matches(options::OPT_fno_diagnostics_color)) {
5260 ShowColors = Colors_Off;
5261 } else {
5262 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005263 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005264 if (value == "always")
5265 ShowColors = Colors_On;
5266 else if (value == "never")
5267 ShowColors = Colors_Off;
5268 else if (value == "auto")
5269 ShowColors = Colors_Auto;
5270 else
5271 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005272 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005273 }
5274 }
5275 if (ShowColors == Colors_On ||
5276 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005277 CmdArgs.push_back("-fcolor-diagnostics");
5278
Nico Rieck7857d462013-09-11 00:38:02 +00005279 if (Args.hasArg(options::OPT_fansi_escape_codes))
5280 CmdArgs.push_back("-fansi-escape-codes");
5281
Daniel Dunbardb097022009-06-08 21:13:54 +00005282 if (!Args.hasFlag(options::OPT_fshow_source_location,
5283 options::OPT_fno_show_source_location))
5284 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005286 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005287 true))
5288 CmdArgs.push_back("-fno-show-column");
5289
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005290 if (!Args.hasFlag(options::OPT_fspell_checking,
5291 options::OPT_fno_spell_checking))
5292 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005293
Chad Rosierc8e56e82012-12-05 21:08:21 +00005294 // -fno-asm-blocks is default.
5295 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5296 false))
5297 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005298
Steven Wucb0d13f2015-01-16 23:05:28 +00005299 // -fgnu-inline-asm is default.
5300 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5301 options::OPT_fno_gnu_inline_asm, true))
5302 CmdArgs.push_back("-fno-gnu-inline-asm");
5303
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005304 // Enable vectorization per default according to the optimization level
5305 // selected. For optimization levels that want vectorization we use the alias
5306 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005307 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005308 OptSpecifier VectorizeAliasOption =
5309 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005310 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005311 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005312 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005313
Chad Rosier136d67d2014-04-28 19:30:57 +00005314 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005315 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005316 OptSpecifier SLPVectAliasOption =
5317 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005318 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005319 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005320 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005321
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005322 // -fno-slp-vectorize-aggressive is default.
5323 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005324 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005325 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005326
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005327 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5328 A->render(Args, CmdArgs);
5329
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005330 // -fdollars-in-identifiers default varies depending on platform and
5331 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005332 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005333 options::OPT_fno_dollars_in_identifiers)) {
5334 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005335 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005336 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005337 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005338 }
5339
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005340 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5341 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005342 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005343 options::OPT_fno_unit_at_a_time)) {
5344 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005345 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005346 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005347
Eli Friedman055c9702011-11-02 01:53:16 +00005348 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5349 options::OPT_fno_apple_pragma_pack, false))
5350 CmdArgs.push_back("-fapple-pragma-pack");
5351
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005352 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005353 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5354 // by default.
5355 if (getToolChain().getArch() == llvm::Triple::le32) {
5356 CmdArgs.push_back("-fno-math-builtin");
5357 }
5358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005359// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5360//
5361// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005362#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005363 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005364 (getToolChain().getArch() == llvm::Triple::arm ||
5365 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005366 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5367 CmdArgs.push_back("-fno-builtin-strcat");
5368 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5369 CmdArgs.push_back("-fno-builtin-strcpy");
5370 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005371#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005372
Justin Bognera88f0122014-06-20 22:59:50 +00005373 // Enable rewrite includes if the user's asked for it or if we're generating
5374 // diagnostics.
5375 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5376 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005377 if (Args.hasFlag(options::OPT_frewrite_includes,
5378 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005379 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005380 CmdArgs.push_back("-frewrite-includes");
5381
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005382 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005383 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005384 options::OPT_traditional_cpp)) {
5385 if (isa<PreprocessJobAction>(JA))
5386 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005387 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005388 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005389 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005390
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005391 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005392 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005393
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005394 // Handle serialized diagnostics.
5395 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5396 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005397 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005398 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005399
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005400 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5401 CmdArgs.push_back("-fretain-comments-from-system-headers");
5402
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005403 // Forward -fcomment-block-commands to -cc1.
5404 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005405 // Forward -fparse-all-comments to -cc1.
5406 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005407
John Brawnad31ace2015-09-23 13:55:40 +00005408 // Turn -fplugin=name.so into -load name.so
5409 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5410 CmdArgs.push_back("-load");
5411 CmdArgs.push_back(A->getValue());
5412 A->claim();
5413 }
5414
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005415 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5416 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005417 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005418 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5419 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005420
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005421 // We translate this by hand to the -cc1 argument, since nightly test uses
5422 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005423 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005424 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005425 } else
Sean Silva14facf32015-06-09 01:57:17 +00005426 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005427 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005428
Bob Wilson23a55f12014-12-21 07:00:00 +00005429 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005430 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5431 // by the frontend.
5432 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5433 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005434
Daniel Dunbard67a3222009-03-30 06:36:42 +00005435 if (Output.getType() == types::TY_Dependencies) {
5436 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005437 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005438 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005439 CmdArgs.push_back(Output.getFilename());
5440 } else {
5441 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005442 }
5443
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005444 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005445
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005446 if (Input.isFilename())
5447 CmdArgs.push_back(Input.getFilename());
5448 else
5449 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005450
Chris Lattnere9d7d782009-11-03 19:50:27 +00005451 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5452
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005453 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005454
5455 // Optionally embed the -cc1 level arguments into the debug info, for build
5456 // analysis.
5457 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005458 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005459 for (const auto &Arg : Args)
5460 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005461
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005462 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005463 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005464 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005465 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005466 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005467 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005468 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005469 }
5470 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005471 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005472 }
5473
Eric Christopherd3804002013-02-22 20:12:52 +00005474 // Add the split debug info name to the command lines here so we
5475 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005476 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005477 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5478 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005479 const char *SplitDwarfOut;
5480 if (SplitDwarf) {
5481 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005482 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005483 CmdArgs.push_back(SplitDwarfOut);
5484 }
5485
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005486 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5487 // Include them with -fcuda-include-gpubinary.
5488 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005489 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005490 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005491 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005492 }
5493
Eric Christopherd3804002013-02-22 20:12:52 +00005494 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005495 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005496 Output.getType() == types::TY_Object &&
5497 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005498 auto CLCommand =
5499 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005500 C.addCommand(llvm::make_unique<FallbackCommand>(
5501 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005502 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005504 }
5505
Eric Christopherf1545832013-02-22 23:50:16 +00005506 // Handle the debug info splitting at object creation time if we're
5507 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005508 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005509 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005510 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005511
Roman Divacky178e01602011-02-10 16:52:03 +00005512 if (Arg *A = Args.getLastArg(options::OPT_pg))
5513 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005514 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5515 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005516
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005517 // Claim some arguments which clang supports automatically.
5518
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005519 // -fpch-preprocess is used with gcc to add a special marker in the output to
5520 // include the PCH file. Clang's PTH solution is completely transparent, so we
5521 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005522 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005523
Daniel Dunbar17731772009-03-23 19:03:36 +00005524 // Claim some arguments which clang doesn't support, but we don't
5525 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005526 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5527 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005528
Rafael Espindolab0092d72013-09-04 19:37:35 +00005529 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005530 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005531}
5532
John McCall5fb5df92012-06-20 06:18:46 +00005533/// Add options related to the Objective-C runtime/ABI.
5534///
5535/// Returns true if the runtime is non-fragile.
5536ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5537 ArgStringList &cmdArgs,
5538 RewriteKind rewriteKind) const {
5539 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005540 Arg *runtimeArg =
5541 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5542 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005543
5544 // Just forward -fobjc-runtime= to the frontend. This supercedes
5545 // options about fragility.
5546 if (runtimeArg &&
5547 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5548 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005549 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005550 if (runtime.tryParse(value)) {
5551 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005552 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005553 }
5554
5555 runtimeArg->render(args, cmdArgs);
5556 return runtime;
5557 }
5558
5559 // Otherwise, we'll need the ABI "version". Version numbers are
5560 // slightly confusing for historical reasons:
5561 // 1 - Traditional "fragile" ABI
5562 // 2 - Non-fragile ABI, version 1
5563 // 3 - Non-fragile ABI, version 2
5564 unsigned objcABIVersion = 1;
5565 // If -fobjc-abi-version= is present, use that to set the version.
5566 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005567 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005568 if (value == "1")
5569 objcABIVersion = 1;
5570 else if (value == "2")
5571 objcABIVersion = 2;
5572 else if (value == "3")
5573 objcABIVersion = 3;
5574 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005575 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005576 } else {
5577 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005578 bool nonFragileABIIsDefault =
5579 (rewriteKind == RK_NonFragile ||
5580 (rewriteKind == RK_None &&
5581 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005582 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5583 options::OPT_fno_objc_nonfragile_abi,
5584 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005585// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005586#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5587 unsigned nonFragileABIVersion = 1;
5588#else
5589 unsigned nonFragileABIVersion = 2;
5590#endif
5591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005592 if (Arg *abiArg =
5593 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005594 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005595 if (value == "1")
5596 nonFragileABIVersion = 1;
5597 else if (value == "2")
5598 nonFragileABIVersion = 2;
5599 else
5600 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005601 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005602 }
5603
5604 objcABIVersion = 1 + nonFragileABIVersion;
5605 } else {
5606 objcABIVersion = 1;
5607 }
5608 }
5609
5610 // We don't actually care about the ABI version other than whether
5611 // it's non-fragile.
5612 bool isNonFragile = objcABIVersion != 1;
5613
5614 // If we have no runtime argument, ask the toolchain for its default runtime.
5615 // However, the rewriter only really supports the Mac runtime, so assume that.
5616 ObjCRuntime runtime;
5617 if (!runtimeArg) {
5618 switch (rewriteKind) {
5619 case RK_None:
5620 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5621 break;
5622 case RK_Fragile:
5623 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5624 break;
5625 case RK_NonFragile:
5626 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5627 break;
5628 }
5629
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005630 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005631 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5632 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005633 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005634 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5635
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005636 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005637 } else {
5638 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5639 }
5640
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005641 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005642 } else {
5643 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005644 // Legacy behaviour is to target the gnustep runtime if we are i
5645 // non-fragile mode or the GCC runtime in fragile mode.
5646 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005647 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005648 else
5649 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005650 }
5651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005652 cmdArgs.push_back(
5653 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005654 return runtime;
5655}
5656
Reid Klecknerc542d372014-06-27 17:02:02 +00005657static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5658 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5659 I += HaveDash;
5660 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005661}
Reid Klecknerc542d372014-06-27 17:02:02 +00005662
Benjamin Kramere003ca22015-10-28 13:54:16 +00005663namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005664struct EHFlags {
5665 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5666 bool Synch;
5667 bool Asynch;
5668 bool NoExceptC;
5669};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005670} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005671
5672/// /EH controls whether to run destructor cleanups when exceptions are
5673/// thrown. There are three modifiers:
5674/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5675/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5676/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5677/// - c: Assume that extern "C" functions are implicitly noexcept. This
5678/// modifier is an optimization, so we ignore it for now.
5679/// The default is /EHs-c-, meaning cleanups are disabled.
5680static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5681 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005683 std::vector<std::string> EHArgs =
5684 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005685 for (auto EHVal : EHArgs) {
5686 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5687 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005688 case 'a':
5689 EH.Asynch = maybeConsumeDash(EHVal, I);
5690 continue;
5691 case 'c':
5692 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5693 continue;
5694 case 's':
5695 EH.Synch = maybeConsumeDash(EHVal, I);
5696 continue;
5697 default:
5698 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005699 }
5700 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5701 break;
5702 }
5703 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005704
Reid Klecknerc542d372014-06-27 17:02:02 +00005705 return EH;
5706}
5707
Douglas Katzman3459ce22015-10-08 04:24:12 +00005708void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5709 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5710 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005711 unsigned RTOptionID = options::OPT__SLASH_MT;
5712
Hans Wennborgf1a74252013-09-10 20:18:04 +00005713 if (Args.hasArg(options::OPT__SLASH_LDd))
5714 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5715 // but defining _DEBUG is sticky.
5716 RTOptionID = options::OPT__SLASH_MTd;
5717
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005718 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005719 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005720
David Majnemere2afb472015-07-24 06:49:13 +00005721 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005722 switch (RTOptionID) {
5723 case options::OPT__SLASH_MD:
5724 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005725 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005726 CmdArgs.push_back("-D_MT");
5727 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005728 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005729 break;
5730 case options::OPT__SLASH_MDd:
5731 CmdArgs.push_back("-D_DEBUG");
5732 CmdArgs.push_back("-D_MT");
5733 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005734 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005735 break;
5736 case options::OPT__SLASH_MT:
5737 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005738 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005739 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005740 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005741 break;
5742 case options::OPT__SLASH_MTd:
5743 CmdArgs.push_back("-D_DEBUG");
5744 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005745 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005746 break;
5747 default:
5748 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005749 }
5750
David Majnemere2afb472015-07-24 06:49:13 +00005751 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5752 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5753 } else {
5754 CmdArgs.push_back(FlagForCRT.data());
5755
5756 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5757 // users want. The /Za flag to cl.exe turns this off, but it's not
5758 // implemented in clang.
5759 CmdArgs.push_back("--dependent-lib=oldnames");
5760 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005761
Hans Wennborg8858a032014-07-21 23:42:07 +00005762 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5763 // would produce interleaved output, so ignore /showIncludes in such cases.
5764 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5765 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5766 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005767
David Majnemerf6072342014-07-01 22:24:56 +00005768 // This controls whether or not we emit RTTI data for polymorphic types.
5769 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5770 /*default=*/false))
5771 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005772
Reid Kleckner124955a2015-08-05 18:51:13 +00005773 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005774 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005775 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5776 // If we are emitting CV but not DWARF, don't build information that LLVM
5777 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005778 if (*EmitCodeView && !EmitDwarf)
5779 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5780 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005781 CmdArgs.push_back("-gcodeview");
5782
Reid Klecknerc542d372014-06-27 17:02:02 +00005783 const Driver &D = getToolChain().getDriver();
5784 EHFlags EH = parseClangCLEHFlags(D, Args);
5785 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005786 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005787 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005788 CmdArgs.push_back("-fexceptions");
5789 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005790
Hans Wennborge50cec32014-06-13 20:59:54 +00005791 // /EP should expand to -E -P.
5792 if (Args.hasArg(options::OPT__SLASH_EP)) {
5793 CmdArgs.push_back("-E");
5794 CmdArgs.push_back("-P");
5795 }
5796
David Majnemera5b195a2015-02-14 01:35:12 +00005797 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005798 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5799 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005800 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5801 else
5802 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5803
5804 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5805 VolatileOptionID = A->getOption().getID();
5806
5807 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5808 CmdArgs.push_back("-fms-volatile");
5809
David Majnemer86c318f2014-02-11 21:05:00 +00005810 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5811 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5812 if (MostGeneralArg && BestCaseArg)
5813 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5814 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5815
5816 if (MostGeneralArg) {
5817 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5818 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5819 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5820
5821 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5822 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5823 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5824 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5825 << FirstConflict->getAsString(Args)
5826 << SecondConflict->getAsString(Args);
5827
5828 if (SingleArg)
5829 CmdArgs.push_back("-fms-memptr-rep=single");
5830 else if (MultipleArg)
5831 CmdArgs.push_back("-fms-memptr-rep=multiple");
5832 else
5833 CmdArgs.push_back("-fms-memptr-rep=virtual");
5834 }
5835
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005836 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5837 A->render(Args, CmdArgs);
5838
Hans Wennborg81f74482013-09-10 01:07:07 +00005839 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5840 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005841 if (Args.hasArg(options::OPT__SLASH_fallback))
5842 CmdArgs.push_back("msvc-fallback");
5843 else
5844 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005845 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005846}
5847
Douglas Katzman95354292015-06-23 20:42:09 +00005848visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005849 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005850 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005851 return CLFallback.get();
5852}
5853
Daniel Sanders7f933f42015-01-30 17:35:23 +00005854void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5855 ArgStringList &CmdArgs) const {
5856 StringRef CPUName;
5857 StringRef ABIName;
5858 const llvm::Triple &Triple = getToolChain().getTriple();
5859 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5860
5861 CmdArgs.push_back("-target-abi");
5862 CmdArgs.push_back(ABIName.data());
5863}
5864
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005865void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005866 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005867 const ArgList &Args,
5868 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005869 ArgStringList CmdArgs;
5870
5871 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5872 const InputInfo &Input = Inputs[0];
5873
James Y Knight2db38f32015-08-15 03:45:25 +00005874 std::string TripleStr =
5875 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5876 const llvm::Triple Triple(TripleStr);
5877
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005878 // Don't warn about "clang -w -c foo.s"
5879 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005880 // and "clang -emit-llvm -c foo.s"
5881 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005882
Rafael Espindola577637a2015-01-03 00:06:04 +00005883 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005884
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005885 // Invoke ourselves in -cc1as mode.
5886 //
5887 // FIXME: Implement custom jobs for internal actions.
5888 CmdArgs.push_back("-cc1as");
5889
5890 // Add the "effective" target triple.
5891 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005892 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5893
5894 // Set the output mode, we currently only expect to be used as a real
5895 // assembler.
5896 CmdArgs.push_back("-filetype");
5897 CmdArgs.push_back("obj");
5898
Eric Christopher45f2e712012-12-18 00:31:10 +00005899 // Set the main file name, so that debug info works even with
5900 // -save-temps or preprocessed assembly.
5901 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005902 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005903
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005904 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005905 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005906 if (!CPU.empty()) {
5907 CmdArgs.push_back("-target-cpu");
5908 CmdArgs.push_back(Args.MakeArgString(CPU));
5909 }
5910
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005911 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005912 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005913
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005914 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005915 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005916
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005917 // Pass along any -I options so we get proper .include search paths.
5918 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5919
Eric Christopherfc3ee562012-01-10 00:38:01 +00005920 // Determine the original source input.
5921 const Action *SourceAction = &JA;
5922 while (SourceAction->getKind() != Action::InputClass) {
5923 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5924 SourceAction = SourceAction->getInputs()[0];
5925 }
5926
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005927 // Forward -g and handle debug info related flags, assuming we are dealing
5928 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005929 if (SourceAction->getType() == types::TY_Asm ||
5930 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005931 bool WantDebug = false;
5932 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005933 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005934 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00005935 WantDebug = !A->getOption().matches(options::OPT_g0) &&
5936 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005937 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005938 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005939 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005940 if (DwarfVersion == 0)
5941 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005942 RenderDebugEnablingArgs(Args, CmdArgs,
5943 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5944 : CodeGenOptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00005945 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005946
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005947 // Add the -fdebug-compilation-dir flag if needed.
5948 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005949
5950 // Set the AT_producer to the clang version when using the integrated
5951 // assembler on assembly source files.
5952 CmdArgs.push_back("-dwarf-debug-producer");
5953 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005954
5955 // And pass along -I options
5956 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005957 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005958
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005959 // Handle -fPIC et al -- the relocation-model affects the assembler
5960 // for some targets.
5961 llvm::Reloc::Model RelocationModel;
5962 unsigned PICLevel;
5963 bool IsPIE;
5964 std::tie(RelocationModel, PICLevel, IsPIE) =
5965 ParsePICArgs(getToolChain(), Triple, Args);
5966
5967 const char *RMName = RelocationModelName(RelocationModel);
5968 if (RMName) {
5969 CmdArgs.push_back("-mrelocation-model");
5970 CmdArgs.push_back(RMName);
5971 }
5972
Kevin Enderby292dc082011-12-22 19:31:58 +00005973 // Optionally embed the -cc1as level arguments into the debug info, for build
5974 // analysis.
5975 if (getToolChain().UseDwarfDebugFlags()) {
5976 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005977 for (const auto &Arg : Args)
5978 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005979
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005980 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005981 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5982 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005983 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005984 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005985 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005986 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005987 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005988 }
5989 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005990 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005991 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005992
5993 // FIXME: Add -static support, once we have it.
5994
Daniel Sanders7f933f42015-01-30 17:35:23 +00005995 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005996 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005997 default:
5998 break;
5999
6000 case llvm::Triple::mips:
6001 case llvm::Triple::mipsel:
6002 case llvm::Triple::mips64:
6003 case llvm::Triple::mips64el:
6004 AddMIPSTargetArgs(Args, CmdArgs);
6005 break;
6006 }
6007
David Blaikie372d9502014-01-17 03:17:40 +00006008 // Consume all the warning flags. Usually this would be handled more
6009 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6010 // doesn't handle that so rather than warning about unused flags that are
6011 // actually used, we'll lie by omission instead.
6012 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00006013 for (const Arg *A : Args.filtered(options::OPT_W_Group))
6014 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00006015
David Blaikie9260ed62013-07-25 21:19:01 +00006016 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6017 getToolChain().getDriver());
6018
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006019 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006020
6021 assert(Output.isFilename() && "Unexpected lipo output.");
6022 CmdArgs.push_back("-o");
6023 CmdArgs.push_back(Output.getFilename());
6024
Daniel Dunbarb440f562010-08-02 02:38:21 +00006025 assert(Input.isFilename() && "Invalid input.");
6026 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006027
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006028 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006029 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006030
6031 // Handle the debug info splitting at object creation time if we're
6032 // creating an object.
6033 // TODO: Currently only works on linux with newer objcopy.
6034 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006035 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006036 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006037 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006038}
6039
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006040void GnuTool::anchor() {}
6041
Daniel Dunbara3246a02009-03-18 08:07:30 +00006042void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006043 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006044 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006045 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006046 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006047 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006048
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006049 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006050 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00006051 // Don't forward any -g arguments to assembly steps.
6052 if (isa<AssembleJobAction>(JA) &&
6053 A->getOption().matches(options::OPT_g_Group))
6054 continue;
6055
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006056 // Don't forward any -W arguments to assembly and link steps.
6057 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6058 A->getOption().matches(options::OPT_W_Group))
6059 continue;
6060
Daniel Dunbar2da02722009-03-19 07:55:12 +00006061 // It is unfortunate that we have to claim here, as this means
6062 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00006063 // platforms using a generic gcc, even if we are just using gcc
6064 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00006065 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006066 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006067 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006068 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006069
Daniel Dunbar4e295052010-01-25 22:35:08 +00006070 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006071
6072 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006073 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006074 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006075 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006076 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006077 }
6078
Daniel Dunbar5716d872009-05-02 21:41:52 +00006079 // Try to force gcc to match the tool chain we want, if we recognize
6080 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006081 //
6082 // FIXME: The triple class should directly provide the information we want
6083 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006084 switch (getToolChain().getArch()) {
6085 default:
6086 break;
6087 case llvm::Triple::x86:
6088 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006089 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006090 break;
6091 case llvm::Triple::x86_64:
6092 case llvm::Triple::ppc64:
6093 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006094 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006095 break;
6096 case llvm::Triple::sparcel:
6097 CmdArgs.push_back("-EL");
6098 break;
6099 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006100
Daniel Dunbarb440f562010-08-02 02:38:21 +00006101 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006102 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006103 CmdArgs.push_back(Output.getFilename());
6104 } else {
6105 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006106 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006107 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006109 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006110
6111 // Only pass -x if gcc will understand it; otherwise hope gcc
6112 // understands the suffix correctly. The main use case this would go
6113 // wrong in is for linker inputs if they happened to have an odd
6114 // suffix; really the only way to get this to happen is a command
6115 // like '-x foobar a.c' which will treat a.c like a linker input.
6116 //
6117 // FIXME: For the linker case specifically, can we safely convert
6118 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006119 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006120 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006121 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006122 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006123 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006124 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006125 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006126 else if (II.getType() == types::TY_ModuleFile)
6127 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006128 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006129
Daniel Dunbara3246a02009-03-18 08:07:30 +00006130 if (types::canTypeBeUserSpecified(II.getType())) {
6131 CmdArgs.push_back("-x");
6132 CmdArgs.push_back(types::getTypeName(II.getType()));
6133 }
6134
Daniel Dunbarb440f562010-08-02 02:38:21 +00006135 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006136 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006137 else {
6138 const Arg &A = II.getInputArg();
6139
6140 // Reverse translate some rewritten options.
6141 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6142 CmdArgs.push_back("-lstdc++");
6143 continue;
6144 }
6145
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006146 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006147 A.render(Args, CmdArgs);
6148 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006149 }
6150
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006151 const std::string customGCCName = D.getCCCGenericGCCName();
6152 const char *GCCName;
6153 if (!customGCCName.empty())
6154 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006155 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006156 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006157 } else
6158 GCCName = "gcc";
6159
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006160 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006161 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006162}
6163
Douglas Katzman95354292015-06-23 20:42:09 +00006164void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6165 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006166 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006167}
6168
Douglas Katzman95354292015-06-23 20:42:09 +00006169void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6170 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006171 const Driver &D = getToolChain().getDriver();
6172
Eric Christophercc7ff502015-01-29 00:56:17 +00006173 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006174 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006175 case types::TY_LLVM_IR:
6176 case types::TY_LTO_IR:
6177 case types::TY_LLVM_BC:
6178 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006179 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006180 break;
6181 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006182 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006183 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006184 case types::TY_Nothing:
6185 CmdArgs.push_back("-fsyntax-only");
6186 break;
6187 default:
6188 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006189 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006190}
6191
Douglas Katzman95354292015-06-23 20:42:09 +00006192void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6193 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006194 // The types are (hopefully) good enough.
6195}
6196
Tony Linthicum76329bf2011-12-12 21:14:55 +00006197// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006198void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006199 ArgStringList &CmdArgs) const {
6200}
6201
Douglas Katzman95354292015-06-23 20:42:09 +00006202void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6203 const InputInfo &Output,
6204 const InputInfoList &Inputs,
6205 const ArgList &Args,
6206 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006207 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006209 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6210 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006211 ArgStringList CmdArgs;
6212
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213 std::string MArchString = "-march=hexagon";
6214 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215
6216 RenderExtraToolArgs(JA, CmdArgs);
6217
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 std::string AsName = "hexagon-llvm-mc";
6219 std::string MCpuString = "-mcpu=hexagon" +
6220 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6221 CmdArgs.push_back("-filetype=obj");
6222 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6223
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224 if (Output.isFilename()) {
6225 CmdArgs.push_back("-o");
6226 CmdArgs.push_back(Output.getFilename());
6227 } else {
6228 assert(Output.isNothing() && "Unexpected output");
6229 CmdArgs.push_back("-fsyntax-only");
6230 }
6231
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006232 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6233 std::string N = llvm::utostr(G.getValue());
6234 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6235 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006236
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006237 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006238
Tony Linthicum76329bf2011-12-12 21:14:55 +00006239 // Only pass -x if gcc will understand it; otherwise hope gcc
6240 // understands the suffix correctly. The main use case this would go
6241 // wrong in is for linker inputs if they happened to have an odd
6242 // suffix; really the only way to get this to happen is a command
6243 // like '-x foobar a.c' which will treat a.c like a linker input.
6244 //
6245 // FIXME: For the linker case specifically, can we safely convert
6246 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006247 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006248 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006249 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006250 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006251 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006252 else if (II.getType() == types::TY_AST)
6253 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006254 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006255 else if (II.getType() == types::TY_ModuleFile)
6256 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006257 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006258
6259 if (II.isFilename())
6260 CmdArgs.push_back(II.getFilename());
6261 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006262 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006263 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264 II.getInputArg().render(Args, CmdArgs);
6265 }
6266
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006267 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006268 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006269}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006270
Douglas Katzman95354292015-06-23 20:42:09 +00006271void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6272 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273}
6274
Douglas Katzman54366072015-07-27 16:53:08 +00006275static void
6276constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006277 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006278 const InputInfo &Output, const InputInfoList &Inputs,
6279 const ArgList &Args, ArgStringList &CmdArgs,
6280 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006282 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006283
Matthew Curtise689b052012-12-06 15:46:07 +00006284 //----------------------------------------------------------------------------
6285 //
6286 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006287 bool IsStatic = Args.hasArg(options::OPT_static);
6288 bool IsShared = Args.hasArg(options::OPT_shared);
6289 bool IsPIE = Args.hasArg(options::OPT_pie);
6290 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6291 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6292 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6293 bool UseG0 = false;
6294 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006295
Matthew Curtise689b052012-12-06 15:46:07 +00006296 //----------------------------------------------------------------------------
6297 // Silence warnings for various options
6298 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006299 Args.ClaimAllArgs(options::OPT_g_Group);
6300 Args.ClaimAllArgs(options::OPT_emit_llvm);
6301 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6302 // handled somewhere else.
6303 Args.ClaimAllArgs(options::OPT_static_libgcc);
6304
6305 //----------------------------------------------------------------------------
6306 //
6307 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006308 if (Args.hasArg(options::OPT_s))
6309 CmdArgs.push_back("-s");
6310
6311 if (Args.hasArg(options::OPT_r))
6312 CmdArgs.push_back("-r");
6313
6314 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006315 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006317 CmdArgs.push_back("-march=hexagon");
6318 std::string CpuVer =
6319 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6320 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6321 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006322
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006323 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006324 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006325 // The following should be the default, but doing as hexagon-gcc does.
6326 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006327 }
6328
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006329 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006330 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006331
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006332 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006333 CmdArgs.push_back("-pie");
6334
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006335 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6336 std::string N = llvm::utostr(G.getValue());
6337 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6338 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006339 }
6340
Matthew Curtise689b052012-12-06 15:46:07 +00006341 //----------------------------------------------------------------------------
6342 //
6343 //----------------------------------------------------------------------------
6344 CmdArgs.push_back("-o");
6345 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006346
Matthew Curtise689b052012-12-06 15:46:07 +00006347 //----------------------------------------------------------------------------
6348 // moslib
6349 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 std::vector<std::string> OsLibs;
6351 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006352
Sean Silva14facf32015-06-09 01:57:17 +00006353 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6354 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006355 OsLibs.emplace_back(A->getValue());
6356 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006357 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006358 if (OsLibs.empty()) {
6359 OsLibs.push_back("standalone");
6360 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006361 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006362
Matthew Curtise689b052012-12-06 15:46:07 +00006363 //----------------------------------------------------------------------------
6364 // Start Files
6365 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006366 const std::string MCpuSuffix = "/" + CpuVer;
6367 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6368 const std::string RootDir =
6369 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6370 const std::string StartSubDir =
6371 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006372
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006373 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6374 const char *Name) -> std::string {
6375 std::string RelName = SubDir + Name;
6376 std::string P = HTC.GetFilePath(RelName.c_str());
6377 if (llvm::sys::fs::exists(P))
6378 return P;
6379 return RootDir + RelName;
6380 };
6381
6382 if (IncStdLib && IncStartFiles) {
6383 if (!IsShared) {
6384 if (HasStandalone) {
6385 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6386 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006387 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006388 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6389 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006390 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006391 std::string Init = UseShared
6392 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6393 : Find(RootDir, StartSubDir, "/init.o");
6394 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006395 }
6396
6397 //----------------------------------------------------------------------------
6398 // Library Search Paths
6399 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006400 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6401 for (const auto &LibPath : LibPaths)
6402 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006403
6404 //----------------------------------------------------------------------------
6405 //
6406 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006407 Args.AddAllArgs(CmdArgs,
6408 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6409 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006410
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006411 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006412
6413 //----------------------------------------------------------------------------
6414 // Libraries
6415 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006416 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006417 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006418 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006419 CmdArgs.push_back("-lm");
6420 }
6421
6422 CmdArgs.push_back("--start-group");
6423
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006424 if (!IsShared) {
6425 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006426 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006427 CmdArgs.push_back("-lc");
6428 }
6429 CmdArgs.push_back("-lgcc");
6430
6431 CmdArgs.push_back("--end-group");
6432 }
6433
6434 //----------------------------------------------------------------------------
6435 // End files
6436 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006437 if (IncStdLib && IncStartFiles) {
6438 std::string Fini = UseShared
6439 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6440 : Find(RootDir, StartSubDir, "/fini.o");
6441 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006442 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006443}
6444
Douglas Katzman95354292015-06-23 20:42:09 +00006445void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6446 const InputInfo &Output,
6447 const InputInfoList &Inputs,
6448 const ArgList &Args,
6449 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006451
6452 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006454 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006455
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006457 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006458 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006459}
6460// Hexagon tools end.
6461
Tom Stellard8fa33092015-07-18 01:49:05 +00006462void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6463 const InputInfo &Output,
6464 const InputInfoList &Inputs,
6465 const ArgList &Args,
6466 const char *LinkingOutput) const {
6467
6468 std::string Linker = getToolChain().GetProgramPath(getShortName());
6469 ArgStringList CmdArgs;
6470 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006471 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006472 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006473 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006474 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6475 CmdArgs.push_back("-o");
6476 CmdArgs.push_back(Output.getFilename());
6477 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6478 CmdArgs, Inputs));
6479}
6480// AMDGPU tools end.
6481
Dan Gohman52816862015-12-16 23:30:41 +00006482wasm::Linker::Linker(const ToolChain &TC)
6483 : GnuTool("wasm::Linker", "lld", TC) {}
6484
6485bool wasm::Linker::isLinkJob() const {
6486 return true;
6487}
6488
6489bool wasm::Linker::hasIntegratedCPP() const {
6490 return false;
6491}
6492
6493void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6494 const InputInfo &Output,
6495 const InputInfoList &Inputs,
6496 const ArgList &Args,
6497 const char *LinkingOutput) const {
6498 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6499 ArgStringList CmdArgs;
6500 CmdArgs.push_back("-flavor");
6501 CmdArgs.push_back("ld");
Dan Gohman52816862015-12-16 23:30:41 +00006502 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6503 CmdArgs.push_back("-o");
6504 CmdArgs.push_back(Output.getFilename());
6505 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6506}
6507
Renato Golin7c542b42015-07-27 23:44:45 +00006508const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006509 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006510 if (!Arch.empty())
6511 MArch = Arch;
6512 else
Bernard Ogden31561762013-12-12 13:27:11 +00006513 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006514 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006515
6516 // Handle -march=native.
6517 if (MArch == "native") {
6518 std::string CPU = llvm::sys::getHostCPUName();
6519 if (CPU != "generic") {
6520 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006521 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006522 // If there is no valid architecture suffix for this CPU we don't know how
6523 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006524 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006525 MArch = "";
6526 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006527 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006528 }
6529 }
6530
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006531 return MArch;
6532}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006533
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006534/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006535StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006536 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006537 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6538 // here means an -march=native that we can't handle, so instead return no CPU.
6539 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006540 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006541
John Brawna95c1a82015-05-08 12:52:18 +00006542 // We need to return an empty string here on invalid MArch values as the
6543 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006544 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006545}
6546
6547/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006548std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006549 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006550 // FIXME: Warn on inconsistent use of -mcpu and -march.
6551 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006552 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006553 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006554 // Handle -mcpu=native.
6555 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006556 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006557 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006558 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006559 }
6560
Renato Goline17c5802015-07-27 23:44:42 +00006561 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006562}
6563
6564/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006565/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006566// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006567StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6568 const llvm::Triple &Triple) {
6569 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006570 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006571 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006572 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006573 if (ArchKind == llvm::ARM::AK_INVALID)
6574 // In case of generic Arch, i.e. "arm",
6575 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006576 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006577 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006578 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6579 // armv7k triple if it's actually been specified via "-arch armv7k".
6580 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006581 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006582 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006583 }
Renato Golin3c007252015-05-28 15:05:53 +00006584 if (ArchKind == llvm::ARM::AK_INVALID)
6585 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006586 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006587}
6588
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006589void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006590 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006591 if (Args.hasArg(options::OPT_r))
6592 return;
6593
John Brawn94fd9632015-05-21 12:19:49 +00006594 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6595 // to generate BE-8 executables.
6596 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6597 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006598}
6599
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006600mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006601 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6602 // was first introduced in Release 3. However, other compilers have
6603 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006604 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6605 .Case("mips1", NanLegacy)
6606 .Case("mips2", NanLegacy)
6607 .Case("mips3", NanLegacy)
6608 .Case("mips4", NanLegacy)
6609 .Case("mips5", NanLegacy)
6610 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006611 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006612 .Case("mips32r3", NanLegacy | Nan2008)
6613 .Case("mips32r5", NanLegacy | Nan2008)
6614 .Case("mips32r6", Nan2008)
6615 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006616 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006617 .Case("mips64r3", NanLegacy | Nan2008)
6618 .Case("mips64r5", NanLegacy | Nan2008)
6619 .Case("mips64r6", Nan2008)
6620 .Default(NanLegacy);
6621}
6622
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006623bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6624 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6625 return A && (A->getValue() == StringRef(Value));
6626}
6627
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006628bool mips::isUCLibc(const ArgList &Args) {
6629 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006630 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006631}
6632
Daniel Sanders2bf13662014-07-10 14:40:57 +00006633bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006634 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6635 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006636 .Case("2008", true)
6637 .Case("legacy", false)
6638 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006639
6640 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006641 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006642 .Cases("mips32r6", "mips64r6", true)
6643 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006644
6645 return false;
6646}
6647
Daniel Sanders379d44b2014-07-16 11:52:23 +00006648bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006649 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006650 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006651 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006652 return false;
6653
6654 if (ABIName != "32")
6655 return false;
6656
Toma Tabacu94ea6862015-06-16 13:54:13 +00006657 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6658 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006659 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006660 return false;
6661
Daniel Sanders379d44b2014-07-16 11:52:23 +00006662 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006663 .Cases("mips2", "mips3", "mips4", "mips5", true)
6664 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6665 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6666 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006667}
6668
Toma Tabacu94ea6862015-06-16 13:54:13 +00006669bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6670 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006671 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006672 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6673
6674 // FPXX shouldn't be used if -msingle-float is present.
6675 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6676 options::OPT_mdouble_float))
6677 if (A->getOption().matches(options::OPT_msingle_float))
6678 UseFPXX = false;
6679
6680 return UseFPXX;
6681}
6682
Tim Northover157d9112014-01-16 08:48:16 +00006683llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006684 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6685 // archs which Darwin doesn't use.
6686
6687 // The matching this routine does is fairly pointless, since it is neither the
6688 // complete architecture list, nor a reasonable subset. The problem is that
6689 // historically the driver driver accepts this and also ties its -march=
6690 // handling to the architecture name, so we need to be careful before removing
6691 // support for it.
6692
6693 // This code must be kept in sync with Clang's Darwin specific argument
6694 // translation.
6695
6696 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006697 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6698 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6699 .Case("ppc64", llvm::Triple::ppc64)
6700 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6701 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6702 llvm::Triple::x86)
6703 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6704 // This is derived from the driver driver.
6705 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6706 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6707 .Cases("armv7s", "xscale", llvm::Triple::arm)
6708 .Case("arm64", llvm::Triple::aarch64)
6709 .Case("r600", llvm::Triple::r600)
6710 .Case("amdgcn", llvm::Triple::amdgcn)
6711 .Case("nvptx", llvm::Triple::nvptx)
6712 .Case("nvptx64", llvm::Triple::nvptx64)
6713 .Case("amdil", llvm::Triple::amdil)
6714 .Case("spir", llvm::Triple::spir)
6715 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006716}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006717
Tim Northover157d9112014-01-16 08:48:16 +00006718void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006719 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006720 T.setArch(Arch);
6721
6722 if (Str == "x86_64h")
6723 T.setArchName(Str);
6724 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6725 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006726 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006727 }
6728}
6729
Bob Wilsondecc03e2012-11-23 06:14:39 +00006730const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006731 const InputInfo &Input) {
6732 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006733}
6734
Bob Wilsondecc03e2012-11-23 06:14:39 +00006735const char *Clang::getBaseInputStem(const ArgList &Args,
6736 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006737 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006738
Chris Lattner906bb902011-01-16 08:14:11 +00006739 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006740 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006741
6742 return Str;
6743}
6744
Bob Wilsondecc03e2012-11-23 06:14:39 +00006745const char *Clang::getDependencyFileName(const ArgList &Args,
6746 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006747 // FIXME: Think about this more.
6748 std::string Res;
6749
6750 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006751 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006752 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006753 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006754 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006755 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006756 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006757}
6758
Douglas Katzman95354292015-06-23 20:42:09 +00006759void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6760 const InputInfo &Output,
6761 const InputInfoList &Inputs,
6762 const ArgList &Args,
6763 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006764 const ToolChain &ToolChain = getToolChain();
6765 const Driver &D = ToolChain.getDriver();
6766 ArgStringList CmdArgs;
6767
6768 // Silence warning for "clang -g foo.o -o foo"
6769 Args.ClaimAllArgs(options::OPT_g_Group);
6770 // and "clang -emit-llvm foo.o -o foo"
6771 Args.ClaimAllArgs(options::OPT_emit_llvm);
6772 // and for "clang -w foo.o -o foo". Other warning options are already
6773 // handled somewhere else.
6774 Args.ClaimAllArgs(options::OPT_w);
6775
6776 if (!D.SysRoot.empty())
6777 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6778
6779 // CloudABI only supports static linkage.
6780 CmdArgs.push_back("-Bstatic");
6781 CmdArgs.push_back("--eh-frame-hdr");
6782 CmdArgs.push_back("--gc-sections");
6783
6784 if (Output.isFilename()) {
6785 CmdArgs.push_back("-o");
6786 CmdArgs.push_back(Output.getFilename());
6787 } else {
6788 assert(Output.isNothing() && "Invalid output.");
6789 }
6790
Douglas Katzman78b37b02015-11-17 20:28:07 +00006791 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006792 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6793 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6794 }
6795
6796 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006797 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006798 Args.AddAllArgs(CmdArgs,
6799 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6800 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006801
Teresa Johnson945bc502015-10-15 20:35:53 +00006802 if (D.isUsingLTO())
6803 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006804
6805 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6806
Douglas Katzman78b37b02015-11-17 20:28:07 +00006807 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006808 if (D.CCCIsCXX())
6809 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6810 CmdArgs.push_back("-lc");
6811 CmdArgs.push_back("-lcompiler_rt");
6812 }
6813
Douglas Katzman78b37b02015-11-17 20:28:07 +00006814 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006815 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6816
6817 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006818 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006819}
6820
Douglas Katzman95354292015-06-23 20:42:09 +00006821void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6822 const InputInfo &Output,
6823 const InputInfoList &Inputs,
6824 const ArgList &Args,
6825 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006826 ArgStringList CmdArgs;
6827
6828 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6829 const InputInfo &Input = Inputs[0];
6830
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006831 // Determine the original source input.
6832 const Action *SourceAction = &JA;
6833 while (SourceAction->getKind() != Action::InputClass) {
6834 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6835 SourceAction = SourceAction->getInputs()[0];
6836 }
6837
Eric Christopherf5a8f492015-12-08 00:10:10 +00006838 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006839 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006840 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6841 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006842 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006843 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006844 const llvm::Triple &T(getToolChain().getTriple());
6845 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006846 CmdArgs.push_back("-Q");
6847 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006848
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006849 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006850 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006851 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006852 if (Args.hasArg(options::OPT_gstabs))
6853 CmdArgs.push_back("--gstabs");
6854 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006855 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006856 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006857
Daniel Dunbarbe220842009-03-20 16:06:39 +00006858 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006859 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006860
Daniel Dunbar6d484762010-07-22 01:47:22 +00006861 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006862 if (getToolChain().getArch() == llvm::Triple::x86 ||
6863 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006864 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6865 CmdArgs.push_back("-force_cpusubtype_ALL");
6866
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006867 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006868 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006869 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006870 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006871 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006872 CmdArgs.push_back("-static");
6873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006874 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006875
6876 assert(Output.isFilename() && "Unexpected lipo output.");
6877 CmdArgs.push_back("-o");
6878 CmdArgs.push_back(Output.getFilename());
6879
Daniel Dunbarb440f562010-08-02 02:38:21 +00006880 assert(Input.isFilename() && "Invalid input.");
6881 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006882
6883 // asm_final spec is empty.
6884
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006885 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006887}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006888
Tim Northover157d9112014-01-16 08:48:16 +00006889void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006890
Tim Northover157d9112014-01-16 08:48:16 +00006891void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6892 ArgStringList &CmdArgs) const {
6893 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006894
Daniel Dunbarc1964212009-03-26 16:23:12 +00006895 // Derived from darwin_arch spec.
6896 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006897 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006898
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006899 // FIXME: Is this needed anymore?
6900 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006901 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006902}
6903
Douglas Katzman95354292015-06-23 20:42:09 +00006904bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006905 // We only need to generate a temp path for LTO if we aren't compiling object
6906 // files. When compiling source files, we run 'dsymutil' after linking. We
6907 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006908 for (const auto &Input : Inputs)
6909 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006910 return true;
6911
6912 return false;
6913}
6914
Douglas Katzman95354292015-06-23 20:42:09 +00006915void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6916 ArgStringList &CmdArgs,
6917 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006918 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006919 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006921 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006922 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6923 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006924 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6925 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006926 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006927 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006928 }
6929
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006930 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006931 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006932 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6933 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006934
Bob Wilson3d27dad2013-08-02 22:25:34 +00006935 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6936 CmdArgs.push_back("-export_dynamic");
6937
Bob Wilsonb111ec92015-03-02 19:01:14 +00006938 // If we are using App Extension restrictions, pass a flag to the linker
6939 // telling it that the compiled code has been audited.
6940 if (Args.hasFlag(options::OPT_fapplication_extension,
6941 options::OPT_fno_application_extension, false))
6942 CmdArgs.push_back("-application_extension");
6943
Teresa Johnson945bc502015-10-15 20:35:53 +00006944 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006945 // If we are using LTO, then automatically create a temporary file path for
6946 // the linker to use, so that it's lifetime will extend past a possible
6947 // dsymutil step.
6948 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6949 const char *TmpPath = C.getArgs().MakeArgString(
6950 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6951 C.addTempFile(TmpPath);
6952 CmdArgs.push_back("-object_path_lto");
6953 CmdArgs.push_back(TmpPath);
6954 }
6955
6956 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6957 // it in clang installed libraries. If not found, the option is not used
6958 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6959 if (Version[0] >= 133) {
6960 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6961 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6962 SmallString<128> LibLTOPath(P);
6963 llvm::sys::path::append(LibLTOPath, "lib");
6964 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6965 if (llvm::sys::fs::exists(LibLTOPath)) {
6966 CmdArgs.push_back("-lto_library");
6967 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6968 } else {
6969 D.Diag(diag::warn_drv_lto_libpath);
6970 }
6971 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006972 }
6973
Daniel Dunbarc1964212009-03-26 16:23:12 +00006974 // Derived from the "link" spec.
6975 Args.AddAllArgs(CmdArgs, options::OPT_static);
6976 if (!Args.hasArg(options::OPT_static))
6977 CmdArgs.push_back("-dynamic");
6978 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6979 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6980 // here. How do we wish to handle such things?
6981 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006982
Daniel Dunbarc1964212009-03-26 16:23:12 +00006983 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006984 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006985 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006986 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006987
6988 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6989 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6990 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6991
6992 Arg *A;
6993 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6994 (A = Args.getLastArg(options::OPT_current__version)) ||
6995 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006996 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6997 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006998
6999 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7000 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7001 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7002 } else {
7003 CmdArgs.push_back("-dylib");
7004
7005 Arg *A;
7006 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7007 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7008 (A = Args.getLastArg(options::OPT_client__name)) ||
7009 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7010 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7011 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007012 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7013 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007014
Daniel Dunbarc1964212009-03-26 16:23:12 +00007015 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7016 "-dylib_compatibility_version");
7017 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7018 "-dylib_current_version");
7019
Tim Northover157d9112014-01-16 08:48:16 +00007020 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007021
7022 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7023 "-dylib_install_name");
7024 }
7025
7026 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7027 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7028 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007029 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007030 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007031 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7032 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7033 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7034 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7035 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7036 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007037 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007038 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7039 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7040 Args.AddAllArgs(CmdArgs, options::OPT_init);
7041
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007042 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007043 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007044
Daniel Dunbarc1964212009-03-26 16:23:12 +00007045 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7046 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7047 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7048 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7049 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007051 if (const Arg *A =
7052 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7053 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007054 if (A->getOption().matches(options::OPT_fpie) ||
7055 A->getOption().matches(options::OPT_fPIE))
7056 CmdArgs.push_back("-pie");
7057 else
7058 CmdArgs.push_back("-no_pie");
7059 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007060
7061 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7062 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7063 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7064 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7065 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7066 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7067 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7068 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7069 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7070 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7071 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7072 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7073 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7074 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7075 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7076 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007077
Daniel Dunbar84384642011-05-02 21:03:47 +00007078 // Give --sysroot= preference, over the Apple specific behavior to also use
7079 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007080 StringRef sysroot = C.getSysRoot();
7081 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007082 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007083 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007084 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7085 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007086 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007087 }
7088
Daniel Dunbarc1964212009-03-26 16:23:12 +00007089 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7090 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7091 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7092 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7093 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007094 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007095 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7096 Args.AddAllArgs(CmdArgs, options::OPT_y);
7097 Args.AddLastArg(CmdArgs, options::OPT_w);
7098 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7099 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7100 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7101 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7102 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7103 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7104 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7105 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7106 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7107 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7108 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7109 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7110}
7111
Douglas Katzman95354292015-06-23 20:42:09 +00007112void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7113 const InputInfo &Output,
7114 const InputInfoList &Inputs,
7115 const ArgList &Args,
7116 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007117 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007118
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007119 // If the number of arguments surpasses the system limits, we will encode the
7120 // input files in a separate file, shortening the command line. To this end,
7121 // build a list of input file names that can be passed via a file with the
7122 // -filelist linker option.
7123 llvm::opt::ArgStringList InputFileList;
7124
Daniel Dunbarc1964212009-03-26 16:23:12 +00007125 // The logic here is derived from gcc's behavior; most of which
7126 // comes from specs (starting with link_command). Consult gcc for
7127 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007128 ArgStringList CmdArgs;
7129
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007130 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7131 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7132 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007133 for (const auto &Arg : Args)
7134 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007135 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007136 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007137 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007138 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007139 return;
7140 }
7141
Daniel Dunbarc1964212009-03-26 16:23:12 +00007142 // I'm not sure why this particular decomposition exists in gcc, but
7143 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007144 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007145
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007146 // It seems that the 'e' option is completely ignored for dynamic executables
7147 // (the default), and with static executables, the last one wins, as expected.
7148 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7149 options::OPT_Z_Flag, options::OPT_u_Group,
7150 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007151
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007152 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7153 // members of static archive libraries which implement Objective-C classes or
7154 // categories.
7155 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7156 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007157
Daniel Dunbarc1964212009-03-26 16:23:12 +00007158 CmdArgs.push_back("-o");
7159 CmdArgs.push_back(Output.getFilename());
7160
Douglas Katzman78b37b02015-11-17 20:28:07 +00007161 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007162 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007163
Peter Collingbournec4122c12015-06-15 21:08:13 +00007164 // SafeStack requires its own runtime libraries
7165 // These libraries should be linked first, to make sure the
7166 // __safestack_init constructor executes before everything else
7167 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7168 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7169 "libclang_rt.safestack_osx.a",
7170 /*AlwaysLink=*/true);
7171 }
7172
Daniel Dunbarc1964212009-03-26 16:23:12 +00007173 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007174
Douglas Gregor9295df02012-05-15 21:00:27 +00007175 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007176 // Build the input file for -filelist (list of linker input files) in case we
7177 // need it later
7178 for (const auto &II : Inputs) {
7179 if (!II.isFilename()) {
7180 // This is a linker input argument.
7181 // We cannot mix input arguments and file names in a -filelist input, thus
7182 // we prematurely stop our list (remaining files shall be passed as
7183 // arguments).
7184 if (InputFileList.size() > 0)
7185 break;
7186
7187 continue;
7188 }
7189
7190 InputFileList.push_back(II.getFilename());
7191 }
7192
Douglas Katzman78b37b02015-11-17 20:28:07 +00007193 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007194 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7195
Douglas Katzman78b37b02015-11-17 20:28:07 +00007196 if (isObjCRuntimeLinked(Args) &&
7197 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007198 // We use arclite library for both ARC and subscripting support.
7199 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7200
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007201 CmdArgs.push_back("-framework");
7202 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007203 // Link libobj.
7204 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007205 }
John McCall31168b02011-06-15 23:02:42 +00007206
Daniel Dunbarc1964212009-03-26 16:23:12 +00007207 if (LinkingOutput) {
7208 CmdArgs.push_back("-arch_multiple");
7209 CmdArgs.push_back("-final_output");
7210 CmdArgs.push_back(LinkingOutput);
7211 }
7212
Daniel Dunbarc1964212009-03-26 16:23:12 +00007213 if (Args.hasArg(options::OPT_fnested_functions))
7214 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007215
Justin Bognerc7701242015-05-12 05:44:36 +00007216 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7217
Douglas Katzman78b37b02015-11-17 20:28:07 +00007218 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007219 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007220 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007221
Daniel Dunbarc1964212009-03-26 16:23:12 +00007222 // link_ssp spec is empty.
7223
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007224 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007225 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007226 }
7227
Douglas Katzman78b37b02015-11-17 20:28:07 +00007228 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007229 // endfile_spec is empty.
7230 }
7231
7232 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7233 Args.AddAllArgs(CmdArgs, options::OPT_F);
7234
Steven Wu3ffb61b2015-02-06 18:08:29 +00007235 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007236 for (const Arg *A : Args.filtered(options::OPT_iframework))
7237 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007238
Douglas Katzman78b37b02015-11-17 20:28:07 +00007239 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007240 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7241 if (A->getValue() == StringRef("Accelerate")) {
7242 CmdArgs.push_back("-framework");
7243 CmdArgs.push_back("Accelerate");
7244 }
7245 }
7246 }
7247
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007248 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007249 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007250 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007251 Cmd->setInputFileList(std::move(InputFileList));
7252 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007253}
7254
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007255void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007256 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007257 const InputInfoList &Inputs,
7258 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007259 const char *LinkingOutput) const {
7260 ArgStringList CmdArgs;
7261
7262 CmdArgs.push_back("-create");
7263 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007264
7265 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007266 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007267
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007268 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007269 assert(II.isFilename() && "Unexpected lipo input.");
7270 CmdArgs.push_back(II.getFilename());
7271 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007272
7273 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007275}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007276
Daniel Dunbar88299622010-06-04 18:28:36 +00007277void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007278 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007279 const InputInfoList &Inputs,
7280 const ArgList &Args,
7281 const char *LinkingOutput) const {
7282 ArgStringList CmdArgs;
7283
Daniel Dunbareb86b042011-05-09 17:23:16 +00007284 CmdArgs.push_back("-o");
7285 CmdArgs.push_back(Output.getFilename());
7286
Daniel Dunbar88299622010-06-04 18:28:36 +00007287 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7288 const InputInfo &Input = Inputs[0];
7289 assert(Input.isFilename() && "Unexpected dsymutil input.");
7290 CmdArgs.push_back(Input.getFilename());
7291
Daniel Dunbar88299622010-06-04 18:28:36 +00007292 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007293 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007294 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007295}
7296
Eric Christopher551ef452011-08-23 17:56:55 +00007297void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007298 const InputInfo &Output,
7299 const InputInfoList &Inputs,
7300 const ArgList &Args,
7301 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007302 ArgStringList CmdArgs;
7303 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007304 CmdArgs.push_back("--debug-info");
7305 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007306 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007307
7308 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7309 const InputInfo &Input = Inputs[0];
7310 assert(Input.isFilename() && "Unexpected verify input");
7311
7312 // Grabbing the output of the earlier dsymutil run.
7313 CmdArgs.push_back(Input.getFilename());
7314
7315 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007316 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007317 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007318}
7319
Douglas Katzman95354292015-06-23 20:42:09 +00007320void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007321 const InputInfo &Output,
7322 const InputInfoList &Inputs,
7323 const ArgList &Args,
7324 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007325 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007326 ArgStringList CmdArgs;
7327
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007328 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007329
7330 CmdArgs.push_back("-o");
7331 CmdArgs.push_back(Output.getFilename());
7332
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007333 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007334 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007335
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007336 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007337 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007338}
7339
Douglas Katzman95354292015-06-23 20:42:09 +00007340void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7341 const InputInfo &Output,
7342 const InputInfoList &Inputs,
7343 const ArgList &Args,
7344 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007345 ArgStringList CmdArgs;
7346
David Chisnall272a0712012-02-29 15:06:12 +00007347 // Demangle C++ names in errors
7348 CmdArgs.push_back("-C");
7349
Douglas Katzman78b37b02015-11-17 20:28:07 +00007350 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007351 CmdArgs.push_back("-e");
7352 CmdArgs.push_back("_start");
7353 }
7354
7355 if (Args.hasArg(options::OPT_static)) {
7356 CmdArgs.push_back("-Bstatic");
7357 CmdArgs.push_back("-dn");
7358 } else {
7359 CmdArgs.push_back("-Bdynamic");
7360 if (Args.hasArg(options::OPT_shared)) {
7361 CmdArgs.push_back("-shared");
7362 } else {
7363 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007364 CmdArgs.push_back(
7365 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007366 }
7367 }
7368
7369 if (Output.isFilename()) {
7370 CmdArgs.push_back("-o");
7371 CmdArgs.push_back(Output.getFilename());
7372 } else {
7373 assert(Output.isNothing() && "Invalid output.");
7374 }
7375
Douglas Katzman78b37b02015-11-17 20:28:07 +00007376 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007377 if (!Args.hasArg(options::OPT_shared))
7378 CmdArgs.push_back(
7379 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7380
7381 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7382 CmdArgs.push_back(
7383 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7384 CmdArgs.push_back(
7385 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007386 }
7387
Douglas Katzman6059ef92015-11-17 17:41:23 +00007388 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007389
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007390 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7391 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007392
7393 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7394
Douglas Katzman78b37b02015-11-17 20:28:07 +00007395 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007396 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007397 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007398 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007399 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007400 if (!Args.hasArg(options::OPT_shared)) {
7401 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007402 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007403 }
David Chisnallf571cde2012-02-15 13:39:01 +00007404 }
7405
Douglas Katzman78b37b02015-11-17 20:28:07 +00007406 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007407 CmdArgs.push_back(
7408 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007409 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007410 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007411
Xinliang David Li69306c02015-10-22 06:15:31 +00007412 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007413
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007414 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007416}
7417
Douglas Katzman95354292015-06-23 20:42:09 +00007418void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7419 const InputInfo &Output,
7420 const InputInfoList &Inputs,
7421 const ArgList &Args,
7422 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007423 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007424 ArgStringList CmdArgs;
7425
Rafael Espindolacc126272014-02-28 01:55:21 +00007426 switch (getToolChain().getArch()) {
7427 case llvm::Triple::x86:
7428 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7429 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007430 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007431 break;
7432
7433 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007434 CmdArgs.push_back("-mppc");
7435 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007436 break;
7437
7438 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007439 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007440 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007441 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7442 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7443 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007444 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007445 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007446
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007447 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007448 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007449 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7450 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7451 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007452 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007453 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007454
7455 case llvm::Triple::mips64:
7456 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007457 StringRef CPUName;
7458 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007459 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007460
7461 CmdArgs.push_back("-mabi");
7462 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7463
7464 if (getToolChain().getArch() == llvm::Triple::mips64)
7465 CmdArgs.push_back("-EB");
7466 else
7467 CmdArgs.push_back("-EL");
7468
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007469 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007470 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007471 }
7472
Rafael Espindolacc126272014-02-28 01:55:21 +00007473 default:
7474 break;
7475 }
7476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007477 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007478
7479 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007480 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007481
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007482 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007483 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007484
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007485 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007486 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007487}
7488
Douglas Katzman95354292015-06-23 20:42:09 +00007489void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7490 const InputInfo &Output,
7491 const InputInfoList &Inputs,
7492 const ArgList &Args,
7493 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007494 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007495 ArgStringList CmdArgs;
7496
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007497 // Silence warning for "clang -g foo.o -o foo"
7498 Args.ClaimAllArgs(options::OPT_g_Group);
7499 // and "clang -emit-llvm foo.o -o foo"
7500 Args.ClaimAllArgs(options::OPT_emit_llvm);
7501 // and for "clang -w foo.o -o foo". Other warning options are already
7502 // handled somewhere else.
7503 Args.ClaimAllArgs(options::OPT_w);
7504
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007505 if (getToolChain().getArch() == llvm::Triple::mips64)
7506 CmdArgs.push_back("-EB");
7507 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7508 CmdArgs.push_back("-EL");
7509
Douglas Katzman78b37b02015-11-17 20:28:07 +00007510 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007511 CmdArgs.push_back("-e");
7512 CmdArgs.push_back("__start");
7513 }
7514
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007515 if (Args.hasArg(options::OPT_static)) {
7516 CmdArgs.push_back("-Bstatic");
7517 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007518 if (Args.hasArg(options::OPT_rdynamic))
7519 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007520 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007521 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007522 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007523 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007524 } else {
7525 CmdArgs.push_back("-dynamic-linker");
7526 CmdArgs.push_back("/usr/libexec/ld.so");
7527 }
7528 }
7529
Rafael Espindola044f7832013-06-05 04:28:55 +00007530 if (Args.hasArg(options::OPT_nopie))
7531 CmdArgs.push_back("-nopie");
7532
Daniel Dunbarb440f562010-08-02 02:38:21 +00007533 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007534 CmdArgs.push_back("-o");
7535 CmdArgs.push_back(Output.getFilename());
7536 } else {
7537 assert(Output.isNothing() && "Invalid output.");
7538 }
7539
Douglas Katzman78b37b02015-11-17 20:28:07 +00007540 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007541 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007542 if (Args.hasArg(options::OPT_pg))
7543 CmdArgs.push_back(
7544 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007545 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007546 CmdArgs.push_back(
7547 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7548 CmdArgs.push_back(
7549 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007550 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007551 CmdArgs.push_back(
7552 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007553 }
7554 }
7555
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007556 std::string Triple = getToolChain().getTripleString();
7557 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007558 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007559 CmdArgs.push_back(
7560 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007561
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007562 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7563 options::OPT_e, options::OPT_s, options::OPT_t,
7564 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007565
Daniel Dunbar54423b22010-09-17 00:24:54 +00007566 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007567
Douglas Katzman78b37b02015-11-17 20:28:07 +00007568 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007569 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007570 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007571 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007572 CmdArgs.push_back("-lm_p");
7573 else
7574 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007575 }
7576
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007577 // FIXME: For some reason GCC passes -lgcc before adding
7578 // the default system libraries. Just mimic this for now.
7579 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007580
Eric Christopher17674ec2012-09-13 06:32:34 +00007581 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007582 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7583 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007584 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007585 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007586 }
7587
Chandler Carruth45661652011-12-17 22:32:42 +00007588 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007589 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007590 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007591 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007592 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007593 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007594
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007595 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007596 }
7597
Douglas Katzman78b37b02015-11-17 20:28:07 +00007598 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007599 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007600 CmdArgs.push_back(
7601 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007602 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007603 CmdArgs.push_back(
7604 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007605 }
7606
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007607 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007608 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007609}
Ed Schoutene33194b2009-04-02 19:13:12 +00007610
Douglas Katzman95354292015-06-23 20:42:09 +00007611void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7612 const InputInfo &Output,
7613 const InputInfoList &Inputs,
7614 const ArgList &Args,
7615 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007616 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007617 ArgStringList CmdArgs;
7618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007620
7621 CmdArgs.push_back("-o");
7622 CmdArgs.push_back(Output.getFilename());
7623
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007624 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007625 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007627 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007628 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007629}
7630
Douglas Katzman95354292015-06-23 20:42:09 +00007631void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7632 const InputInfo &Output,
7633 const InputInfoList &Inputs,
7634 const ArgList &Args,
7635 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007636 const Driver &D = getToolChain().getDriver();
7637 ArgStringList CmdArgs;
7638
Douglas Katzman78b37b02015-11-17 20:28:07 +00007639 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007640 CmdArgs.push_back("-e");
7641 CmdArgs.push_back("__start");
7642 }
7643
7644 if (Args.hasArg(options::OPT_static)) {
7645 CmdArgs.push_back("-Bstatic");
7646 } else {
7647 if (Args.hasArg(options::OPT_rdynamic))
7648 CmdArgs.push_back("-export-dynamic");
7649 CmdArgs.push_back("--eh-frame-hdr");
7650 CmdArgs.push_back("-Bdynamic");
7651 if (Args.hasArg(options::OPT_shared)) {
7652 CmdArgs.push_back("-shared");
7653 } else {
7654 CmdArgs.push_back("-dynamic-linker");
7655 CmdArgs.push_back("/usr/libexec/ld.so");
7656 }
7657 }
7658
7659 if (Output.isFilename()) {
7660 CmdArgs.push_back("-o");
7661 CmdArgs.push_back(Output.getFilename());
7662 } else {
7663 assert(Output.isNothing() && "Invalid output.");
7664 }
7665
Douglas Katzman78b37b02015-11-17 20:28:07 +00007666 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007667 if (!Args.hasArg(options::OPT_shared)) {
7668 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007669 CmdArgs.push_back(
7670 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007671 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7674 CmdArgs.push_back(
7675 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007676 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007677 CmdArgs.push_back(
7678 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007679 }
7680 }
7681
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007682 Args.AddAllArgs(CmdArgs,
7683 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007684
7685 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7686
Douglas Katzman78b37b02015-11-17 20:28:07 +00007687 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007688 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007689 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7690 if (Args.hasArg(options::OPT_pg))
7691 CmdArgs.push_back("-lm_p");
7692 else
7693 CmdArgs.push_back("-lm");
7694 }
7695
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007696 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007697 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007698 CmdArgs.push_back("-lpthread_p");
7699 else
7700 CmdArgs.push_back("-lpthread");
7701 }
7702
Eli Friedman9fa28852012-08-08 23:57:20 +00007703 if (!Args.hasArg(options::OPT_shared)) {
7704 if (Args.hasArg(options::OPT_pg))
7705 CmdArgs.push_back("-lc_p");
7706 else
7707 CmdArgs.push_back("-lc");
7708 }
7709
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007710 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007711 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007712 case llvm::Triple::arm:
7713 MyArch = "arm";
7714 break;
7715 case llvm::Triple::x86:
7716 MyArch = "i386";
7717 break;
7718 case llvm::Triple::x86_64:
7719 MyArch = "amd64";
7720 break;
7721 default:
7722 llvm_unreachable("Unsupported architecture");
7723 }
7724 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007725 }
7726
Douglas Katzman78b37b02015-11-17 20:28:07 +00007727 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007728 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007729 CmdArgs.push_back(
7730 Args.MakeArgString(getToolChain().GetFilePath("crtend.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("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007734 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007735
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007736 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007737 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007738}
7739
Douglas Katzman95354292015-06-23 20:42:09 +00007740void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7741 const InputInfo &Output,
7742 const InputInfoList &Inputs,
7743 const ArgList &Args,
7744 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007745 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007746 ArgStringList CmdArgs;
7747
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007748 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7749 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007750 switch (getToolChain().getArch()) {
7751 default:
7752 break;
7753 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007754 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007755 break;
7756 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007757 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007758 break;
7759 case llvm::Triple::mips:
7760 case llvm::Triple::mipsel:
7761 case llvm::Triple::mips64:
7762 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007763 StringRef CPUName;
7764 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007765 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007766
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007767 CmdArgs.push_back("-march");
7768 CmdArgs.push_back(CPUName.data());
7769
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007770 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007771 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007772
7773 if (getToolChain().getArch() == llvm::Triple::mips ||
7774 getToolChain().getArch() == llvm::Triple::mips64)
7775 CmdArgs.push_back("-EB");
7776 else
7777 CmdArgs.push_back("-EL");
7778
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007779 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007780 break;
7781 }
7782 case llvm::Triple::arm:
7783 case llvm::Triple::armeb:
7784 case llvm::Triple::thumb:
7785 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007786 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007787
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007788 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007789 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007790 else
Renato Golinf4421f72014-02-19 10:44:07 +00007791 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007794 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007795 case llvm::Triple::GNUEABI:
7796 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007797 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007798 break;
7799
7800 default:
7801 CmdArgs.push_back("-matpcs");
7802 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007803 break;
7804 }
7805 case llvm::Triple::sparc:
7806 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007807 case llvm::Triple::sparcv9: {
7808 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7809 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007810 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007811 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007812 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007813 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007814
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007815 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007816
7817 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007818 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007820 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007821 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007822
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007825}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007826
Douglas Katzman95354292015-06-23 20:42:09 +00007827void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007832 const toolchains::FreeBSD &ToolChain =
7833 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007834 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007835 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007836 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007837 !Args.hasArg(options::OPT_shared) &&
7838 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007839 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007840
7841 // Silence warning for "clang -g foo.o -o foo"
7842 Args.ClaimAllArgs(options::OPT_g_Group);
7843 // and "clang -emit-llvm foo.o -o foo"
7844 Args.ClaimAllArgs(options::OPT_emit_llvm);
7845 // and for "clang -w foo.o -o foo". Other warning options are already
7846 // handled somewhere else.
7847 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007848
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007849 if (!D.SysRoot.empty())
7850 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7851
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007852 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007853 CmdArgs.push_back("-pie");
7854
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007855 if (Args.hasArg(options::OPT_static)) {
7856 CmdArgs.push_back("-Bstatic");
7857 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007858 if (Args.hasArg(options::OPT_rdynamic))
7859 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007860 CmdArgs.push_back("--eh-frame-hdr");
7861 if (Args.hasArg(options::OPT_shared)) {
7862 CmdArgs.push_back("-Bshareable");
7863 } else {
7864 CmdArgs.push_back("-dynamic-linker");
7865 CmdArgs.push_back("/libexec/ld-elf.so.1");
7866 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007867 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007868 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7869 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7870 CmdArgs.push_back("--hash-style=both");
7871 }
7872 }
7873 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007874 }
7875
7876 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7877 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007878 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007879 CmdArgs.push_back("-m");
7880 CmdArgs.push_back("elf_i386_fbsd");
7881 }
7882
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007883 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007884 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007885 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007886 }
7887
Dimitry Andric904895f2015-12-27 06:47:09 +00007888 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7889 if (ToolChain.getArch() == llvm::Triple::mips ||
7890 ToolChain.getArch() == llvm::Triple::mipsel ||
7891 ToolChain.getArch() == llvm::Triple::mips64 ||
7892 ToolChain.getArch() == llvm::Triple::mips64el) {
7893 StringRef v = A->getValue();
7894 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7895 A->claim();
7896 }
7897 }
7898
Daniel Dunbarb440f562010-08-02 02:38:21 +00007899 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007900 CmdArgs.push_back("-o");
7901 CmdArgs.push_back(Output.getFilename());
7902 } else {
7903 assert(Output.isNothing() && "Invalid output.");
7904 }
7905
Douglas Katzman78b37b02015-11-17 20:28:07 +00007906 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007907 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007908 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007909 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007910 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007911 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007912 crt1 = "Scrt1.o";
7913 else
7914 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007915 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007916 if (crt1)
7917 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7918
7919 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7920
Craig Topper92fc2df2014-05-17 16:56:41 +00007921 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007922 if (Args.hasArg(options::OPT_static))
7923 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007924 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007925 crtbegin = "crtbeginS.o";
7926 else
7927 crtbegin = "crtbegin.o";
7928
7929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007930 }
7931
7932 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007933 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7935 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007936 Args.AddAllArgs(CmdArgs, options::OPT_s);
7937 Args.AddAllArgs(CmdArgs, options::OPT_t);
7938 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7939 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007940
Teresa Johnson945bc502015-10-15 20:35:53 +00007941 if (D.isUsingLTO())
7942 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007943
Alexey Samsonov52550342014-09-15 19:58:40 +00007944 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007945 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007946
Douglas Katzman78b37b02015-11-17 20:28:07 +00007947 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007948 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007949 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007950 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007951 if (Args.hasArg(options::OPT_pg))
7952 CmdArgs.push_back("-lm_p");
7953 else
7954 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007955 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007956 if (NeedsSanitizerDeps)
7957 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007958 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7959 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007960 if (Args.hasArg(options::OPT_pg))
7961 CmdArgs.push_back("-lgcc_p");
7962 else
7963 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007964 if (Args.hasArg(options::OPT_static)) {
7965 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007966 } else if (Args.hasArg(options::OPT_pg)) {
7967 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007968 } else {
7969 CmdArgs.push_back("--as-needed");
7970 CmdArgs.push_back("-lgcc_s");
7971 CmdArgs.push_back("--no-as-needed");
7972 }
7973
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007974 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007975 if (Args.hasArg(options::OPT_pg))
7976 CmdArgs.push_back("-lpthread_p");
7977 else
7978 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007979 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007980
Roman Divacky66f22762011-02-10 16:59:40 +00007981 if (Args.hasArg(options::OPT_pg)) {
7982 if (Args.hasArg(options::OPT_shared))
7983 CmdArgs.push_back("-lc");
7984 else
7985 CmdArgs.push_back("-lc_p");
7986 CmdArgs.push_back("-lgcc_p");
7987 } else {
7988 CmdArgs.push_back("-lc");
7989 CmdArgs.push_back("-lgcc");
7990 }
7991
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007992 if (Args.hasArg(options::OPT_static)) {
7993 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007994 } else if (Args.hasArg(options::OPT_pg)) {
7995 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007996 } else {
7997 CmdArgs.push_back("--as-needed");
7998 CmdArgs.push_back("-lgcc_s");
7999 CmdArgs.push_back("--no-as-needed");
8000 }
8001 }
8002
Douglas Katzman78b37b02015-11-17 20:28:07 +00008003 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008004 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008005 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008006 else
8007 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008008 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008009 }
8010
Xinliang David Li69306c02015-10-22 06:15:31 +00008011 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008012
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008013 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008015}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008016
Douglas Katzman95354292015-06-23 20:42:09 +00008017void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008018 const InputInfo &Output,
8019 const InputInfoList &Inputs,
8020 const ArgList &Args,
8021 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008022 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008023 ArgStringList CmdArgs;
8024
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008025 // GNU as needs different flags for creating the correct output format
8026 // on architectures with different ABIs or optional feature sets.
8027 switch (getToolChain().getArch()) {
8028 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008029 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008030 break;
8031 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008032 case llvm::Triple::armeb:
8033 case llvm::Triple::thumb:
8034 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008035 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008036 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8037 std::string Arch =
8038 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008039 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008040 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008041 }
8042
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008043 case llvm::Triple::mips:
8044 case llvm::Triple::mipsel:
8045 case llvm::Triple::mips64:
8046 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008047 StringRef CPUName;
8048 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008049 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008050
8051 CmdArgs.push_back("-march");
8052 CmdArgs.push_back(CPUName.data());
8053
8054 CmdArgs.push_back("-mabi");
8055 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8056
8057 if (getToolChain().getArch() == llvm::Triple::mips ||
8058 getToolChain().getArch() == llvm::Triple::mips64)
8059 CmdArgs.push_back("-EB");
8060 else
8061 CmdArgs.push_back("-EL");
8062
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008063 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008064 break;
8065 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008066
8067 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008068 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008069 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008070 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8071 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008072 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008073 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008074 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008075
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008076 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008077 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008078 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8079 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008080 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008081 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008082 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008083
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008084 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008085 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008086 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008087
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008088 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008089
8090 CmdArgs.push_back("-o");
8091 CmdArgs.push_back(Output.getFilename());
8092
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008093 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008094 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008095
David Chisnallddbd68f2011-09-27 22:03:18 +00008096 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008097 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008098}
8099
Douglas Katzman95354292015-06-23 20:42:09 +00008100void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8101 const InputInfo &Output,
8102 const InputInfoList &Inputs,
8103 const ArgList &Args,
8104 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008105 const Driver &D = getToolChain().getDriver();
8106 ArgStringList CmdArgs;
8107
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008108 if (!D.SysRoot.empty())
8109 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8110
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008111 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008112 if (Args.hasArg(options::OPT_static)) {
8113 CmdArgs.push_back("-Bstatic");
8114 } else {
8115 if (Args.hasArg(options::OPT_rdynamic))
8116 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008117 if (Args.hasArg(options::OPT_shared)) {
8118 CmdArgs.push_back("-Bshareable");
8119 } else {
8120 CmdArgs.push_back("-dynamic-linker");
8121 CmdArgs.push_back("/libexec/ld.elf_so");
8122 }
8123 }
8124
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008125 // Many NetBSD architectures support more than one ABI.
8126 // Determine the correct emulation for ld.
8127 switch (getToolChain().getArch()) {
8128 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008129 CmdArgs.push_back("-m");
8130 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008131 break;
8132 case llvm::Triple::arm:
8133 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008134 CmdArgs.push_back("-m");
8135 switch (getToolChain().getTriple().getEnvironment()) {
8136 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008137 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008138 CmdArgs.push_back("armelf_nbsd_eabi");
8139 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008140 case llvm::Triple::EABIHF:
8141 case llvm::Triple::GNUEABIHF:
8142 CmdArgs.push_back("armelf_nbsd_eabihf");
8143 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008144 default:
8145 CmdArgs.push_back("armelf_nbsd");
8146 break;
8147 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008148 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008149 case llvm::Triple::armeb:
8150 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008151 arm::appendEBLinkFlags(
8152 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008153 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008154 CmdArgs.push_back("-m");
8155 switch (getToolChain().getTriple().getEnvironment()) {
8156 case llvm::Triple::EABI:
8157 case llvm::Triple::GNUEABI:
8158 CmdArgs.push_back("armelfb_nbsd_eabi");
8159 break;
8160 case llvm::Triple::EABIHF:
8161 case llvm::Triple::GNUEABIHF:
8162 CmdArgs.push_back("armelfb_nbsd_eabihf");
8163 break;
8164 default:
8165 CmdArgs.push_back("armelfb_nbsd");
8166 break;
8167 }
8168 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008169 case llvm::Triple::mips64:
8170 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008171 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008172 CmdArgs.push_back("-m");
8173 if (getToolChain().getArch() == llvm::Triple::mips64)
8174 CmdArgs.push_back("elf32btsmip");
8175 else
8176 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008177 } else if (mips::hasMipsAbiArg(Args, "64")) {
8178 CmdArgs.push_back("-m");
8179 if (getToolChain().getArch() == llvm::Triple::mips64)
8180 CmdArgs.push_back("elf64btsmip");
8181 else
8182 CmdArgs.push_back("elf64ltsmip");
8183 }
8184 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008185 case llvm::Triple::ppc:
8186 CmdArgs.push_back("-m");
8187 CmdArgs.push_back("elf32ppc_nbsd");
8188 break;
8189
8190 case llvm::Triple::ppc64:
8191 case llvm::Triple::ppc64le:
8192 CmdArgs.push_back("-m");
8193 CmdArgs.push_back("elf64ppc");
8194 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008195
8196 case llvm::Triple::sparc:
8197 CmdArgs.push_back("-m");
8198 CmdArgs.push_back("elf32_sparc");
8199 break;
8200
8201 case llvm::Triple::sparcv9:
8202 CmdArgs.push_back("-m");
8203 CmdArgs.push_back("elf64_sparc");
8204 break;
8205
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008206 default:
8207 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008208 }
8209
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008210 if (Output.isFilename()) {
8211 CmdArgs.push_back("-o");
8212 CmdArgs.push_back(Output.getFilename());
8213 } else {
8214 assert(Output.isNothing() && "Invalid output.");
8215 }
8216
Douglas Katzman78b37b02015-11-17 20:28:07 +00008217 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008218 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008219 CmdArgs.push_back(
8220 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8221 CmdArgs.push_back(
8222 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8223 CmdArgs.push_back(
8224 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008225 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008226 CmdArgs.push_back(
8227 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8228 CmdArgs.push_back(
8229 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008230 }
8231 }
8232
8233 Args.AddAllArgs(CmdArgs, options::OPT_L);
8234 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8235 Args.AddAllArgs(CmdArgs, options::OPT_e);
8236 Args.AddAllArgs(CmdArgs, options::OPT_s);
8237 Args.AddAllArgs(CmdArgs, options::OPT_t);
8238 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8239 Args.AddAllArgs(CmdArgs, options::OPT_r);
8240
8241 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8242
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008243 unsigned Major, Minor, Micro;
8244 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8245 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008246 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008247 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008248 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008249 case llvm::Triple::arm:
8250 case llvm::Triple::armeb:
8251 case llvm::Triple::thumb:
8252 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008253 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008254 case llvm::Triple::ppc64:
8255 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008256 case llvm::Triple::x86:
8257 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008258 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008259 break;
8260 default:
8261 break;
8262 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008263 }
8264
Douglas Katzman78b37b02015-11-17 20:28:07 +00008265 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008266 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008267 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008268 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8269 CmdArgs.push_back("-lm");
8270 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008271 if (Args.hasArg(options::OPT_pthread))
8272 CmdArgs.push_back("-lpthread");
8273 CmdArgs.push_back("-lc");
8274
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008275 if (useLibgcc) {
8276 if (Args.hasArg(options::OPT_static)) {
8277 // libgcc_eh depends on libc, so resolve as much as possible,
8278 // pull in any new requirements from libc and then get the rest
8279 // of libgcc.
8280 CmdArgs.push_back("-lgcc_eh");
8281 CmdArgs.push_back("-lc");
8282 CmdArgs.push_back("-lgcc");
8283 } else {
8284 CmdArgs.push_back("-lgcc");
8285 CmdArgs.push_back("--as-needed");
8286 CmdArgs.push_back("-lgcc_s");
8287 CmdArgs.push_back("--no-as-needed");
8288 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008289 }
8290 }
8291
Douglas Katzman78b37b02015-11-17 20:28:07 +00008292 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008293 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008294 CmdArgs.push_back(
8295 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008296 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008297 CmdArgs.push_back(
8298 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8299 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008300 }
8301
Xinliang David Li69306c02015-10-22 06:15:31 +00008302 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008303
Logan Chieneb9162f2014-06-26 14:23:45 +00008304 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008305 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008306}
8307
Douglas Katzman95354292015-06-23 20:42:09 +00008308void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8309 const InputInfo &Output,
8310 const InputInfoList &Inputs,
8311 const ArgList &Args,
8312 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008313 claimNoWarnArgs(Args);
8314
James Y Knight2db38f32015-08-15 03:45:25 +00008315 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8316 llvm::Triple Triple = llvm::Triple(TripleStr);
8317
Rafael Espindola92b00932010-08-10 00:25:48 +00008318 ArgStringList CmdArgs;
8319
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008320 llvm::Reloc::Model RelocationModel;
8321 unsigned PICLevel;
8322 bool IsPIE;
8323 std::tie(RelocationModel, PICLevel, IsPIE) =
8324 ParsePICArgs(getToolChain(), Triple, Args);
8325
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008326 switch (getToolChain().getArch()) {
8327 default:
8328 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008329 // Add --32/--64 to make sure we get the format we want.
8330 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008331 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008332 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008333 break;
8334 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008335 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8336 CmdArgs.push_back("--x32");
8337 else
8338 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008339 break;
8340 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008341 CmdArgs.push_back("-a32");
8342 CmdArgs.push_back("-mppc");
8343 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008344 break;
8345 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008346 CmdArgs.push_back("-a64");
8347 CmdArgs.push_back("-mppc64");
8348 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008349 break;
8350 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008351 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008352 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008353 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008354 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008355 break;
8356 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008357 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008358 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008359 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8360 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8361 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008362 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008363 }
8364 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008365 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008366 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8367 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8368 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008369 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008370 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008371 case llvm::Triple::arm:
8372 case llvm::Triple::armeb:
8373 case llvm::Triple::thumb:
8374 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008375 const llvm::Triple &Triple2 = getToolChain().getTriple();
8376 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008377 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008378 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008379 break;
8380 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008381 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008382 break;
8383 default:
8384 break;
8385 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008386
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008387 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008388 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8389 case arm::FloatABI::Soft:
8390 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8391 break;
8392 case arm::FloatABI::SoftFP:
8393 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8394 break;
8395 case arm::FloatABI::Hard:
8396 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8397 break;
8398 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008399
8400 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008401
8402 // FIXME: remove krait check when GNU tools support krait cpu
8403 // for now replace it with -march=armv7-a to avoid a lower
8404 // march from being picked in the absence of a cpu flag.
8405 Arg *A;
8406 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008407 StringRef(A->getValue()).lower() == "krait")
8408 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008409 else
8410 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008411 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008412 break;
8413 }
8414 case llvm::Triple::mips:
8415 case llvm::Triple::mipsel:
8416 case llvm::Triple::mips64:
8417 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008418 StringRef CPUName;
8419 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008420 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008421 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008422
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008423 CmdArgs.push_back("-march");
8424 CmdArgs.push_back(CPUName.data());
8425
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008426 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008427 CmdArgs.push_back(ABIName.data());
8428
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008429 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8430 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008431 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008432 CmdArgs.push_back("-mno-shared");
8433
Daniel Sanders379d44b2014-07-16 11:52:23 +00008434 // LLVM doesn't support -mplt yet and acts as if it is always given.
8435 // However, -mplt has no effect with the N64 ABI.
8436 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008437
8438 if (getToolChain().getArch() == llvm::Triple::mips ||
8439 getToolChain().getArch() == llvm::Triple::mips64)
8440 CmdArgs.push_back("-EB");
8441 else
8442 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008443
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008444 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8445 if (StringRef(A->getValue()) == "2008")
8446 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8447 }
8448
Daniel Sanders379d44b2014-07-16 11:52:23 +00008449 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8450 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8451 options::OPT_mfp64)) {
8452 A->claim();
8453 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008454 } else if (mips::shouldUseFPXX(
8455 Args, getToolChain().getTriple(), CPUName, ABIName,
8456 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008457 CmdArgs.push_back("-mfpxx");
8458
8459 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8460 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008461 if (Arg *A =
8462 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008463 if (A->getOption().matches(options::OPT_mips16)) {
8464 A->claim();
8465 A->render(Args, CmdArgs);
8466 } else {
8467 A->claim();
8468 CmdArgs.push_back("-no-mips16");
8469 }
8470 }
8471
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008472 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8473 options::OPT_mno_micromips);
8474 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8475 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8476
Simon Atanasyanbd986632013-11-26 11:58:04 +00008477 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8478 // Do not use AddLastArg because not all versions of MIPS assembler
8479 // support -mmsa / -mno-msa options.
8480 if (A->getOption().matches(options::OPT_mmsa))
8481 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8482 }
8483
Daniel Sanders379d44b2014-07-16 11:52:23 +00008484 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8485 options::OPT_msoft_float);
8486
Toma Tabacub36d6102015-06-11 12:13:18 +00008487 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8488 options::OPT_msingle_float);
8489
Daniel Sanders379d44b2014-07-16 11:52:23 +00008490 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8491 options::OPT_mno_odd_spreg);
8492
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008493 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008494 break;
8495 }
8496 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008497 // Always pass an -march option, since our default of z10 is later
8498 // than the GNU assembler's default.
8499 StringRef CPUName = getSystemZTargetCPU(Args);
8500 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008501 break;
8502 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008503 }
8504
Renato Golina74bbc72015-07-22 15:32:36 +00008505 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008506 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008507
8508 CmdArgs.push_back("-o");
8509 CmdArgs.push_back(Output.getFilename());
8510
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008511 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008512 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008513
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008514 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008515 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008516
8517 // Handle the debug info splitting at object creation time if we're
8518 // creating an object.
8519 // TODO: Currently only works on linux with newer objcopy.
8520 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008521 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008522 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008523 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008524}
8525
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008526static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008527 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008528 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008529 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008530 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8531 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008532 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008533 CmdArgs.push_back("-lgcc");
8534
Logan Chien3d3373c2012-11-19 12:04:11 +00008535 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008536 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008537 CmdArgs.push_back("-lgcc");
8538 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008539 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008540 CmdArgs.push_back("--as-needed");
8541 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008542 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008543 CmdArgs.push_back("--no-as-needed");
8544 }
8545
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008546 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008547 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008548 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008549 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008550
8551 // According to Android ABI, we have to link with libdl if we are
8552 // linking with non-static libgcc.
8553 //
8554 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8555 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8556 if (isAndroid && !StaticLibgcc)
8557 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008558}
8559
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008560static std::string getLinuxDynamicLinker(const ArgList &Args,
8561 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008562 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8563
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008564 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008565 if (ToolChain.getTriple().isArch64Bit())
8566 return "/system/bin/linker64";
8567 else
8568 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008569 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8570 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008571 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008572 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008573 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008574 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008575 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008576 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008577 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008578 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008579 return "/lib/ld-linux-armhf.so.3";
8580 else
8581 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008582 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8583 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008584 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008585 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008586 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008587 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008588 return "/lib/ld-linux.so.3";
8589 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8590 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008591 std::string LibDir =
8592 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008593 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008594 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008595 if (mips::isUCLibc(Args))
8596 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008597 else if (!ToolChain.getTriple().hasEnvironment()) {
8598 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8599 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8600 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8601 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008602 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008603
8604 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008605 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008606 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008607 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008608 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8609 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008610 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008611 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008612 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8613 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008614 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008615 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008616 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008617 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008618 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008619 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008620 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8621 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008622 else
8623 return "/lib64/ld-linux-x86-64.so.2";
8624}
8625
Renato Golinc4b49242014-02-13 10:01:16 +00008626static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008627 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008628 // Make use of compiler-rt if --rtlib option is used
8629 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8630
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008631 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008632 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008633 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008634 default:
8635 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008636 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008637 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008638 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008639 break;
8640 }
Renato Golinc4b49242014-02-13 10:01:16 +00008641 break;
8642 case ToolChain::RLT_Libgcc:
8643 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8644 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008645 }
8646}
8647
Rafael Espindola1e085772014-08-15 17:14:35 +00008648static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8649 switch (T.getArch()) {
8650 case llvm::Triple::x86:
8651 return "elf_i386";
8652 case llvm::Triple::aarch64:
8653 return "aarch64linux";
8654 case llvm::Triple::aarch64_be:
8655 return "aarch64_be_linux";
8656 case llvm::Triple::arm:
8657 case llvm::Triple::thumb:
8658 return "armelf_linux_eabi";
8659 case llvm::Triple::armeb:
8660 case llvm::Triple::thumbeb:
8661 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8662 case llvm::Triple::ppc:
8663 return "elf32ppclinux";
8664 case llvm::Triple::ppc64:
8665 return "elf64ppc";
8666 case llvm::Triple::ppc64le:
8667 return "elf64lppc";
8668 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008669 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008670 return "elf32_sparc";
8671 case llvm::Triple::sparcv9:
8672 return "elf64_sparc";
8673 case llvm::Triple::mips:
8674 return "elf32btsmip";
8675 case llvm::Triple::mipsel:
8676 return "elf32ltsmip";
8677 case llvm::Triple::mips64:
8678 if (mips::hasMipsAbiArg(Args, "n32"))
8679 return "elf32btsmipn32";
8680 return "elf64btsmip";
8681 case llvm::Triple::mips64el:
8682 if (mips::hasMipsAbiArg(Args, "n32"))
8683 return "elf32ltsmipn32";
8684 return "elf64ltsmip";
8685 case llvm::Triple::systemz:
8686 return "elf64_s390";
8687 case llvm::Triple::x86_64:
8688 if (T.getEnvironment() == llvm::Triple::GNUX32)
8689 return "elf32_x86_64";
8690 return "elf_x86_64";
8691 default:
8692 llvm_unreachable("Unexpected arch");
8693 }
8694}
8695
Douglas Katzman95354292015-06-23 20:42:09 +00008696void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8697 const InputInfo &Output,
8698 const InputInfoList &Inputs,
8699 const ArgList &Args,
8700 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008701 const toolchains::Linux &ToolChain =
8702 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008703 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008704
8705 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8706 llvm::Triple Triple = llvm::Triple(TripleStr);
8707
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008708 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008709 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008710 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008711 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8712 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008713 const bool HasCRTBeginEndFiles =
8714 ToolChain.getTriple().hasEnvironment() ||
8715 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008716
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008717 ArgStringList CmdArgs;
8718
Rafael Espindolad1002f62010-11-15 18:28:16 +00008719 // Silence warning for "clang -g foo.o -o foo"
8720 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008721 // and "clang -emit-llvm foo.o -o foo"
8722 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008723 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008724 // handled somewhere else.
8725 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008726
Peter Collingbourne39719a72015-11-20 20:49:39 +00008727 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8728 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008729 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008730 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008731 CmdArgs.push_back("-target");
8732 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8733 }
8734
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008735 if (!D.SysRoot.empty())
8736 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008737
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008738 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008739 CmdArgs.push_back("-pie");
8740
Rafael Espindola1c76c592010-11-07 22:57:16 +00008741 if (Args.hasArg(options::OPT_rdynamic))
8742 CmdArgs.push_back("-export-dynamic");
8743
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008744 if (Args.hasArg(options::OPT_s))
8745 CmdArgs.push_back("-s");
8746
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008747 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008748 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008749
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008750 for (const auto &Opt : ToolChain.ExtraOpts)
8751 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008752
8753 if (!Args.hasArg(options::OPT_static)) {
8754 CmdArgs.push_back("--eh-frame-hdr");
8755 }
8756
8757 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008758 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008759
8760 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008761 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8762 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008763 CmdArgs.push_back("-Bstatic");
8764 else
8765 CmdArgs.push_back("-static");
8766 } else if (Args.hasArg(options::OPT_shared)) {
8767 CmdArgs.push_back("-shared");
8768 }
8769
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008770 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8771 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008772 (!Args.hasArg(options::OPT_static) &&
8773 !Args.hasArg(options::OPT_shared))) {
8774 CmdArgs.push_back("-dynamic-linker");
8775 CmdArgs.push_back(Args.MakeArgString(
8776 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8777 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008778
8779 CmdArgs.push_back("-o");
8780 CmdArgs.push_back(Output.getFilename());
8781
Douglas Katzman78b37b02015-11-17 20:28:07 +00008782 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008783 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008784 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008785 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008786 if (Args.hasArg(options::OPT_pg))
8787 crt1 = "gcrt1.o";
8788 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008789 crt1 = "Scrt1.o";
8790 else
8791 crt1 = "crt1.o";
8792 }
8793 if (crt1)
8794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008795
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008796 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8797 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008798
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008799 const char *crtbegin;
8800 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008801 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008802 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008803 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008804 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008805 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008806 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008807 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008808
8809 if (HasCRTBeginEndFiles)
8810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008811
8812 // Add crtfastmath.o if available and fast math is enabled.
8813 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008814 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008815
8816 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008817 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008818
Douglas Katzman6059ef92015-11-17 17:41:23 +00008819 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008820
Teresa Johnson945bc502015-10-15 20:35:53 +00008821 if (D.isUsingLTO())
8822 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008823
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008824 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8825 CmdArgs.push_back("--no-demangle");
8826
Alexey Samsonov52550342014-09-15 19:58:40 +00008827 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008828 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008829 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008830 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008831
Douglas Katzman78b37b02015-11-17 20:28:07 +00008832 if (D.CCCIsCXX() &&
8833 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008834 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008835 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008836 if (OnlyLibstdcxxStatic)
8837 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008838 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008839 if (OnlyLibstdcxxStatic)
8840 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008841 CmdArgs.push_back("-lm");
8842 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008843 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8844 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008845
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008846 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008847 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8848 if (Args.hasArg(options::OPT_static))
8849 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008850
Alexey Samsonov52550342014-09-15 19:58:40 +00008851 if (NeedsSanitizerDeps)
8852 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8853
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008854 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8855 Args.hasArg(options::OPT_pthreads);
8856
8857 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8858 options::OPT_fno_openmp, false)) {
8859 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8860 // FIXME: Does this really make sense for all GNU toolchains?
8861 WantPthread = true;
8862
8863 // Also link the particular OpenMP runtimes.
8864 switch (getOpenMPRuntime(ToolChain, Args)) {
8865 case OMPRT_OMP:
8866 CmdArgs.push_back("-lomp");
8867 break;
8868 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008869 CmdArgs.push_back("-lgomp");
8870
8871 // FIXME: Exclude this for platforms with libgomp that don't require
8872 // librt. Most modern Linux platforms require it, but some may not.
8873 CmdArgs.push_back("-lrt");
8874 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008875 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008876 CmdArgs.push_back("-liomp5");
8877 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008878 case OMPRT_Unknown:
8879 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008880 break;
8881 }
Chandler Carruth01538002013-01-17 13:19:29 +00008882 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008883
Renato Golinc4b49242014-02-13 10:01:16 +00008884 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008885
Richard Smith31d1de22015-05-20 22:48:44 +00008886 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008887 CmdArgs.push_back("-lpthread");
8888
8889 CmdArgs.push_back("-lc");
8890
8891 if (Args.hasArg(options::OPT_static))
8892 CmdArgs.push_back("--end-group");
8893 else
Renato Golinc4b49242014-02-13 10:01:16 +00008894 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008895 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008896
Rafael Espindola81937ec2010-12-01 01:52:43 +00008897 if (!Args.hasArg(options::OPT_nostartfiles)) {
8898 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008899 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008900 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008901 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008902 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008903 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008904 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008905
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008906 if (HasCRTBeginEndFiles)
8907 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008908 if (!isAndroid)
8909 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008910 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008911 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008912
Peter Collingbourne39719a72015-11-20 20:49:39 +00008913 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008914}
8915
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008916// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8917// for the various SFI requirements like register masking. The assembly tool
8918// inserts the file containing the macros as an input into all the assembly
8919// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008920void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8921 const InputInfo &Output,
8922 const InputInfoList &Inputs,
8923 const ArgList &Args,
8924 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008925 const toolchains::NaClToolChain &ToolChain =
8926 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008927 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8928 "nacl-arm-macros.s");
8929 InputInfoList NewInputs;
8930 NewInputs.push_back(NaClMacros);
8931 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008932 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8933 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008934}
8935
Douglas Katzman750cfc52015-06-29 18:42:16 +00008936// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008937// we use static by default, do not yet support sanitizers or LTO, and a few
8938// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008939// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008940void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8941 const InputInfo &Output,
8942 const InputInfoList &Inputs,
8943 const ArgList &Args,
8944 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008945
Douglas Katzman54366072015-07-27 16:53:08 +00008946 const toolchains::NaClToolChain &ToolChain =
8947 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008948 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008949 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008950 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008951 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008952
8953 ArgStringList CmdArgs;
8954
8955 // Silence warning for "clang -g foo.o -o foo"
8956 Args.ClaimAllArgs(options::OPT_g_Group);
8957 // and "clang -emit-llvm foo.o -o foo"
8958 Args.ClaimAllArgs(options::OPT_emit_llvm);
8959 // and for "clang -w foo.o -o foo". Other warning options are already
8960 // handled somewhere else.
8961 Args.ClaimAllArgs(options::OPT_w);
8962
8963 if (!D.SysRoot.empty())
8964 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8965
8966 if (Args.hasArg(options::OPT_rdynamic))
8967 CmdArgs.push_back("-export-dynamic");
8968
8969 if (Args.hasArg(options::OPT_s))
8970 CmdArgs.push_back("-s");
8971
Douglas Katzman54366072015-07-27 16:53:08 +00008972 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8973 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008974 CmdArgs.push_back("--build-id");
8975
8976 if (!IsStatic)
8977 CmdArgs.push_back("--eh-frame-hdr");
8978
8979 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008980 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008981 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008982 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008983 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008984 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008985 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008986 else if (Arch == llvm::Triple::mipsel)
8987 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008988 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008989 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8990 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008991
8992 if (IsStatic)
8993 CmdArgs.push_back("-static");
8994 else if (Args.hasArg(options::OPT_shared))
8995 CmdArgs.push_back("-shared");
8996
8997 CmdArgs.push_back("-o");
8998 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008999 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009000 if (!Args.hasArg(options::OPT_shared))
9001 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9002 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9003
9004 const char *crtbegin;
9005 if (IsStatic)
9006 crtbegin = "crtbeginT.o";
9007 else if (Args.hasArg(options::OPT_shared))
9008 crtbegin = "crtbeginS.o";
9009 else
9010 crtbegin = "crtbegin.o";
9011 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9012 }
9013
9014 Args.AddAllArgs(CmdArgs, options::OPT_L);
9015 Args.AddAllArgs(CmdArgs, options::OPT_u);
9016
Douglas Katzman6059ef92015-11-17 17:41:23 +00009017 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009018
9019 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9020 CmdArgs.push_back("--no-demangle");
9021
9022 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9023
Douglas Katzman78b37b02015-11-17 20:28:07 +00009024 if (D.CCCIsCXX() &&
9025 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009026 bool OnlyLibstdcxxStatic =
9027 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009028 if (OnlyLibstdcxxStatic)
9029 CmdArgs.push_back("-Bstatic");
9030 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9031 if (OnlyLibstdcxxStatic)
9032 CmdArgs.push_back("-Bdynamic");
9033 CmdArgs.push_back("-lm");
9034 }
9035
9036 if (!Args.hasArg(options::OPT_nostdlib)) {
9037 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9038 // Always use groups, since it has no effect on dynamic libraries.
9039 CmdArgs.push_back("--start-group");
9040 CmdArgs.push_back("-lc");
9041 // NaCl's libc++ currently requires libpthread, so just always include it
9042 // in the group for C++.
9043 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009044 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009045 // Gold, used by Mips, handles nested groups differently than ld, and
9046 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9047 // which is not a desired behaviour here.
9048 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9049 if (getToolChain().getArch() == llvm::Triple::mipsel)
9050 CmdArgs.push_back("-lnacl");
9051
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009052 CmdArgs.push_back("-lpthread");
9053 }
9054
9055 CmdArgs.push_back("-lgcc");
9056 CmdArgs.push_back("--as-needed");
9057 if (IsStatic)
9058 CmdArgs.push_back("-lgcc_eh");
9059 else
9060 CmdArgs.push_back("-lgcc_s");
9061 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009062
9063 // Mips needs to create and use pnacl_legacy library that contains
9064 // definitions from bitcode/pnaclmm.c and definitions for
9065 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9066 if (getToolChain().getArch() == llvm::Triple::mipsel)
9067 CmdArgs.push_back("-lpnacl_legacy");
9068
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009069 CmdArgs.push_back("--end-group");
9070 }
9071
9072 if (!Args.hasArg(options::OPT_nostartfiles)) {
9073 const char *crtend;
9074 if (Args.hasArg(options::OPT_shared))
9075 crtend = "crtendS.o";
9076 else
9077 crtend = "crtend.o";
9078
9079 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9080 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9081 }
9082 }
9083
Peter Collingbourne39719a72015-11-20 20:49:39 +00009084 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9085 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009086}
9087
Douglas Katzman95354292015-06-23 20:42:09 +00009088void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9089 const InputInfo &Output,
9090 const InputInfoList &Inputs,
9091 const ArgList &Args,
9092 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009093 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009094 ArgStringList CmdArgs;
9095
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009096 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009097
9098 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009099 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009100
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009101 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009102 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009103
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009104 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009105 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009106}
9107
Douglas Katzman95354292015-06-23 20:42:09 +00009108void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9109 const InputInfo &Output,
9110 const InputInfoList &Inputs,
9111 const ArgList &Args,
9112 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009113 const Driver &D = getToolChain().getDriver();
9114 ArgStringList CmdArgs;
9115
Daniel Dunbarb440f562010-08-02 02:38:21 +00009116 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009117 CmdArgs.push_back("-o");
9118 CmdArgs.push_back(Output.getFilename());
9119 } else {
9120 assert(Output.isNothing() && "Invalid output.");
9121 }
9122
Douglas Katzman78b37b02015-11-17 20:28:07 +00009123 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009124 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9125 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9126 CmdArgs.push_back(
9127 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9128 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009129 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009130
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009131 Args.AddAllArgs(CmdArgs,
9132 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009133
Daniel Dunbar54423b22010-09-17 00:24:54 +00009134 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009135
Xinliang David Li69306c02015-10-22 06:15:31 +00009136 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009137
Douglas Katzman78b37b02015-11-17 20:28:07 +00009138 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009139 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009140 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009141 CmdArgs.push_back("-lm");
9142 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009143 }
9144
Douglas Katzman78b37b02015-11-17 20:28:07 +00009145 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009146 if (Args.hasArg(options::OPT_pthread))
9147 CmdArgs.push_back("-lpthread");
9148 CmdArgs.push_back("-lc");
9149 CmdArgs.push_back("-lCompilerRT-Generic");
9150 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9151 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009152 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009153 }
9154
Logan Chieneb9162f2014-06-26 14:23:45 +00009155 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009157}
9158
Daniel Dunbarcc912342009-05-02 18:28:39 +00009159/// DragonFly Tools
9160
9161// For now, DragonFly Assemble does just about the same as for
9162// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009163void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9164 const InputInfo &Output,
9165 const InputInfoList &Inputs,
9166 const ArgList &Args,
9167 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009168 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009169 ArgStringList CmdArgs;
9170
9171 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9172 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009173 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009174 CmdArgs.push_back("--32");
9175
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009176 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009177
9178 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009179 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009180
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009181 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009182 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009183
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009184 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009185 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009186}
9187
Douglas Katzman95354292015-06-23 20:42:09 +00009188void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9189 const InputInfo &Output,
9190 const InputInfoList &Inputs,
9191 const ArgList &Args,
9192 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009193 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009194 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009195
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009196 if (!D.SysRoot.empty())
9197 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9198
John McCall65b8da02013-04-11 22:55:55 +00009199 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009200 if (Args.hasArg(options::OPT_static)) {
9201 CmdArgs.push_back("-Bstatic");
9202 } else {
John McCall65b8da02013-04-11 22:55:55 +00009203 if (Args.hasArg(options::OPT_rdynamic))
9204 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009205 if (Args.hasArg(options::OPT_shared))
9206 CmdArgs.push_back("-Bshareable");
9207 else {
9208 CmdArgs.push_back("-dynamic-linker");
9209 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9210 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009211 CmdArgs.push_back("--hash-style=gnu");
9212 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009213 }
9214
9215 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9216 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009217 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009218 CmdArgs.push_back("-m");
9219 CmdArgs.push_back("elf_i386");
9220 }
9221
Daniel Dunbarb440f562010-08-02 02:38:21 +00009222 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009223 CmdArgs.push_back("-o");
9224 CmdArgs.push_back(Output.getFilename());
9225 } else {
9226 assert(Output.isNothing() && "Invalid output.");
9227 }
9228
Douglas Katzman78b37b02015-11-17 20:28:07 +00009229 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009230 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009231 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009232 CmdArgs.push_back(
9233 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009234 else {
9235 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009236 CmdArgs.push_back(
9237 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009238 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009239 CmdArgs.push_back(
9240 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009241 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009242 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009243 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009244 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009245 CmdArgs.push_back(
9246 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009247 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009248 CmdArgs.push_back(
9249 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009250 }
9251
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009252 Args.AddAllArgs(CmdArgs,
9253 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009254
Daniel Dunbar54423b22010-09-17 00:24:54 +00009255 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009256
Douglas Katzman78b37b02015-11-17 20:28:07 +00009257 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009258 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009259
9260 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009261 CmdArgs.push_back("-rpath");
9262 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009263 }
9264
Hans Wennborg70850d82013-07-18 20:29:38 +00009265 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009266 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009267 CmdArgs.push_back("-lm");
9268 }
9269
Daniel Dunbarcc912342009-05-02 18:28:39 +00009270 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009271 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009272
9273 if (!Args.hasArg(options::OPT_nolibc)) {
9274 CmdArgs.push_back("-lc");
9275 }
9276
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009277 if (Args.hasArg(options::OPT_static) ||
9278 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009279 CmdArgs.push_back("-lgcc");
9280 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009281 } else {
9282 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009283 CmdArgs.push_back("-lgcc_pic");
9284 if (!Args.hasArg(options::OPT_shared))
9285 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009286 } else {
John McCall65b8da02013-04-11 22:55:55 +00009287 CmdArgs.push_back("-lgcc");
9288 CmdArgs.push_back("--as-needed");
9289 CmdArgs.push_back("-lgcc_pic");
9290 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009291 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009292 }
9293 }
9294
Douglas Katzman78b37b02015-11-17 20:28:07 +00009295 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009296 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009297 CmdArgs.push_back(
9298 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009299 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009300 CmdArgs.push_back(
9301 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9302 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009303 }
9304
Xinliang David Li69306c02015-10-22 06:15:31 +00009305 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009306
Logan Chieneb9162f2014-06-26 14:23:45 +00009307 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009308 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009309}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009310
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009311// Try to find Exe from a Visual Studio distribution. This first tries to find
9312// an installed copy of Visual Studio and, failing that, looks in the PATH,
9313// making sure that whatever executable that's found is not a same-named exe
9314// from clang itself to prevent clang from falling back to itself.
9315static std::string FindVisualStudioExecutable(const ToolChain &TC,
9316 const char *Exe,
9317 const char *ClangProgramPath) {
9318 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9319 std::string visualStudioBinDir;
9320 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9321 visualStudioBinDir)) {
9322 SmallString<128> FilePath(visualStudioBinDir);
9323 llvm::sys::path::append(FilePath, Exe);
9324 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9325 return FilePath.str();
9326 }
9327
9328 return Exe;
9329}
9330
Douglas Katzman95354292015-06-23 20:42:09 +00009331void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9332 const InputInfo &Output,
9333 const InputInfoList &Inputs,
9334 const ArgList &Args,
9335 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009336 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009337 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009338
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009339 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9340 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009341 CmdArgs.push_back(
9342 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009343
Douglas Katzman78b37b02015-11-17 20:28:07 +00009344 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9345 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009346 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009347
Zachary Turner10d75b22014-10-22 20:40:43 +00009348 if (!llvm::sys::Process::GetEnv("LIB")) {
9349 // If the VC environment hasn't been configured (perhaps because the user
9350 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009351 // the environment variable is set however, assume the user knows what
9352 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009353 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009354 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009355 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9356 SmallString<128> LibDir(VisualStudioDir);
9357 llvm::sys::path::append(LibDir, "VC", "lib");
9358 switch (MSVC.getArch()) {
9359 case llvm::Triple::x86:
9360 // x86 just puts the libraries directly in lib
9361 break;
9362 case llvm::Triple::x86_64:
9363 llvm::sys::path::append(LibDir, "amd64");
9364 break;
9365 case llvm::Triple::arm:
9366 llvm::sys::path::append(LibDir, "arm");
9367 break;
9368 default:
9369 break;
9370 }
9371 CmdArgs.push_back(
9372 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009373
9374 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9375 std::string UniversalCRTLibPath;
9376 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9377 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9378 UniversalCRTLibPath.c_str()));
9379 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009380 }
9381
9382 std::string WindowsSdkLibPath;
9383 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9384 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9385 WindowsSdkLibPath.c_str()));
9386 }
9387
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009388 CmdArgs.push_back("-nologo");
9389
Reid Kleckner124955a2015-08-05 18:51:13 +00009390 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009391 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009392
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009393 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009394 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009395 if (DLL) {
9396 CmdArgs.push_back(Args.MakeArgString("-dll"));
9397
9398 SmallString<128> ImplibName(Output.getFilename());
9399 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009400 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009401 }
9402
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009403 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009404 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009405 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009406 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009407 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9408 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009409 // Make sure the dynamic runtime thunk is not optimized out at link time
9410 // to ensure proper SEH handling.
9411 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009412 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009413 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009414 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009415 for (const auto &Lib : {"asan", "asan_cxx"})
9416 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009417 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009418 }
9419
Hans Wennborg2e274592013-08-13 23:38:57 +00009420 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009421
Alexey Bataevc7e84352015-08-19 04:49:01 +00009422 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9423 options::OPT_fno_openmp, false)) {
9424 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9425 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9426 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9427 TC.getDriver().Dir + "/../lib"));
9428 switch (getOpenMPRuntime(getToolChain(), Args)) {
9429 case OMPRT_OMP:
9430 CmdArgs.push_back("-defaultlib:libomp.lib");
9431 break;
9432 case OMPRT_IOMP5:
9433 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9434 break;
9435 case OMPRT_GOMP:
9436 break;
9437 case OMPRT_Unknown:
9438 // Already diagnosed.
9439 break;
9440 }
9441 }
9442
Reid Kleckner337188f2014-09-16 19:22:00 +00009443 // Add filenames, libraries, and other linker inputs.
9444 for (const auto &Input : Inputs) {
9445 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009446 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009447 continue;
9448 }
9449
9450 const Arg &A = Input.getInputArg();
9451
9452 // Render -l options differently for the MSVC linker.
9453 if (A.getOption().matches(options::OPT_l)) {
9454 StringRef Lib = A.getValue();
9455 const char *LinkLibArg;
9456 if (Lib.endswith(".lib"))
9457 LinkLibArg = Args.MakeArgString(Lib);
9458 else
9459 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9460 CmdArgs.push_back(LinkLibArg);
9461 continue;
9462 }
9463
9464 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9465 // or -L. Render it, even if MSVC doesn't understand it.
9466 A.renderAsInput(Args, CmdArgs);
9467 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009468
Zachary Turner719f58c2014-12-01 23:06:47 +00009469 // We need to special case some linker paths. In the case of lld, we need to
9470 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9471 // linker, we need to use a special search algorithm.
9472 llvm::SmallString<128> linkPath;
9473 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9474 if (Linker.equals_lower("lld"))
9475 Linker = "lld-link";
9476
9477 if (Linker.equals_lower("link")) {
9478 // If we're using the MSVC linker, it's not sufficient to just use link
9479 // from the program PATH, because other environments like GnuWin32 install
9480 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009481 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009482 C.getDriver().getClangProgramPath());
9483 } else {
9484 linkPath = Linker;
9485 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009486 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009487 }
9488
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009489 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009490 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009491}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009492
Douglas Katzman95354292015-06-23 20:42:09 +00009493void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9494 const InputInfo &Output,
9495 const InputInfoList &Inputs,
9496 const ArgList &Args,
9497 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009498 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9499}
9500
Douglas Katzman95354292015-06-23 20:42:09 +00009501std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009502 Compilation &C, const JobAction &JA, const InputInfo &Output,
9503 const InputInfoList &Inputs, const ArgList &Args,
9504 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009505 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009506 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009507 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009508 CmdArgs.push_back("/W0"); // No warnings.
9509
9510 // The goal is to be able to invoke this tool correctly based on
9511 // any flag accepted by clang-cl.
9512
9513 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009514 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009515
9516 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009517 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9518 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9519 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009520 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9521 if (A->getOption().getID() == options::OPT_O0) {
9522 CmdArgs.push_back("/Od");
9523 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009524 CmdArgs.push_back("/Og");
9525
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009526 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009527 if (OptLevel == "s" || OptLevel == "z")
9528 CmdArgs.push_back("/Os");
9529 else
9530 CmdArgs.push_back("/Ot");
9531
9532 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009533 }
9534 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009535 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9536 options::OPT_fno_omit_frame_pointer))
9537 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9538 ? "/Oy"
9539 : "/Oy-");
9540 if (!Args.hasArg(options::OPT_fwritable_strings))
9541 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009542
Nico Weber3f8dafb2015-03-12 19:37:10 +00009543 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009544 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9545
David Majnemerf6072342014-07-01 22:24:56 +00009546 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9547 /*default=*/false))
9548 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009549 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9550 options::OPT_fno_function_sections))
9551 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9552 ? "/Gy"
9553 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009554 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9555 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009556 CmdArgs.push_back(
9557 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009558 if (Args.hasArg(options::OPT_fsyntax_only))
9559 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009560 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9561 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009562 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009563
Nico Weber3f8dafb2015-03-12 19:37:10 +00009564 std::vector<std::string> Includes =
9565 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009566 for (const auto &Include : Includes)
9567 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009568
Hans Wennborg87cfa712013-09-19 20:32:16 +00009569 // Flags that can simply be passed through.
9570 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9571 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009572 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009573 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009574
9575 // The order of these flags is relevant, so pick the last one.
9576 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9577 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9578 A->render(Args, CmdArgs);
9579
Hans Wennborg87cfa712013-09-19 20:32:16 +00009580 // Input filename.
9581 assert(Inputs.size() == 1);
9582 const InputInfo &II = Inputs[0];
9583 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9584 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9585 if (II.isFilename())
9586 CmdArgs.push_back(II.getFilename());
9587 else
9588 II.getInputArg().renderAsInput(Args, CmdArgs);
9589
9590 // Output filename.
9591 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009592 const char *Fo =
9593 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009594 CmdArgs.push_back(Fo);
9595
Hans Wennborg188382e2013-09-20 18:16:35 +00009596 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009597 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9598 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009599 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009600 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009601}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009602
Yaron Keren1c0070c2015-07-02 04:45:27 +00009603/// MinGW Tools
9604void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9605 const InputInfo &Output,
9606 const InputInfoList &Inputs,
9607 const ArgList &Args,
9608 const char *LinkingOutput) const {
9609 claimNoWarnArgs(Args);
9610 ArgStringList CmdArgs;
9611
9612 if (getToolChain().getArch() == llvm::Triple::x86) {
9613 CmdArgs.push_back("--32");
9614 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9615 CmdArgs.push_back("--64");
9616 }
9617
9618 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9619
9620 CmdArgs.push_back("-o");
9621 CmdArgs.push_back(Output.getFilename());
9622
9623 for (const auto &II : Inputs)
9624 CmdArgs.push_back(II.getFilename());
9625
9626 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009627 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009628
9629 if (Args.hasArg(options::OPT_gsplit_dwarf))
9630 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9631 SplitDebugName(Args, Inputs[0]));
9632}
9633
9634void MinGW::Linker::AddLibGCC(const ArgList &Args,
9635 ArgStringList &CmdArgs) const {
9636 if (Args.hasArg(options::OPT_mthreads))
9637 CmdArgs.push_back("-lmingwthrd");
9638 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009639
Yaron Kerenaa281332015-08-09 00:24:07 +00009640 // Make use of compiler-rt if --rtlib option is used
9641 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9642 if (RLT == ToolChain::RLT_Libgcc) {
9643 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9644 Args.hasArg(options::OPT_static);
9645 bool Shared = Args.hasArg(options::OPT_shared);
9646 bool CXX = getToolChain().getDriver().CCCIsCXX();
9647
9648 if (Static || (!CXX && !Shared)) {
9649 CmdArgs.push_back("-lgcc");
9650 CmdArgs.push_back("-lgcc_eh");
9651 } else {
9652 CmdArgs.push_back("-lgcc_s");
9653 CmdArgs.push_back("-lgcc");
9654 }
9655 } else {
9656 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9657 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009658
Yaron Keren1c0070c2015-07-02 04:45:27 +00009659 CmdArgs.push_back("-lmoldname");
9660 CmdArgs.push_back("-lmingwex");
9661 CmdArgs.push_back("-lmsvcrt");
9662}
9663
9664void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9665 const InputInfo &Output,
9666 const InputInfoList &Inputs,
9667 const ArgList &Args,
9668 const char *LinkingOutput) const {
9669 const ToolChain &TC = getToolChain();
9670 const Driver &D = TC.getDriver();
9671 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9672
9673 ArgStringList CmdArgs;
9674
9675 // Silence warning for "clang -g foo.o -o foo"
9676 Args.ClaimAllArgs(options::OPT_g_Group);
9677 // and "clang -emit-llvm foo.o -o foo"
9678 Args.ClaimAllArgs(options::OPT_emit_llvm);
9679 // and for "clang -w foo.o -o foo". Other warning options are already
9680 // handled somewhere else.
9681 Args.ClaimAllArgs(options::OPT_w);
9682
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009683 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9684 if (LinkerName.equals_lower("lld")) {
9685 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009686 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009687 } else if (!LinkerName.equals_lower("ld")) {
9688 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009689 }
9690
Yaron Keren1c0070c2015-07-02 04:45:27 +00009691 if (!D.SysRoot.empty())
9692 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9693
9694 if (Args.hasArg(options::OPT_s))
9695 CmdArgs.push_back("-s");
9696
9697 CmdArgs.push_back("-m");
9698 if (TC.getArch() == llvm::Triple::x86)
9699 CmdArgs.push_back("i386pe");
9700 if (TC.getArch() == llvm::Triple::x86_64)
9701 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009702 if (TC.getArch() == llvm::Triple::arm)
9703 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009704
9705 if (Args.hasArg(options::OPT_mwindows)) {
9706 CmdArgs.push_back("--subsystem");
9707 CmdArgs.push_back("windows");
9708 } else if (Args.hasArg(options::OPT_mconsole)) {
9709 CmdArgs.push_back("--subsystem");
9710 CmdArgs.push_back("console");
9711 }
9712
9713 if (Args.hasArg(options::OPT_static))
9714 CmdArgs.push_back("-Bstatic");
9715 else {
9716 if (Args.hasArg(options::OPT_mdll))
9717 CmdArgs.push_back("--dll");
9718 else if (Args.hasArg(options::OPT_shared))
9719 CmdArgs.push_back("--shared");
9720 CmdArgs.push_back("-Bdynamic");
9721 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9722 CmdArgs.push_back("-e");
9723 if (TC.getArch() == llvm::Triple::x86)
9724 CmdArgs.push_back("_DllMainCRTStartup@12");
9725 else
9726 CmdArgs.push_back("DllMainCRTStartup");
9727 CmdArgs.push_back("--enable-auto-image-base");
9728 }
9729 }
9730
9731 CmdArgs.push_back("-o");
9732 CmdArgs.push_back(Output.getFilename());
9733
9734 Args.AddAllArgs(CmdArgs, options::OPT_e);
9735 // FIXME: add -N, -n flags
9736 Args.AddLastArg(CmdArgs, options::OPT_r);
9737 Args.AddLastArg(CmdArgs, options::OPT_s);
9738 Args.AddLastArg(CmdArgs, options::OPT_t);
9739 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9740 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9741
Douglas Katzman78b37b02015-11-17 20:28:07 +00009742 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009743 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9744 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9745 } else {
9746 if (Args.hasArg(options::OPT_municode))
9747 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9748 else
9749 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9750 }
9751 if (Args.hasArg(options::OPT_pg))
9752 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9753 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9754 }
9755
9756 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009757 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009758 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9759
9760 // TODO: Add ASan stuff here
9761
9762 // TODO: Add profile stuff here
9763
Douglas Katzman78b37b02015-11-17 20:28:07 +00009764 if (D.CCCIsCXX() &&
9765 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009766 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9767 !Args.hasArg(options::OPT_static);
9768 if (OnlyLibstdcxxStatic)
9769 CmdArgs.push_back("-Bstatic");
9770 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9771 if (OnlyLibstdcxxStatic)
9772 CmdArgs.push_back("-Bdynamic");
9773 }
9774
9775 if (!Args.hasArg(options::OPT_nostdlib)) {
9776 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9777 if (Args.hasArg(options::OPT_static))
9778 CmdArgs.push_back("--start-group");
9779
9780 if (Args.hasArg(options::OPT_fstack_protector) ||
9781 Args.hasArg(options::OPT_fstack_protector_strong) ||
9782 Args.hasArg(options::OPT_fstack_protector_all)) {
9783 CmdArgs.push_back("-lssp_nonshared");
9784 CmdArgs.push_back("-lssp");
9785 }
9786 if (Args.hasArg(options::OPT_fopenmp))
9787 CmdArgs.push_back("-lgomp");
9788
9789 AddLibGCC(Args, CmdArgs);
9790
9791 if (Args.hasArg(options::OPT_pg))
9792 CmdArgs.push_back("-lgmon");
9793
Yaron Kerenadce68e2015-07-06 18:52:19 +00009794 if (Args.hasArg(options::OPT_pthread))
9795 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009796
9797 // add system libraries
9798 if (Args.hasArg(options::OPT_mwindows)) {
9799 CmdArgs.push_back("-lgdi32");
9800 CmdArgs.push_back("-lcomdlg32");
9801 }
9802 CmdArgs.push_back("-ladvapi32");
9803 CmdArgs.push_back("-lshell32");
9804 CmdArgs.push_back("-luser32");
9805 CmdArgs.push_back("-lkernel32");
9806
9807 if (Args.hasArg(options::OPT_static))
9808 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009809 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009810 AddLibGCC(Args, CmdArgs);
9811 }
9812
9813 if (!Args.hasArg(options::OPT_nostartfiles)) {
9814 // Add crtfastmath.o if available and fast math is enabled.
9815 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9816
9817 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9818 }
9819 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009820 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009822}
9823
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009824/// XCore Tools
9825// We pass assemble and link construction to the xcc tool.
9826
Douglas Katzman95354292015-06-23 20:42:09 +00009827void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9828 const InputInfo &Output,
9829 const InputInfoList &Inputs,
9830 const ArgList &Args,
9831 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009832 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009833 ArgStringList CmdArgs;
9834
9835 CmdArgs.push_back("-o");
9836 CmdArgs.push_back(Output.getFilename());
9837
9838 CmdArgs.push_back("-c");
9839
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009840 if (Args.hasArg(options::OPT_v))
9841 CmdArgs.push_back("-v");
9842
Robert Lytton894d25c2014-05-02 09:33:25 +00009843 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9844 if (!A->getOption().matches(options::OPT_g0))
9845 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009846
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009847 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9848 false))
9849 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009851 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009852
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009853 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009854 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009855
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009856 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009857 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009858}
9859
Douglas Katzman95354292015-06-23 20:42:09 +00009860void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9861 const InputInfo &Output,
9862 const InputInfoList &Inputs,
9863 const ArgList &Args,
9864 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009865 ArgStringList CmdArgs;
9866
9867 if (Output.isFilename()) {
9868 CmdArgs.push_back("-o");
9869 CmdArgs.push_back(Output.getFilename());
9870 } else {
9871 assert(Output.isNothing() && "Invalid output.");
9872 }
9873
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009874 if (Args.hasArg(options::OPT_v))
9875 CmdArgs.push_back("-v");
9876
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009877 // Pass -fexceptions through to the linker if it was present.
9878 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9879 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009880 CmdArgs.push_back("-fexceptions");
9881
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009882 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9883
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009884 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009885 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009886}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009887
Douglas Katzman95354292015-06-23 20:42:09 +00009888void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9889 const InputInfo &Output,
9890 const InputInfoList &Inputs,
9891 const ArgList &Args,
9892 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009893 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009894 const auto &TC =
9895 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9896 ArgStringList CmdArgs;
9897 const char *Exec;
9898
9899 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009900 default:
9901 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009902 case llvm::Triple::arm:
9903 case llvm::Triple::thumb:
9904 break;
9905 case llvm::Triple::x86:
9906 CmdArgs.push_back("--32");
9907 break;
9908 case llvm::Triple::x86_64:
9909 CmdArgs.push_back("--64");
9910 break;
9911 }
9912
9913 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9914
9915 CmdArgs.push_back("-o");
9916 CmdArgs.push_back(Output.getFilename());
9917
9918 for (const auto &Input : Inputs)
9919 CmdArgs.push_back(Input.getFilename());
9920
9921 const std::string Assembler = TC.GetProgramPath("as");
9922 Exec = Args.MakeArgString(Assembler);
9923
Justin Bognerd3371d82015-07-17 03:35:54 +00009924 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009925}
9926
Douglas Katzman95354292015-06-23 20:42:09 +00009927void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9928 const InputInfo &Output,
9929 const InputInfoList &Inputs,
9930 const ArgList &Args,
9931 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009932 const auto &TC =
9933 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9934 const llvm::Triple &T = TC.getTriple();
9935 const Driver &D = TC.getDriver();
9936 SmallString<128> EntryPoint;
9937 ArgStringList CmdArgs;
9938 const char *Exec;
9939
9940 // Silence warning for "clang -g foo.o -o foo"
9941 Args.ClaimAllArgs(options::OPT_g_Group);
9942 // and "clang -emit-llvm foo.o -o foo"
9943 Args.ClaimAllArgs(options::OPT_emit_llvm);
9944 // and for "clang -w foo.o -o foo"
9945 Args.ClaimAllArgs(options::OPT_w);
9946 // Other warning options are already handled somewhere else.
9947
9948 if (!D.SysRoot.empty())
9949 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9950
9951 if (Args.hasArg(options::OPT_pie))
9952 CmdArgs.push_back("-pie");
9953 if (Args.hasArg(options::OPT_rdynamic))
9954 CmdArgs.push_back("-export-dynamic");
9955 if (Args.hasArg(options::OPT_s))
9956 CmdArgs.push_back("--strip-all");
9957
9958 CmdArgs.push_back("-m");
9959 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009960 default:
9961 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009962 case llvm::Triple::arm:
9963 case llvm::Triple::thumb:
9964 // FIXME: this is incorrect for WinCE
9965 CmdArgs.push_back("thumb2pe");
9966 break;
9967 case llvm::Triple::x86:
9968 CmdArgs.push_back("i386pe");
9969 EntryPoint.append("_");
9970 break;
9971 case llvm::Triple::x86_64:
9972 CmdArgs.push_back("i386pep");
9973 break;
9974 }
9975
9976 if (Args.hasArg(options::OPT_shared)) {
9977 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009978 default:
9979 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009980 case llvm::Triple::arm:
9981 case llvm::Triple::thumb:
9982 case llvm::Triple::x86_64:
9983 EntryPoint.append("_DllMainCRTStartup");
9984 break;
9985 case llvm::Triple::x86:
9986 EntryPoint.append("_DllMainCRTStartup@12");
9987 break;
9988 }
9989
9990 CmdArgs.push_back("-shared");
9991 CmdArgs.push_back("-Bdynamic");
9992
9993 CmdArgs.push_back("--enable-auto-image-base");
9994
9995 CmdArgs.push_back("--entry");
9996 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9997 } else {
9998 EntryPoint.append("mainCRTStartup");
9999
10000 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10001 : "-Bdynamic");
10002
Douglas Katzman78b37b02015-11-17 20:28:07 +000010003 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010004 CmdArgs.push_back("--entry");
10005 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10006 }
10007
10008 // FIXME: handle subsystem
10009 }
10010
10011 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010012 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010013
10014 CmdArgs.push_back("-o");
10015 CmdArgs.push_back(Output.getFilename());
10016
10017 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10018 SmallString<261> ImpLib(Output.getFilename());
10019 llvm::sys::path::replace_extension(ImpLib, ".lib");
10020
10021 CmdArgs.push_back("--out-implib");
10022 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10023 }
10024
Douglas Katzman78b37b02015-11-17 20:28:07 +000010025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010026 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10027 const char *CRTBegin;
10028
10029 CRTBegin =
10030 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10031 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10032 }
10033
10034 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010035 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010036 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10037
10038 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10039 !Args.hasArg(options::OPT_nodefaultlibs)) {
10040 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10041 !Args.hasArg(options::OPT_static);
10042 if (StaticCXX)
10043 CmdArgs.push_back("-Bstatic");
10044 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10045 if (StaticCXX)
10046 CmdArgs.push_back("-Bdynamic");
10047 }
10048
10049 if (!Args.hasArg(options::OPT_nostdlib)) {
10050 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10051 // TODO handle /MT[d] /MD[d]
10052 CmdArgs.push_back("-lmsvcrt");
10053 AddRunTimeLibs(TC, D, CmdArgs, Args);
10054 }
10055 }
10056
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010057 if (TC.getSanitizerArgs().needsAsanRt()) {
10058 // TODO handle /MT[d] /MD[d]
10059 if (Args.hasArg(options::OPT_shared)) {
10060 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10061 } else {
10062 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10063 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10064 // Make sure the dynamic runtime thunk is not optimized out at link time
10065 // to ensure proper SEH handling.
10066 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10067 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10068 ? "___asan_seh_interceptor"
10069 : "__asan_seh_interceptor"));
10070 }
10071 }
10072
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010073 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010074
Justin Bognerd3371d82015-07-17 03:35:54 +000010075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010076}
Douglas Katzman84a75642015-06-19 14:55:19 +000010077
Douglas Katzman95354292015-06-23 20:42:09 +000010078void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10079 const InputInfo &Output,
10080 const InputInfoList &Inputs,
10081 const ArgList &Args,
10082 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010083 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010084 assert(Inputs.size() == 1);
10085 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010086 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10087 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010088
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010089 if (JA.getKind() == Action::PreprocessJobClass) {
10090 Args.ClaimAllArgs();
10091 CmdArgs.push_back("-E");
10092 } else {
10093 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10094 CmdArgs.push_back("-S");
10095 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10096 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010097 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010098 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010099
Douglas Katzmanf6071112015-08-03 14:34:22 +000010100 // Append all -I, -iquote, -isystem paths, defines/undefines,
10101 // 'f' flags, optimize flags, and warning options.
10102 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010103 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010104 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010105 options::OPT_f_Group, options::OPT_f_clang_Group,
10106 options::OPT_g_Group, options::OPT_M_Group,
10107 options::OPT_O_Group, options::OPT_W_Group});
10108
10109 // If we're producing a dependency file, and assembly is the final action,
10110 // then the name of the target in the dependency file should be the '.o'
10111 // file, not the '.s' file produced by this step. For example, instead of
10112 // /tmp/mumble.s: mumble.c .../someheader.h
10113 // the filename on the lefthand side should be "mumble.o"
10114 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10115 C.getActions().size() == 1 &&
10116 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10117 Arg *A = Args.getLastArg(options::OPT_o);
10118 if (A) {
10119 CmdArgs.push_back("-MT");
10120 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10121 }
10122 }
10123
Douglas Katzman84a75642015-06-19 14:55:19 +000010124 CmdArgs.push_back(II.getFilename());
10125 CmdArgs.push_back("-o");
10126 CmdArgs.push_back(Output.getFilename());
10127
10128 std::string Exec =
10129 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010130 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10131 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010132}
10133
Douglas Katzman95354292015-06-23 20:42:09 +000010134void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10135 const InputInfo &Output,
10136 const InputInfoList &Inputs,
10137 const ArgList &Args,
10138 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010139 ArgStringList CmdArgs;
10140
10141 assert(Inputs.size() == 1);
10142 const InputInfo &II = Inputs[0];
10143 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10144 assert(Output.getType() == types::TY_Object);
10145
10146 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010147 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010148 CmdArgs.push_back("-noSPrefixing");
10149 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010150 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10151 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10152 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010153 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010154 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010155 }
10156 CmdArgs.push_back("-elf"); // Output format.
10157 CmdArgs.push_back(II.getFilename());
10158 CmdArgs.push_back(
10159 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10160
10161 std::string Exec =
10162 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010163 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10164 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010165}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010166
10167void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10168 const InputInfo &Output,
10169 const InputInfoList &Inputs,
10170 const ArgList &Args,
10171 const char *LinkingOutput) const {
10172 const auto &TC =
10173 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10174 const llvm::Triple &T = TC.getTriple();
10175 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010176 bool UseStartfiles =
10177 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010178 bool UseDefaultLibs =
10179 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010180
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010181 if (T.getArch() == llvm::Triple::sparc)
10182 CmdArgs.push_back("-EB");
10183 else // SHAVE assumes little-endian, and sparcel is expressly so.
10184 CmdArgs.push_back("-EL");
10185
10186 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10187 // but we never pass through a --sysroot option and various other bits.
10188 // For example, there are no sanitizers (yet) nor gold linker.
10189
10190 // Eat some arguments that may be present but have no effect.
10191 Args.ClaimAllArgs(options::OPT_g_Group);
10192 Args.ClaimAllArgs(options::OPT_w);
10193 Args.ClaimAllArgs(options::OPT_static_libgcc);
10194
10195 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10196 CmdArgs.push_back("-s");
10197
10198 CmdArgs.push_back("-o");
10199 CmdArgs.push_back(Output.getFilename());
10200
10201 if (UseStartfiles) {
10202 // If you want startfiles, it means you want the builtin crti and crtbegin,
10203 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010204 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10205 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010206 }
10207
10208 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10209 options::OPT_e, options::OPT_s, options::OPT_t,
10210 options::OPT_Z_Flag, options::OPT_r});
10211
Douglas Katzman674a3122015-11-18 16:24:46 +000010212 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010213
10214 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10215
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010216 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010217 if (C.getDriver().CCCIsCXX())
10218 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010219 if (T.getOS() == llvm::Triple::RTEMS) {
10220 CmdArgs.push_back("--start-group");
10221 CmdArgs.push_back("-lc");
10222 // You must provide your own "-L" option to enable finding these.
10223 CmdArgs.push_back("-lrtemscpu");
10224 CmdArgs.push_back("-lrtemsbsp");
10225 CmdArgs.push_back("--end-group");
10226 } else {
10227 CmdArgs.push_back("-lc");
10228 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010229 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010230 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010231 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010232 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10233 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010234 }
10235
10236 std::string Exec =
10237 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10238 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10239 CmdArgs, Inputs));
10240}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010241
10242void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10243 const InputInfo &Output,
10244 const InputInfoList &Inputs,
10245 const ArgList &Args,
10246 const char *LinkingOutput) const {
10247 claimNoWarnArgs(Args);
10248 ArgStringList CmdArgs;
10249
10250 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10251
10252 CmdArgs.push_back("-o");
10253 CmdArgs.push_back(Output.getFilename());
10254
10255 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10256 const InputInfo &Input = Inputs[0];
10257 assert(Input.isFilename() && "Invalid input.");
10258 CmdArgs.push_back(Input.getFilename());
10259
10260 const char *Exec =
10261 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10262 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10263}
10264
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010265static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10266 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10267 if (SanArgs.needsUbsanRt()) {
10268 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10269 }
10270 if (SanArgs.needsAsanRt()) {
10271 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10272 }
10273}
10274
10275static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10276 const JobAction &JA, const InputInfo &Output,
10277 const InputInfoList &Inputs,
10278 const ArgList &Args,
10279 const char *LinkingOutput) {
10280 const toolchains::FreeBSD &ToolChain =
10281 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10282 const Driver &D = ToolChain.getDriver();
10283 ArgStringList CmdArgs;
10284
10285 // Silence warning for "clang -g foo.o -o foo"
10286 Args.ClaimAllArgs(options::OPT_g_Group);
10287 // and "clang -emit-llvm foo.o -o foo"
10288 Args.ClaimAllArgs(options::OPT_emit_llvm);
10289 // and for "clang -w foo.o -o foo". Other warning options are already
10290 // handled somewhere else.
10291 Args.ClaimAllArgs(options::OPT_w);
10292
10293 if (!D.SysRoot.empty())
10294 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10295
10296 if (Args.hasArg(options::OPT_pie))
10297 CmdArgs.push_back("-pie");
10298
10299 if (Args.hasArg(options::OPT_rdynamic))
10300 CmdArgs.push_back("-export-dynamic");
10301 if (Args.hasArg(options::OPT_shared))
10302 CmdArgs.push_back("--oformat=so");
10303
10304 if (Output.isFilename()) {
10305 CmdArgs.push_back("-o");
10306 CmdArgs.push_back(Output.getFilename());
10307 } else {
10308 assert(Output.isNothing() && "Invalid output.");
10309 }
10310
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010311 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10312
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010313 Args.AddAllArgs(CmdArgs, options::OPT_L);
10314 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10315 Args.AddAllArgs(CmdArgs, options::OPT_e);
10316 Args.AddAllArgs(CmdArgs, options::OPT_s);
10317 Args.AddAllArgs(CmdArgs, options::OPT_t);
10318 Args.AddAllArgs(CmdArgs, options::OPT_r);
10319
10320 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10321 CmdArgs.push_back("--no-demangle");
10322
10323 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10324
10325 if (Args.hasArg(options::OPT_pthread)) {
10326 CmdArgs.push_back("-lpthread");
10327 }
10328
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010329 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10330
10331 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10332}
10333
10334static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10335 const JobAction &JA, const InputInfo &Output,
10336 const InputInfoList &Inputs,
10337 const ArgList &Args,
10338 const char *LinkingOutput) {
10339 const toolchains::FreeBSD &ToolChain =
10340 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10341 const Driver &D = ToolChain.getDriver();
10342 ArgStringList CmdArgs;
10343
10344 // Silence warning for "clang -g foo.o -o foo"
10345 Args.ClaimAllArgs(options::OPT_g_Group);
10346 // and "clang -emit-llvm foo.o -o foo"
10347 Args.ClaimAllArgs(options::OPT_emit_llvm);
10348 // and for "clang -w foo.o -o foo". Other warning options are already
10349 // handled somewhere else.
10350 Args.ClaimAllArgs(options::OPT_w);
10351
10352 if (!D.SysRoot.empty())
10353 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10354
10355 if (Args.hasArg(options::OPT_pie))
10356 CmdArgs.push_back("-pie");
10357
10358 if (Args.hasArg(options::OPT_static)) {
10359 CmdArgs.push_back("-Bstatic");
10360 } else {
10361 if (Args.hasArg(options::OPT_rdynamic))
10362 CmdArgs.push_back("-export-dynamic");
10363 CmdArgs.push_back("--eh-frame-hdr");
10364 if (Args.hasArg(options::OPT_shared)) {
10365 CmdArgs.push_back("-Bshareable");
10366 } else {
10367 CmdArgs.push_back("-dynamic-linker");
10368 CmdArgs.push_back("/libexec/ld-elf.so.1");
10369 }
10370 CmdArgs.push_back("--enable-new-dtags");
10371 }
10372
10373 if (Output.isFilename()) {
10374 CmdArgs.push_back("-o");
10375 CmdArgs.push_back(Output.getFilename());
10376 } else {
10377 assert(Output.isNothing() && "Invalid output.");
10378 }
10379
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010380 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10381
Douglas Katzman78b37b02015-11-17 20:28:07 +000010382 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010383 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010384 if (!Args.hasArg(options::OPT_shared)) {
10385 if (Args.hasArg(options::OPT_pg))
10386 crt1 = "gcrt1.o";
10387 else if (Args.hasArg(options::OPT_pie))
10388 crt1 = "Scrt1.o";
10389 else
10390 crt1 = "crt1.o";
10391 }
10392 if (crt1)
10393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10394
10395 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10396
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010397 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010398 if (Args.hasArg(options::OPT_static))
10399 crtbegin = "crtbeginT.o";
10400 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10401 crtbegin = "crtbeginS.o";
10402 else
10403 crtbegin = "crtbegin.o";
10404
10405 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10406 }
10407
10408 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010409 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010410 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10411 Args.AddAllArgs(CmdArgs, options::OPT_e);
10412 Args.AddAllArgs(CmdArgs, options::OPT_s);
10413 Args.AddAllArgs(CmdArgs, options::OPT_t);
10414 Args.AddAllArgs(CmdArgs, options::OPT_r);
10415
10416 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10417 CmdArgs.push_back("--no-demangle");
10418
10419 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10420
Douglas Katzman78b37b02015-11-17 20:28:07 +000010421 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010422 // For PS4, we always want to pass libm, libstdc++ and libkernel
10423 // libraries for both C and C++ compilations.
10424 CmdArgs.push_back("-lkernel");
10425 if (D.CCCIsCXX()) {
10426 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10427 if (Args.hasArg(options::OPT_pg))
10428 CmdArgs.push_back("-lm_p");
10429 else
10430 CmdArgs.push_back("-lm");
10431 }
10432 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10433 // the default system libraries. Just mimic this for now.
10434 if (Args.hasArg(options::OPT_pg))
10435 CmdArgs.push_back("-lgcc_p");
10436 else
10437 CmdArgs.push_back("-lcompiler_rt");
10438 if (Args.hasArg(options::OPT_static)) {
10439 CmdArgs.push_back("-lstdc++");
10440 } else if (Args.hasArg(options::OPT_pg)) {
10441 CmdArgs.push_back("-lgcc_eh_p");
10442 } else {
10443 CmdArgs.push_back("--as-needed");
10444 CmdArgs.push_back("-lstdc++");
10445 CmdArgs.push_back("--no-as-needed");
10446 }
10447
10448 if (Args.hasArg(options::OPT_pthread)) {
10449 if (Args.hasArg(options::OPT_pg))
10450 CmdArgs.push_back("-lpthread_p");
10451 else
10452 CmdArgs.push_back("-lpthread");
10453 }
10454
10455 if (Args.hasArg(options::OPT_pg)) {
10456 if (Args.hasArg(options::OPT_shared))
10457 CmdArgs.push_back("-lc");
10458 else {
10459 if (Args.hasArg(options::OPT_static)) {
10460 CmdArgs.push_back("--start-group");
10461 CmdArgs.push_back("-lc_p");
10462 CmdArgs.push_back("-lpthread_p");
10463 CmdArgs.push_back("--end-group");
10464 } else {
10465 CmdArgs.push_back("-lc_p");
10466 }
10467 }
10468 CmdArgs.push_back("-lgcc_p");
10469 } else {
10470 if (Args.hasArg(options::OPT_static)) {
10471 CmdArgs.push_back("--start-group");
10472 CmdArgs.push_back("-lc");
10473 CmdArgs.push_back("-lpthread");
10474 CmdArgs.push_back("--end-group");
10475 } else {
10476 CmdArgs.push_back("-lc");
10477 }
10478 CmdArgs.push_back("-lcompiler_rt");
10479 }
10480
10481 if (Args.hasArg(options::OPT_static)) {
10482 CmdArgs.push_back("-lstdc++");
10483 } else if (Args.hasArg(options::OPT_pg)) {
10484 CmdArgs.push_back("-lgcc_eh_p");
10485 } else {
10486 CmdArgs.push_back("--as-needed");
10487 CmdArgs.push_back("-lstdc++");
10488 CmdArgs.push_back("--no-as-needed");
10489 }
10490 }
10491
Douglas Katzman78b37b02015-11-17 20:28:07 +000010492 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010493 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10494 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10495 else
10496 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10497 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10498 }
10499
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010500 const char *Exec =
10501#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010502 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010503#else
10504 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10505#endif
10506
10507 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10508}
10509
10510void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10511 const InputInfo &Output,
10512 const InputInfoList &Inputs,
10513 const ArgList &Args,
10514 const char *LinkingOutput) const {
10515 const toolchains::FreeBSD &ToolChain =
10516 static_cast<const toolchains::FreeBSD &>(getToolChain());
10517 const Driver &D = ToolChain.getDriver();
10518 bool PS4Linker;
10519 StringRef LinkerOptName;
10520 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10521 LinkerOptName = A->getValue();
10522 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10523 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10524 }
10525
10526 if (LinkerOptName == "gold")
10527 PS4Linker = false;
10528 else if (LinkerOptName == "ps4")
10529 PS4Linker = true;
10530 else
10531 PS4Linker = !Args.hasArg(options::OPT_shared);
10532
10533 if (PS4Linker)
10534 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10535 else
10536 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10537}