blob: 44d6b8464a5eba4ca9c42b6cb7cf19f20e6342dc [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000389 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000390 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000391 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
393 RenderedImplicitInclude = true;
394
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000395 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000396 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000397
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000398 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000399 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000400 SmallString<128> P(A->getValue());
401 // We want the files to have a name like foo.h.pch. Add a dummy extension
402 // so that replace_extension does the right thing.
403 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000404 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000405 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000406 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000407 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000408 }
409
Douglas Gregor111af7d2009-04-18 00:34:01 +0000410 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000411 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000412 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000413 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000414 }
415
Douglas Gregor111af7d2009-04-18 00:34:01 +0000416 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000417 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000418 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000419 FoundPCH = UsePCH;
420 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000421 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000422 }
423
424 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000425 if (IsFirstImplicitInclude) {
426 A->claim();
427 if (UsePCH)
428 CmdArgs.push_back("-include-pch");
429 else
430 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000431 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000432 continue;
433 } else {
434 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000435 D.Diag(diag::warn_drv_pch_not_first_include) << P
436 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000437 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000438 }
439 }
440
441 // Not translated, render as usual.
442 A->claim();
443 A->render(Args, CmdArgs);
444 }
445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000446 Args.AddAllArgs(CmdArgs,
447 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
448 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000450 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000451
452 // FIXME: There is a very unfortunate problem here, some troubled
453 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
454 // really support that we would have to parse and then translate
455 // those options. :(
456 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
457 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000458
459 // -I- is a deprecated GCC feature, reject it.
460 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000462
463 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
464 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000465 StringRef sysroot = C.getSysRoot();
466 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000467 if (!Args.hasArg(options::OPT_isysroot)) {
468 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000470 }
471 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000472
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000473 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000474 // FIXME: We should probably sink the logic for handling these from the
475 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000476 // CPATH - included following the user specified includes (but prior to
477 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000478 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000479 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000480 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000481 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000482 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000483 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000484 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000485 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000486 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000487
Artem Belevichfa11ab52015-11-17 22:28:46 +0000488 // Optional AuxToolChain indicates that we need to include headers
489 // for more than one target. If that's the case, add include paths
490 // from AuxToolChain right after include paths of the same kind for
491 // the current target.
492
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000493 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000494 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000495 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000496 if (AuxToolChain)
497 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
498 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000499
500 // Add system include arguments.
501 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000502 if (AuxToolChain)
503 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
504
505 // Add CUDA include arguments, if needed.
506 if (types::isCuda(Inputs[0].getType()))
507 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000508}
509
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000510// FIXME: Move to target hook.
511static bool isSignedCharDefault(const llvm::Triple &Triple) {
512 switch (Triple.getArch()) {
513 default:
514 return true;
515
Tim Northover9bb857a2013-01-31 12:13:10 +0000516 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000517 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000518 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000519 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000522 if (Triple.isOSDarwin() || Triple.isOSWindows())
523 return true;
524 return false;
525
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000526 case llvm::Triple::ppc:
527 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000528 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 return true;
530 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000531
David Majnemerdcecd932015-05-23 19:23:55 +0000532 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000533 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000534 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000535 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000536 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000537 }
538}
539
Robert Lytton0e076492013-08-13 09:43:10 +0000540static bool isNoCommonDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return false;
544
545 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000546 case llvm::Triple::wasm32:
547 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000548 return true;
549 }
550}
551
Renato Goline17c5802015-07-27 23:44:42 +0000552// ARM tools start.
553
554// Get SubArch (vN).
555static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
556 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000557 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000558}
559
560// True if M-profile.
561static bool isARMMProfile(const llvm::Triple &Triple) {
562 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000563 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000564 return Profile == llvm::ARM::PK_M;
565}
566
567// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000568static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
569 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000570 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
571 CPU = A->getValue();
572 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
573 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000574 if (!FromAs)
575 return;
576
577 for (const Arg *A :
578 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
579 StringRef Value = A->getValue();
580 if (Value.startswith("-mcpu="))
581 CPU = Value.substr(6);
582 if (Value.startswith("-march="))
583 Arch = Value.substr(7);
584 }
Renato Goline17c5802015-07-27 23:44:42 +0000585}
586
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000587// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000588// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000589static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000590 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000591 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000592 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
593 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000596
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000597// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000598static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000599 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000600 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000601 unsigned FPUID = llvm::ARM::parseFPU(FPU);
602 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000603 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
604}
605
Bradley Smithbbf5a002015-11-18 16:33:48 +0000606// Decode ARM features from string like +[no]featureA+[no]featureB+...
607static bool DecodeARMFeatures(const Driver &D, StringRef text,
608 std::vector<const char *> &Features) {
609 SmallVector<StringRef, 8> Split;
610 text.split(Split, StringRef("+"), -1, false);
611
612 for (StringRef Feature : Split) {
613 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
614 if (FeatureName)
615 Features.push_back(FeatureName);
616 else
617 return false;
618 }
619 return true;
620}
621
Renato Golin7c542b42015-07-27 23:44:45 +0000622// Check if -march is valid by checking if it can be canonicalised and parsed.
623// getARMArch is used here instead of just checking the -march value in order
624// to handle -march=native correctly.
625static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000626 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000628 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000629 std::pair<StringRef, StringRef> Split = ArchName.split("+");
630
Renato Goline17c5802015-07-27 23:44:42 +0000631 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000632 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
633 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000634 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000635}
636
Renato Golin7c542b42015-07-27 23:44:45 +0000637// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
638static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
639 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000640 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000641 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000642 std::pair<StringRef, StringRef> Split = CPUName.split("+");
643
Renato Goline17c5802015-07-27 23:44:42 +0000644 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000645 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
646 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000647 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000648}
649
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000650static bool useAAPCSForMachO(const llvm::Triple &T) {
651 // The backend is hardwired to assume AAPCS for M-class processors, ensure
652 // the frontend matches that.
653 return T.getEnvironment() == llvm::Triple::EABI ||
654 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
655}
656
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000657// Select the float ABI as determined by -msoft-float, -mhard-float, and
658// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000659arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
660 const Driver &D = TC.getDriver();
661 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 auto SubArch = getARMSubArchVersionNumber(Triple);
663 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000664 if (Arg *A =
665 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
666 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000667 if (A->getOption().matches(options::OPT_msoft_float)) {
668 ABI = FloatABI::Soft;
669 } else if (A->getOption().matches(options::OPT_mhard_float)) {
670 ABI = FloatABI::Hard;
671 } else {
672 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
673 .Case("soft", FloatABI::Soft)
674 .Case("softfp", FloatABI::SoftFP)
675 .Case("hard", FloatABI::Hard)
676 .Default(FloatABI::Invalid);
677 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000678 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000679 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 }
681 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000682
683 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
684 // "apcs-gnu".
685 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000686 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000687 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
688 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000689 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000690 }
691
692 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000694 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000695 case llvm::Triple::Darwin:
696 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000697 case llvm::Triple::IOS:
698 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000699 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000700 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000701 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000702 break;
703 }
Tim Northover756447a2015-10-30 16:30:36 +0000704 case llvm::Triple::WatchOS:
705 ABI = FloatABI::Hard;
706 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000707
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000708 // FIXME: this is invalid for WindowsCE
709 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000710 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000711 break;
712
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000715 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000716 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000717 break;
718 default:
719 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000720 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000721 break;
722 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000723 break;
724
Daniel Dunbar78485922009-09-10 23:00:09 +0000725 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000727 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000728 case llvm::Triple::EABIHF:
729 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000730 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000732 case llvm::Triple::EABI:
733 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000734 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000735 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000736 case llvm::Triple::Android:
737 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000738 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000742 if (Triple.getOS() != llvm::Triple::UnknownOS ||
743 !Triple.isOSBinFormatMachO())
744 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000745 break;
746 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000747 }
748 }
749
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 assert(ABI != FloatABI::Invalid && "must select an ABI");
751 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752}
753
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000754static void getARMTargetFeatures(const ToolChain &TC,
755 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000757 std::vector<const char *> &Features,
758 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000759 const Driver &D = TC.getDriver();
760
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000761 bool KernelOrKext =
762 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000763 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000764 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
765 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
766
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 if (!ForAS) {
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
770 // stripped out by the ARM target. We should probably pass this a new
771 // -target-option, which is handled by the -cc1/-cc1as invocation.
772 //
773 // FIXME2: For consistency, it would be ideal if we set up the target
774 // machine state the same when using the frontend or the assembler. We don't
775 // currently do that for the assembler, we pass the options directly to the
776 // backend and never even instantiate the frontend TargetInfo. If we did,
777 // and used its handleTargetFeatures hook, then we could ensure the
778 // assembler and the frontend behave the same.
779
780 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000782 Features.push_back("+soft-float");
783
784 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000786 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000787 } else {
788 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
789 // to the assembler correctly.
790 for (const Arg *A :
791 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
792 StringRef Value = A->getValue();
793 if (Value.startswith("-mfpu=")) {
794 WaFPU = A;
795 } else if (Value.startswith("-mcpu=")) {
796 WaCPU = A;
797 } else if (Value.startswith("-mhwdiv=")) {
798 WaHDiv = A;
799 } else if (Value.startswith("-march=")) {
800 WaArch = A;
801 }
802 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000803 }
804
Renato Golin7c542b42015-07-27 23:44:45 +0000805 // Check -march. ClangAs gives preference to -Wa,-march=.
806 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000807 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000808 if (WaArch) {
809 if (ArchArg)
810 D.Diag(clang::diag::warn_drv_unused_argument)
811 << ArchArg->getAsString(Args);
812 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000814 // FIXME: Set Arch.
815 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
816 } else if (ArchArg) {
817 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000818 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000819 }
820
Renato Golin7c542b42015-07-27 23:44:45 +0000821 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
822 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000823 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000824 if (WaCPU) {
825 if (CPUArg)
826 D.Diag(clang::diag::warn_drv_unused_argument)
827 << CPUArg->getAsString(Args);
828 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000829 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000830 } else if (CPUArg) {
831 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000832 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000833 }
John Brawna95c1a82015-05-08 12:52:18 +0000834
Renato Golin23459c62015-07-30 16:40:17 +0000835 // Add CPU features for generic CPUs
836 if (CPUName == "native") {
837 llvm::StringMap<bool> HostFeatures;
838 if (llvm::sys::getHostCPUFeatures(HostFeatures))
839 for (auto &F : HostFeatures)
840 Features.push_back(
841 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
842 }
843
844 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
845 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
846 if (WaFPU) {
847 if (FPUArg)
848 D.Diag(clang::diag::warn_drv_unused_argument)
849 << FPUArg->getAsString(Args);
850 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
851 Features);
852 } else if (FPUArg) {
853 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
854 }
855
856 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
857 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
858 if (WaHDiv) {
859 if (HDivArg)
860 D.Diag(clang::diag::warn_drv_unused_argument)
861 << HDivArg->getAsString(Args);
862 getARMHWDivFeatures(D, WaHDiv, Args,
863 StringRef(WaHDiv->getValue()).substr(8), Features);
864 } else if (HDivArg)
865 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
866
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000867 // Setting -msoft-float effectively disables NEON because of the GCC
868 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000869 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000870 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000871 // Also need to explicitly disable features which imply NEON.
872 Features.push_back("-crypto");
873 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000874
Eric Christopher269c2a22015-04-04 03:34:43 +0000875 // En/disable crc code generation.
876 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000877 if (A->getOption().matches(options::OPT_mcrc))
878 Features.push_back("+crc");
879 else
880 Features.push_back("-crc");
881 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000882
Akira Hatanakac2694822015-07-07 08:28:42 +0000883 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
884 // neither options are specified, see if we are compiling for kernel/kext and
885 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
887 options::OPT_mno_long_calls)) {
888 if (A->getOption().matches(options::OPT_mlong_calls))
889 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000890 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
891 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000892 Features.push_back("+long-calls");
893 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000894
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000895 // Kernel code has more strict alignment requirements.
896 if (KernelOrKext)
897 Features.push_back("+strict-align");
898 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
899 options::OPT_munaligned_access)) {
900 if (A->getOption().matches(options::OPT_munaligned_access)) {
901 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
902 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
903 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
904 } else
905 Features.push_back("+strict-align");
906 } else {
907 // Assume pre-ARMv6 doesn't support unaligned accesses.
908 //
909 // ARMv6 may or may not support unaligned accesses depending on the
910 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
911 // Darwin and NetBSD targets support unaligned accesses, and others don't.
912 //
913 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
914 // which raises an alignment fault on unaligned accesses. Linux
915 // defaults this bit to 0 and handles it as a system-wide (not
916 // per-process) setting. It is therefore safe to assume that ARMv7+
917 // Linux targets support unaligned accesses. The same goes for NaCl.
918 //
919 // The above behavior is consistent with GCC.
920 int VersionNum = getARMSubArchVersionNumber(Triple);
921 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000922 if (VersionNum < 6 ||
923 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000924 Features.push_back("+strict-align");
925 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
926 if (VersionNum < 7)
927 Features.push_back("+strict-align");
928 } else
929 Features.push_back("+strict-align");
930 }
931
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000932 // llvm does not support reserving registers in general. There is support
933 // for reserving r9 on ARM though (defined as a platform-specific register
934 // in ARM EABI).
935 if (Args.hasArg(options::OPT_ffixed_r9))
936 Features.push_back("+reserve-r9");
937
Dimitry Andric08107392016-01-06 07:42:18 +0000938 // The kext linker doesn't know how to deal with movw/movt.
939 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000940 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000942
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000943void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
944 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000946 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000947 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000950 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000951 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000952 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000953 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +0000954 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +0000955 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 } else {
957 ABIName = "apcs-gnu";
958 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000959 } else if (Triple.isOSWindows()) {
960 // FIXME: this is invalid for WindowsCE
961 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000962 } else {
963 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000964 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000965 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000966 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000967 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000968 ABIName = "aapcs-linux";
969 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000970 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 case llvm::Triple::EABI:
972 ABIName = "aapcs";
973 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000974 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000975 if (Triple.getOS() == llvm::Triple::NetBSD)
976 ABIName = "apcs-gnu";
977 else
978 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000979 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000980 }
981 }
982 CmdArgs.push_back("-target-abi");
983 CmdArgs.push_back(ABIName);
984
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000985 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000986 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000987 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000988 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000989 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000990 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000991 CmdArgs.push_back("-mfloat-abi");
992 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000993 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000994 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 } else {
998 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000999 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001000 CmdArgs.push_back("-mfloat-abi");
1001 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001002 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001003
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001004 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1006 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001009 CmdArgs.push_back("-arm-global-merge=false");
1010 else
1011 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001012 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001013
Bob Wilson9c8af452013-04-11 18:53:25 +00001014 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001015 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001016 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001017}
Renato Goline17c5802015-07-27 23:44:42 +00001018// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001019
Tim Northover573cbee2014-05-24 12:52:07 +00001020/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1021/// targeting.
1022static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001023 Arg *A;
1024 std::string CPU;
1025 // If we have -mtune or -mcpu, use that.
1026 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001027 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001028 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001029 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001030 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001031 }
1032
Kevin Qin110db6f2014-07-18 07:03:22 +00001033 // Handle CPU name is 'native'.
1034 if (CPU == "native")
1035 return llvm::sys::getHostCPUName();
1036 else if (CPU.size())
1037 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001038
James Molloy9b1586b2014-04-17 12:51:17 +00001039 // Make sure we pick "cyclone" if -arch is used.
1040 // FIXME: Should this be picked by checking the target triple instead?
1041 if (Args.getLastArg(options::OPT_arch))
1042 return "cyclone";
1043
1044 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001045}
1046
Tim Northover573cbee2014-05-24 12:52:07 +00001047void Clang::AddAArch64TargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001049 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1050 llvm::Triple Triple(TripleStr);
1051
1052 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1053 Args.hasArg(options::OPT_mkernel) ||
1054 Args.hasArg(options::OPT_fapple_kext))
1055 CmdArgs.push_back("-disable-red-zone");
1056
1057 if (!Args.hasFlag(options::OPT_mimplicit_float,
1058 options::OPT_mno_implicit_float, true))
1059 CmdArgs.push_back("-no-implicit-float");
1060
Craig Topper92fc2df2014-05-17 16:56:41 +00001061 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001062 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1063 ABIName = A->getValue();
1064 else if (Triple.isOSDarwin())
1065 ABIName = "darwinpcs";
1066 else
1067 ABIName = "aapcs";
1068
1069 CmdArgs.push_back("-target-abi");
1070 CmdArgs.push_back(ABIName);
1071
Bradley Smith9ff64332014-10-13 10:16:06 +00001072 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1073 options::OPT_mno_fix_cortex_a53_835769)) {
1074 CmdArgs.push_back("-backend-option");
1075 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1076 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1077 else
1078 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001079 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001080 // Enabled A53 errata (835769) workaround by default on android
1081 CmdArgs.push_back("-backend-option");
1082 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001083 }
1084
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001085 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001086 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1087 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001090 CmdArgs.push_back("-aarch64-global-merge=false");
1091 else
1092 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001093 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001094}
1095
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001096// Get CPU and ABI names. They are not independent
1097// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001098void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1099 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001100 const char *DefMips32CPU = "mips32r2";
1101 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001102
Daniel Sanders2bf13662014-07-10 14:40:57 +00001103 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1104 // default for mips64(el)?-img-linux-gnu.
1105 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1106 Triple.getEnvironment() == llvm::Triple::GNU) {
1107 DefMips32CPU = "mips32r6";
1108 DefMips64CPU = "mips64r6";
1109 }
Renato Golin7c542b42015-07-27 23:44:45 +00001110
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001111 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001112 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001113 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001114
Brad Smithba26f582015-01-06 02:53:17 +00001115 // MIPS3 is the default for mips64*-unknown-openbsd.
1116 if (Triple.getOS() == llvm::Triple::OpenBSD)
1117 DefMips64CPU = "mips3";
1118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001119 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001120 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001121
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001122 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001123 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001124 // Convert a GNU style Mips ABI name to the name
1125 // accepted by LLVM Mips backend.
1126 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001127 .Case("32", "o32")
1128 .Case("64", "n64")
1129 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001130 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001131
1132 // Setup default CPU and ABI names.
1133 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001134 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001135 default:
1136 llvm_unreachable("Unexpected triple arch name");
1137 case llvm::Triple::mips:
1138 case llvm::Triple::mipsel:
1139 CPUName = DefMips32CPU;
1140 break;
1141 case llvm::Triple::mips64:
1142 case llvm::Triple::mips64el:
1143 CPUName = DefMips64CPU;
1144 break;
1145 }
1146 }
1147
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001148 if (ABIName.empty()) {
1149 // Deduce ABI name from the target triple.
1150 if (Triple.getArch() == llvm::Triple::mips ||
1151 Triple.getArch() == llvm::Triple::mipsel)
1152 ABIName = "o32";
1153 else
1154 ABIName = "n64";
1155 }
1156
1157 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001158 // Deduce CPU name from ABI name.
1159 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001160 .Cases("o32", "eabi", DefMips32CPU)
1161 .Cases("n32", "n64", DefMips64CPU)
1162 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001163 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001164
1165 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001166}
1167
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001168std::string mips::getMipsABILibSuffix(const ArgList &Args,
1169 const llvm::Triple &Triple) {
1170 StringRef CPUName, ABIName;
1171 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1172 return llvm::StringSwitch<std::string>(ABIName)
1173 .Case("o32", "")
1174 .Case("n32", "32")
1175 .Case("n64", "64");
1176}
1177
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001178// Convert ABI name to the GNU tools acceptable variant.
1179static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1180 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001181 .Case("o32", "32")
1182 .Case("n64", "64")
1183 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001184}
1185
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001186// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1187// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001188static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1189 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001190 if (Arg *A =
1191 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1192 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001193 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001194 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001196 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001197 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001198 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1199 .Case("soft", mips::FloatABI::Soft)
1200 .Case("hard", mips::FloatABI::Hard)
1201 .Default(mips::FloatABI::Invalid);
1202 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001203 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001204 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001205 }
1206 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001207 }
1208
1209 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001210 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001211 // Assume "hard", because it's a default value used by gcc.
1212 // When we start to recognize specific target MIPS processors,
1213 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001214 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001215 }
1216
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1218 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001219}
1220
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001221static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001222 std::vector<const char *> &Features,
1223 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224 StringRef FeatureName) {
1225 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001226 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001227 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001228 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001229 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001230 }
1231}
1232
Daniel Sanders379d44b2014-07-16 11:52:23 +00001233static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1234 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001235 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236 StringRef CPUName;
1237 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001238 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 ABIName = getGnuCompatibleMipsABIName(ABIName);
1240
Daniel Sandersfeb61302014-08-08 15:47:17 +00001241 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1242 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001243
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001244 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1245 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001246 // FIXME: Note, this is a hack. We need to pass the selected float
1247 // mode to the MipsTargetInfoBase to define appropriate macros there.
1248 // Now it is the only method.
1249 Features.push_back("+soft-float");
1250 }
1251
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001252 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001253 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001254 if (Val == "2008") {
1255 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1256 Features.push_back("+nan2008");
1257 else {
1258 Features.push_back("-nan2008");
1259 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1260 }
1261 } else if (Val == "legacy") {
1262 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1263 Features.push_back("-nan2008");
1264 else {
1265 Features.push_back("+nan2008");
1266 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1267 }
1268 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001269 D.Diag(diag::err_drv_unsupported_option_argument)
1270 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001271 }
1272
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001273 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1274 options::OPT_mdouble_float, "single-float");
1275 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1276 "mips16");
1277 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1278 options::OPT_mno_micromips, "micromips");
1279 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1280 "dsp");
1281 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1282 "dspr2");
1283 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1284 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001285
1286 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1287 // pass -mfpxx
1288 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1289 options::OPT_mfp64)) {
1290 if (A->getOption().matches(options::OPT_mfp32))
1291 Features.push_back(Args.MakeArgString("-fp64"));
1292 else if (A->getOption().matches(options::OPT_mfpxx)) {
1293 Features.push_back(Args.MakeArgString("+fpxx"));
1294 Features.push_back(Args.MakeArgString("+nooddspreg"));
1295 } else
1296 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001297 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001298 Features.push_back(Args.MakeArgString("+fpxx"));
1299 Features.push_back(Args.MakeArgString("+nooddspreg"));
1300 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301
Daniel Sanders28e5d392014-07-10 10:39:51 +00001302 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1303 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304}
1305
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001306void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001307 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001308 const Driver &D = getToolChain().getDriver();
1309 StringRef CPUName;
1310 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001311 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001313
1314 CmdArgs.push_back("-target-abi");
1315 CmdArgs.push_back(ABIName.data());
1316
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001317 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1318 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001319 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001320 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001321 CmdArgs.push_back("-mfloat-abi");
1322 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001325 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001326 CmdArgs.push_back("-mfloat-abi");
1327 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001328 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001329
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1331 if (A->getOption().matches(options::OPT_mxgot)) {
1332 CmdArgs.push_back("-mllvm");
1333 CmdArgs.push_back("-mxgot");
1334 }
1335 }
1336
Simon Atanasyanc580b322013-05-11 06:33:44 +00001337 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1338 options::OPT_mno_ldc1_sdc1)) {
1339 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back("-mno-ldc1-sdc1");
1342 }
1343 }
1344
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001345 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1346 options::OPT_mno_check_zero_division)) {
1347 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1348 CmdArgs.push_back("-mllvm");
1349 CmdArgs.push_back("-mno-check-zero-division");
1350 }
1351 }
1352
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001353 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001354 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001355 CmdArgs.push_back("-mllvm");
1356 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1357 A->claim();
1358 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001359}
1360
Hal Finkel8eb59282012-06-11 22:35:19 +00001361/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1362static std::string getPPCTargetCPU(const ArgList &Args) {
1363 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001364 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001365
1366 if (CPUName == "native") {
1367 std::string CPU = llvm::sys::getHostCPUName();
1368 if (!CPU.empty() && CPU != "generic")
1369 return CPU;
1370 else
1371 return "";
1372 }
1373
1374 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001375 .Case("common", "generic")
1376 .Case("440", "440")
1377 .Case("440fp", "440")
1378 .Case("450", "450")
1379 .Case("601", "601")
1380 .Case("602", "602")
1381 .Case("603", "603")
1382 .Case("603e", "603e")
1383 .Case("603ev", "603ev")
1384 .Case("604", "604")
1385 .Case("604e", "604e")
1386 .Case("620", "620")
1387 .Case("630", "pwr3")
1388 .Case("G3", "g3")
1389 .Case("7400", "7400")
1390 .Case("G4", "g4")
1391 .Case("7450", "7450")
1392 .Case("G4+", "g4+")
1393 .Case("750", "750")
1394 .Case("970", "970")
1395 .Case("G5", "g5")
1396 .Case("a2", "a2")
1397 .Case("a2q", "a2q")
1398 .Case("e500mc", "e500mc")
1399 .Case("e5500", "e5500")
1400 .Case("power3", "pwr3")
1401 .Case("power4", "pwr4")
1402 .Case("power5", "pwr5")
1403 .Case("power5x", "pwr5x")
1404 .Case("power6", "pwr6")
1405 .Case("power6x", "pwr6x")
1406 .Case("power7", "pwr7")
1407 .Case("power8", "pwr8")
1408 .Case("pwr3", "pwr3")
1409 .Case("pwr4", "pwr4")
1410 .Case("pwr5", "pwr5")
1411 .Case("pwr5x", "pwr5x")
1412 .Case("pwr6", "pwr6")
1413 .Case("pwr6x", "pwr6x")
1414 .Case("pwr7", "pwr7")
1415 .Case("pwr8", "pwr8")
1416 .Case("powerpc", "ppc")
1417 .Case("powerpc64", "ppc64")
1418 .Case("powerpc64le", "ppc64le")
1419 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001420 }
1421
1422 return "";
1423}
1424
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001425static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1426 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001427 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001428 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001429
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001430 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1431 if (FloatABI == ppc::FloatABI::Soft &&
1432 !(Triple.getArch() == llvm::Triple::ppc64 ||
1433 Triple.getArch() == llvm::Triple::ppc64le))
1434 Features.push_back("+soft-float");
1435 else if (FloatABI == ppc::FloatABI::Soft &&
1436 (Triple.getArch() == llvm::Triple::ppc64 ||
1437 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001438 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001439 << "soft float is not supported for ppc64";
1440
Eric Christopher643bb6a2013-10-16 20:40:08 +00001441 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001442 AddTargetFeature(Args, Features, options::OPT_faltivec,
1443 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001444}
1445
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001446ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1447 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1448 if (Arg *A =
1449 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1450 options::OPT_mfloat_abi_EQ)) {
1451 if (A->getOption().matches(options::OPT_msoft_float))
1452 ABI = ppc::FloatABI::Soft;
1453 else if (A->getOption().matches(options::OPT_mhard_float))
1454 ABI = ppc::FloatABI::Hard;
1455 else {
1456 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1457 .Case("soft", ppc::FloatABI::Soft)
1458 .Case("hard", ppc::FloatABI::Hard)
1459 .Default(ppc::FloatABI::Invalid);
1460 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1461 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1462 ABI = ppc::FloatABI::Hard;
1463 }
1464 }
1465 }
1466
1467 // If unspecified, choose the default based on the platform.
1468 if (ABI == ppc::FloatABI::Invalid) {
1469 ABI = ppc::FloatABI::Hard;
1470 }
1471
1472 return ABI;
1473}
1474
Ulrich Weigand8afad612014-07-28 13:17:52 +00001475void Clang::AddPPCTargetArgs(const ArgList &Args,
1476 ArgStringList &CmdArgs) const {
1477 // Select the ABI to use.
1478 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001479 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001480 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001481 case llvm::Triple::ppc64: {
1482 // When targeting a processor that supports QPX, or if QPX is
1483 // specifically enabled, default to using the ABI that supports QPX (so
1484 // long as it is not specifically disabled).
1485 bool HasQPX = false;
1486 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1487 HasQPX = A->getValue() == StringRef("a2q");
1488 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1489 if (HasQPX) {
1490 ABIName = "elfv1-qpx";
1491 break;
1492 }
1493
Ulrich Weigand8afad612014-07-28 13:17:52 +00001494 ABIName = "elfv1";
1495 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 case llvm::Triple::ppc64le:
1498 ABIName = "elfv2";
1499 break;
1500 default:
1501 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001503
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001504 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1505 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1506 // the option if given as we don't have backend support for any targets
1507 // that don't use the altivec abi.
1508 if (StringRef(A->getValue()) != "altivec")
1509 ABIName = A->getValue();
1510
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001511 ppc::FloatABI FloatABI =
1512 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1513
1514 if (FloatABI == ppc::FloatABI::Soft) {
1515 // Floating point operations and argument passing are soft.
1516 CmdArgs.push_back("-msoft-float");
1517 CmdArgs.push_back("-mfloat-abi");
1518 CmdArgs.push_back("soft");
1519 } else {
1520 // Floating point operations and argument passing are hard.
1521 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1522 CmdArgs.push_back("-mfloat-abi");
1523 CmdArgs.push_back("hard");
1524 }
1525
Ulrich Weigand8afad612014-07-28 13:17:52 +00001526 if (ABIName) {
1527 CmdArgs.push_back("-target-abi");
1528 CmdArgs.push_back(ABIName);
1529 }
1530}
1531
1532bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1533 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1534 return A && (A->getValue() == StringRef(Value));
1535}
1536
Tom Stellard6674c702013-04-01 20:56:53 +00001537/// Get the (LLVM) name of the R600 gpu we are targeting.
1538static std::string getR600TargetGPU(const ArgList &Args) {
1539 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001540 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001541 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 .Cases("rv630", "rv635", "r600")
1543 .Cases("rv610", "rv620", "rs780", "rs880")
1544 .Case("rv740", "rv770")
1545 .Case("palm", "cedar")
1546 .Cases("sumo", "sumo2", "sumo")
1547 .Case("hemlock", "cypress")
1548 .Case("aruba", "cayman")
1549 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001550 }
1551 return "";
1552}
1553
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001554void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001555 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001556 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001557 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001558
James Y Knightb2406522015-06-15 20:51:24 +00001559 bool SoftFloatABI = false;
1560 if (Arg *A =
1561 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001562 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001563 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001564 }
1565
James Y Knightb2406522015-06-15 20:51:24 +00001566 // Only the hard-float ABI on Sparc is standardized, and it is the
1567 // default. GCC also supports a nonstandard soft-float ABI mode, and
1568 // perhaps LLVM should implement that, too. However, since llvm
1569 // currently does not support Sparc soft-float, at all, display an
1570 // error if it's requested.
1571 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001572 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1573 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001574 }
1575}
1576
Richard Sandiford4652d892013-07-19 16:51:51 +00001577static const char *getSystemZTargetCPU(const ArgList &Args) {
1578 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1579 return A->getValue();
1580 return "z10";
1581}
1582
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001583static void getSystemZTargetFeatures(const ArgList &Args,
1584 std::vector<const char *> &Features) {
1585 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001586 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001587 if (A->getOption().matches(options::OPT_mhtm))
1588 Features.push_back("+transactional-execution");
1589 else
1590 Features.push_back("-transactional-execution");
1591 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001592 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001593 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001594 if (A->getOption().matches(options::OPT_mvx))
1595 Features.push_back("+vector");
1596 else
1597 Features.push_back("-vector");
1598 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001599}
1600
Chandler Carruth953fb082013-01-13 11:46:33 +00001601static const char *getX86TargetCPU(const ArgList &Args,
1602 const llvm::Triple &Triple) {
1603 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001604 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 return "core-avx2";
1607
Chandler Carruth953fb082013-01-13 11:46:33 +00001608 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001610
1611 // FIXME: Reject attempts to use -march=native unless the target matches
1612 // the host.
1613 //
1614 // FIXME: We should also incorporate the detected target features for use
1615 // with -native.
1616 std::string CPU = llvm::sys::getHostCPUName();
1617 if (!CPU.empty() && CPU != "generic")
1618 return Args.MakeArgString(CPU);
1619 }
1620
Reid Kleckner3123eff2015-06-30 16:32:04 +00001621 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1622 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1623 StringRef Arch = A->getValue();
1624 const char *CPU;
1625 if (Triple.getArch() == llvm::Triple::x86) {
1626 CPU = llvm::StringSwitch<const char *>(Arch)
1627 .Case("IA32", "i386")
1628 .Case("SSE", "pentium3")
1629 .Case("SSE2", "pentium4")
1630 .Case("AVX", "sandybridge")
1631 .Case("AVX2", "haswell")
1632 .Default(nullptr);
1633 } else {
1634 CPU = llvm::StringSwitch<const char *>(Arch)
1635 .Case("AVX", "sandybridge")
1636 .Case("AVX2", "haswell")
1637 .Default(nullptr);
1638 }
1639 if (CPU)
1640 return CPU;
1641 }
1642
Chandler Carruth953fb082013-01-13 11:46:33 +00001643 // Select the default CPU if none was given (or detection failed).
1644
1645 if (Triple.getArch() != llvm::Triple::x86_64 &&
1646 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001647 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001648
1649 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1650
1651 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001653 if (Triple.getArchName() == "x86_64h")
1654 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001655 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001657
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001658 // Set up default CPU name for PS4 compilers.
1659 if (Triple.isPS4CPU())
1660 return "btver2";
1661
Alexey Bataev286d1b92014-01-31 04:07:13 +00001662 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001663 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001664 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001665
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001666 // Everything else goes to x86-64 in 64-bit mode.
1667 if (Is64Bit)
1668 return "x86-64";
1669
1670 switch (Triple.getOS()) {
1671 case llvm::Triple::FreeBSD:
1672 case llvm::Triple::NetBSD:
1673 case llvm::Triple::OpenBSD:
1674 return "i486";
1675 case llvm::Triple::Haiku:
1676 return "i586";
1677 case llvm::Triple::Bitrig:
1678 return "i686";
1679 default:
1680 // Fallback to p4.
1681 return "pentium4";
1682 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001683}
1684
Dan Gohmanc2853072015-09-03 22:51:53 +00001685/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1686static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1687 // If we have -mcpu=, use that.
1688 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1689 StringRef CPU = A->getValue();
1690
1691#ifdef __wasm__
1692 // Handle "native" by examining the host. "native" isn't meaningful when
1693 // cross compiling, so only support this when the host is also WebAssembly.
1694 if (CPU == "native")
1695 return llvm::sys::getHostCPUName();
1696#endif
1697
1698 return CPU;
1699 }
1700
1701 return "generic";
1702}
1703
Renato Golin7c542b42015-07-27 23:44:45 +00001704static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1705 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001707 default:
1708 return "";
1709
Amara Emerson703da2e2013-10-31 09:32:33 +00001710 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001711 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001712 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001713
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001714 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001715 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001716 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001717 case llvm::Triple::thumbeb: {
1718 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001719 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001720 return arm::getARMTargetCPU(MCPU, MArch, T);
1721 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001722 case llvm::Triple::mips:
1723 case llvm::Triple::mipsel:
1724 case llvm::Triple::mips64:
1725 case llvm::Triple::mips64el: {
1726 StringRef CPUName;
1727 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001728 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001729 return CPUName;
1730 }
1731
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001732 case llvm::Triple::nvptx:
1733 case llvm::Triple::nvptx64:
1734 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1735 return A->getValue();
1736 return "";
1737
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001738 case llvm::Triple::ppc:
1739 case llvm::Triple::ppc64:
1740 case llvm::Triple::ppc64le: {
1741 std::string TargetCPUName = getPPCTargetCPU(Args);
1742 // LLVM may default to generating code for the native CPU,
1743 // but, like gcc, we default to a more generic option for
1744 // each architecture. (except on Darwin)
1745 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1746 if (T.getArch() == llvm::Triple::ppc64)
1747 TargetCPUName = "ppc64";
1748 else if (T.getArch() == llvm::Triple::ppc64le)
1749 TargetCPUName = "ppc64le";
1750 else
1751 TargetCPUName = "ppc";
1752 }
1753 return TargetCPUName;
1754 }
1755
1756 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001757 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001758 case llvm::Triple::sparcv9:
1759 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001760 return A->getValue();
1761 return "";
1762
1763 case llvm::Triple::x86:
1764 case llvm::Triple::x86_64:
1765 return getX86TargetCPU(Args, T);
1766
1767 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001768 return "hexagon" +
1769 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001770
1771 case llvm::Triple::systemz:
1772 return getSystemZTargetCPU(Args);
1773
1774 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001775 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001776 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001777
1778 case llvm::Triple::wasm32:
1779 case llvm::Triple::wasm64:
1780 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001781 }
1782}
1783
Alp Tokerce365ca2013-12-02 12:43:03 +00001784static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001785 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001786 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1787 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1788 // forward.
1789 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 std::string Plugin =
1791 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001792 CmdArgs.push_back(Args.MakeArgString(Plugin));
1793
1794 // Try to pass driver level flags relevant to LTO code generation down to
1795 // the plugin.
1796
1797 // Handle flags for selecting CPU variants.
1798 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1799 if (!CPU.empty())
1800 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001801
James Molloyf97fdae2015-12-21 10:44:36 +00001802 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1803 StringRef OOpt;
1804 if (A->getOption().matches(options::OPT_O4) ||
1805 A->getOption().matches(options::OPT_Ofast))
1806 OOpt = "3";
1807 else if (A->getOption().matches(options::OPT_O))
1808 OOpt = A->getValue();
1809 else if (A->getOption().matches(options::OPT_O0))
1810 OOpt = "0";
1811 if (!OOpt.empty())
1812 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1813 }
1814
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001815 if (IsThinLTO)
1816 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001817
1818 // If an explicit debugger tuning argument appeared, pass it along.
1819 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1820 options::OPT_ggdbN_Group)) {
1821 if (A->getOption().matches(options::OPT_glldb))
1822 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1823 else if (A->getOption().matches(options::OPT_gsce))
1824 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1825 else
1826 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1827 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001828}
1829
Sanjay Patel2987c292015-06-11 14:53:41 +00001830/// This is a helper function for validating the optional refinement step
1831/// parameter in reciprocal argument strings. Return false if there is an error
1832/// parsing the refinement step. Otherwise, return true and set the Position
1833/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001834static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001835 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001836 const char RefinementStepToken = ':';
1837 Position = In.find(RefinementStepToken);
1838 if (Position != StringRef::npos) {
1839 StringRef Option = A.getOption().getName();
1840 StringRef RefStep = In.substr(Position + 1);
1841 // Allow exactly one numeric character for the additional refinement
1842 // step parameter. This is reasonable for all currently-supported
1843 // operations and architectures because we would expect that a larger value
1844 // of refinement steps would cause the estimate "optimization" to
1845 // under-perform the native operation. Also, if the estimate does not
1846 // converge quickly, it probably will not ever converge, so further
1847 // refinement steps will not produce a better answer.
1848 if (RefStep.size() != 1) {
1849 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1850 return false;
1851 }
1852 char RefStepChar = RefStep[0];
1853 if (RefStepChar < '0' || RefStepChar > '9') {
1854 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1855 return false;
1856 }
1857 }
1858 return true;
1859}
1860
1861/// The -mrecip flag requires processing of many optional parameters.
1862static void ParseMRecip(const Driver &D, const ArgList &Args,
1863 ArgStringList &OutStrings) {
1864 StringRef DisabledPrefixIn = "!";
1865 StringRef DisabledPrefixOut = "!";
1866 StringRef EnabledPrefixOut = "";
1867 StringRef Out = "-mrecip=";
1868
1869 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1870 if (!A)
1871 return;
1872
1873 unsigned NumOptions = A->getNumValues();
1874 if (NumOptions == 0) {
1875 // No option is the same as "all".
1876 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1877 return;
1878 }
1879
1880 // Pass through "all", "none", or "default" with an optional refinement step.
1881 if (NumOptions == 1) {
1882 StringRef Val = A->getValue(0);
1883 size_t RefStepLoc;
1884 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1885 return;
1886 StringRef ValBase = Val.slice(0, RefStepLoc);
1887 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1888 OutStrings.push_back(Args.MakeArgString(Out + Val));
1889 return;
1890 }
1891 }
1892
1893 // Each reciprocal type may be enabled or disabled individually.
1894 // Check each input value for validity, concatenate them all back together,
1895 // and pass through.
1896
1897 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 OptionStrings.insert(std::make_pair("divd", false));
1899 OptionStrings.insert(std::make_pair("divf", false));
1900 OptionStrings.insert(std::make_pair("vec-divd", false));
1901 OptionStrings.insert(std::make_pair("vec-divf", false));
1902 OptionStrings.insert(std::make_pair("sqrtd", false));
1903 OptionStrings.insert(std::make_pair("sqrtf", false));
1904 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1905 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001906
1907 for (unsigned i = 0; i != NumOptions; ++i) {
1908 StringRef Val = A->getValue(i);
1909
1910 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1911 // Ignore the disablement token for string matching.
1912 if (IsDisabled)
1913 Val = Val.substr(1);
1914
1915 size_t RefStep;
1916 if (!getRefinementStep(Val, D, *A, RefStep))
1917 return;
1918
1919 StringRef ValBase = Val.slice(0, RefStep);
1920 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1921 if (OptionIter == OptionStrings.end()) {
1922 // Try again specifying float suffix.
1923 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1924 if (OptionIter == OptionStrings.end()) {
1925 // The input name did not match any known option string.
1926 D.Diag(diag::err_drv_unknown_argument) << Val;
1927 return;
1928 }
1929 // The option was specified without a float or double suffix.
1930 // Make sure that the double entry was not already specified.
1931 // The float entry will be checked below.
1932 if (OptionStrings[ValBase.str() + 'd']) {
1933 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1934 return;
1935 }
1936 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001937
Sanjay Patel2987c292015-06-11 14:53:41 +00001938 if (OptionIter->second == true) {
1939 // Duplicate option specified.
1940 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1941 return;
1942 }
1943
1944 // Mark the matched option as found. Do not allow duplicate specifiers.
1945 OptionIter->second = true;
1946
1947 // If the precision was not specified, also mark the double entry as found.
1948 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1949 OptionStrings[ValBase.str() + 'd'] = true;
1950
1951 // Build the output string.
1952 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1953 Out = Args.MakeArgString(Out + Prefix + Val);
1954 if (i != NumOptions - 1)
1955 Out = Args.MakeArgString(Out + ",");
1956 }
1957
1958 OutStrings.push_back(Args.MakeArgString(Out));
1959}
1960
Eric Christopherc54920a2015-03-23 19:26:05 +00001961static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001962 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 // If -march=native, autodetect the feature list.
1965 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1966 if (StringRef(A->getValue()) == "native") {
1967 llvm::StringMap<bool> HostFeatures;
1968 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1969 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001970 Features.push_back(
1971 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001972 }
1973 }
1974
Jim Grosbach82eee262013-11-16 00:53:35 +00001975 if (Triple.getArchName() == "x86_64h") {
1976 // x86_64h implies quite a few of the more modern subtarget features
1977 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1978 Features.push_back("-rdrnd");
1979 Features.push_back("-aes");
1980 Features.push_back("-pclmul");
1981 Features.push_back("-rtm");
1982 Features.push_back("-hle");
1983 Features.push_back("-fsgsbase");
1984 }
1985
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001986 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001987 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001988 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001990 Features.push_back("+sse4.2");
1991 Features.push_back("+popcnt");
1992 } else
1993 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001994 }
1995
Eric Christopherc54920a2015-03-23 19:26:05 +00001996 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001997 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1998 StringRef Arch = A->getValue();
1999 bool ArchUsed = false;
2000 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002001 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002002 if (Arch == "AVX" || Arch == "AVX2") {
2003 ArchUsed = true;
2004 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2005 }
2006 }
2007 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002008 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002009 if (Arch == "IA32") {
2010 ArchUsed = true;
2011 } else if (Arch == "SSE" || Arch == "SSE2") {
2012 ArchUsed = true;
2013 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2014 }
2015 }
2016 if (!ArchUsed)
2017 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2018 }
2019
Jim Grosbach82eee262013-11-16 00:53:35 +00002020 // Now add any that the user explicitly requested on the command line,
2021 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002022 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002023}
2024
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002025void Clang::AddX86TargetArgs(const ArgList &Args,
2026 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002027 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002028 Args.hasArg(options::OPT_mkernel) ||
2029 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002030 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002031
Bob Wilson2616e2e2013-02-10 16:01:41 +00002032 // Default to avoid implicit floating-point for kernel/kext code, but allow
2033 // that to be overridden with -mno-soft-float.
2034 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2035 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 if (Arg *A = Args.getLastArg(
2037 options::OPT_msoft_float, options::OPT_mno_soft_float,
2038 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002039 const Option &O = A->getOption();
2040 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2041 O.matches(options::OPT_msoft_float));
2042 }
2043 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002044 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002045
2046 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2047 StringRef Value = A->getValue();
2048 if (Value == "intel" || Value == "att") {
2049 CmdArgs.push_back("-mllvm");
2050 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2051 } else {
2052 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2053 << A->getOption().getName() << Value;
2054 }
2055 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002056}
2057
Tony Linthicum76329bf2011-12-12 21:14:55 +00002058void Clang::AddHexagonTargetArgs(const ArgList &Args,
2059 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002060 CmdArgs.push_back("-mqdsp6-compat");
2061 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002063 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2064 std::string N = llvm::utostr(G.getValue());
2065 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002066 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002067 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002068 }
2069
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002070 if (!Args.hasArg(options::OPT_fno_short_enums))
2071 CmdArgs.push_back("-fshort-enums");
2072 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002073 CmdArgs.push_back("-mllvm");
2074 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002075 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 CmdArgs.push_back("-mllvm");
2077 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002078}
2079
Dan Gohmane3d71e12016-01-07 01:00:21 +00002080void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2081 ArgStringList &CmdArgs) const {
2082 // Default to "hidden" visibility.
2083 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2084 options::OPT_fvisibility_ms_compat)) {
2085 CmdArgs.push_back("-fvisibility");
2086 CmdArgs.push_back("hidden");
2087 }
2088}
2089
Kevin Qin110db6f2014-07-18 07:03:22 +00002090// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002091static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002092 std::vector<const char *> &Features) {
2093 SmallVector<StringRef, 8> Split;
2094 text.split(Split, StringRef("+"), -1, false);
2095
Benjamin Kramer72e64312015-09-24 14:48:49 +00002096 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002097 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002098 .Case("fp", "+fp-armv8")
2099 .Case("simd", "+neon")
2100 .Case("crc", "+crc")
2101 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002102 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002103 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002104 .Case("nofp", "-fp-armv8")
2105 .Case("nosimd", "-neon")
2106 .Case("nocrc", "-crc")
2107 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002108 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002109 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002110 .Default(nullptr);
2111 if (result)
2112 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002113 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 D.Diag(diag::err_drv_no_neon_modifier);
2115 else
2116 return false;
2117 }
2118 return true;
2119}
2120
2121// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2122// decode CPU and feature.
2123static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2124 std::vector<const char *> &Features) {
2125 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2126 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002127 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002128 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2129 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002130 Features.push_back("+neon");
2131 Features.push_back("+crc");
2132 Features.push_back("+crypto");
2133 } else if (CPU == "generic") {
2134 Features.push_back("+neon");
2135 } else {
2136 return false;
2137 }
2138
2139 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2140 return false;
2141
2142 return true;
2143}
2144
2145static bool
2146getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2147 const ArgList &Args,
2148 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002149 std::string MarchLowerCase = March.lower();
2150 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002153 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002154 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002155 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002156 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2157 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002158 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002159 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002160 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002161
2162 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2163 return false;
2164
2165 return true;
2166}
2167
2168static bool
2169getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2170 const ArgList &Args,
2171 std::vector<const char *> &Features) {
2172 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002173 std::string McpuLowerCase = Mcpu.lower();
2174 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002175 return false;
2176
2177 return true;
2178}
2179
2180static bool
2181getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2182 const ArgList &Args,
2183 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002184 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002185 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002186 if (MtuneLowerCase == "native")
2187 MtuneLowerCase = llvm::sys::getHostCPUName();
2188 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002189 Features.push_back("+zcm");
2190 Features.push_back("+zcz");
2191 }
2192 return true;
2193}
2194
2195static bool
2196getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2197 const ArgList &Args,
2198 std::vector<const char *> &Features) {
2199 StringRef CPU;
2200 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002201 std::string McpuLowerCase = Mcpu.lower();
2202 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002203 return false;
2204
2205 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2206}
2207
Justin Bognerf9052562015-11-13 23:07:31 +00002208static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002209 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002210 Arg *A;
2211 bool success = true;
2212 // Enable NEON by default.
2213 Features.push_back("+neon");
2214 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2215 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2216 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2217 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002218 else if (Args.hasArg(options::OPT_arch))
2219 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2220 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002221
2222 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2223 success =
2224 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2225 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2226 success =
2227 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002228 else if (Args.hasArg(options::OPT_arch))
2229 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2230 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002231
2232 if (!success)
2233 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002234
2235 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2236 Features.push_back("-fp-armv8");
2237 Features.push_back("-crypto");
2238 Features.push_back("-neon");
2239 }
Bradley Smith418c5932014-05-02 15:17:51 +00002240
2241 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002242 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002243 if (A->getOption().matches(options::OPT_mcrc))
2244 Features.push_back("+crc");
2245 else
2246 Features.push_back("-crc");
2247 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002248
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002249 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2250 options::OPT_munaligned_access))
2251 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2252 Features.push_back("+strict-align");
2253
Justin Bognerf9052562015-11-13 23:07:31 +00002254 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002255 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002256}
2257
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002258static void getHexagonTargetFeatures(const ArgList &Args,
2259 std::vector<const char *> &Features) {
2260 bool HasHVX = false, HasHVXD = false;
2261
Eric Christopher49062a52015-12-22 03:12:34 +00002262 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2263 // doing dependent option handling here rather than in initFeatureMap or a
2264 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002265 for (auto &A : Args) {
2266 auto &Opt = A->getOption();
2267 if (Opt.matches(options::OPT_mhexagon_hvx))
2268 HasHVX = true;
2269 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2270 HasHVXD = HasHVX = false;
2271 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2272 HasHVXD = HasHVX = true;
2273 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2274 HasHVXD = false;
2275 else
2276 continue;
2277 A->claim();
2278 }
2279
2280 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2281 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2282}
2283
Dan Gohmanc2853072015-09-03 22:51:53 +00002284static void getWebAssemblyTargetFeatures(const ArgList &Args,
2285 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002286 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002287}
2288
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002289static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002290 const ArgList &Args, ArgStringList &CmdArgs,
2291 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002292 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002293 std::vector<const char *> Features;
2294 switch (Triple.getArch()) {
2295 default:
2296 break;
2297 case llvm::Triple::mips:
2298 case llvm::Triple::mipsel:
2299 case llvm::Triple::mips64:
2300 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002301 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002302 break;
2303
2304 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002305 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002306 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002307 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002308 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002309 break;
2310
2311 case llvm::Triple::ppc:
2312 case llvm::Triple::ppc64:
2313 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002314 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002315 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002316 case llvm::Triple::systemz:
2317 getSystemZTargetFeatures(Args, Features);
2318 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002320 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002321 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002322 break;
2323 case llvm::Triple::x86:
2324 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002325 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002326 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002327 case llvm::Triple::hexagon:
2328 getHexagonTargetFeatures(Args, Features);
2329 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002330 case llvm::Triple::wasm32:
2331 case llvm::Triple::wasm64:
2332 getWebAssemblyTargetFeatures(Args, Features);
2333 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002334 }
Rafael Espindola43964802013-08-21 17:34:32 +00002335
2336 // Find the last of each feature.
2337 llvm::StringMap<unsigned> LastOpt;
2338 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2339 const char *Name = Features[I];
2340 assert(Name[0] == '-' || Name[0] == '+');
2341 LastOpt[Name + 1] = I;
2342 }
2343
2344 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2345 // If this feature was overridden, ignore it.
2346 const char *Name = Features[I];
2347 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2348 assert(LastI != LastOpt.end());
2349 unsigned Last = LastI->second;
2350 if (Last != I)
2351 continue;
2352
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002353 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002354 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002355 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002356}
2357
David Majnemerae394812014-12-09 00:12:30 +00002358static bool
2359shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2360 const llvm::Triple &Triple) {
2361 // We use the zero-cost exception tables for Objective-C if the non-fragile
2362 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2363 // later.
2364 if (runtime.isNonFragile())
2365 return true;
2366
2367 if (!Triple.isMacOSX())
2368 return false;
2369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002370 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002371 (Triple.getArch() == llvm::Triple::x86_64 ||
2372 Triple.getArch() == llvm::Triple::arm));
2373}
2374
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002375/// Adds exception related arguments to the driver command arguments. There's a
2376/// master flag, -fexceptions and also language specific flags to enable/disable
2377/// C++ and Objective-C exceptions. This makes it possible to for example
2378/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002379static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002380 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002381 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002382 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002383 const Driver &D = TC.getDriver();
2384 const llvm::Triple &Triple = TC.getTriple();
2385
Chad Rosier4fab82c2012-03-26 22:04:46 +00002386 if (KernelOrKext) {
2387 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2388 // arguments now to avoid warnings about unused arguments.
2389 Args.ClaimAllArgs(options::OPT_fexceptions);
2390 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2391 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2392 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2393 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002395 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002396 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002397
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002398 // See if the user explicitly enabled exceptions.
2399 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2400 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002401
David Majnemerae394812014-12-09 00:12:30 +00002402 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2403 // is not necessarily sensible, but follows GCC.
2404 if (types::isObjC(InputType) &&
2405 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002406 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002407 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002408
David Majnemerae394812014-12-09 00:12:30 +00002409 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002410 }
2411
2412 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002413 // Disable C++ EH by default on XCore, PS4, and MSVC.
2414 // FIXME: Remove MSVC from this list once things work.
2415 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2416 !Triple.isPS4CPU() &&
2417 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002418 Arg *ExceptionArg = Args.getLastArg(
2419 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2420 options::OPT_fexceptions, options::OPT_fno_exceptions);
2421 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002422 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002423 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2424 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002425
2426 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002427 if (Triple.isPS4CPU()) {
2428 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2429 assert(ExceptionArg &&
2430 "On the PS4 exceptions should only be enabled if passing "
2431 "an argument");
2432 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2433 const Arg *RTTIArg = TC.getRTTIArg();
2434 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2435 D.Diag(diag::err_drv_argument_not_allowed_with)
2436 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2437 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2438 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2439 } else
2440 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2441
Anders Carlssone96ab552011-02-28 02:27:16 +00002442 CmdArgs.push_back("-fcxx-exceptions");
2443
David Majnemer8de68642014-12-05 08:11:58 +00002444 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002445 }
2446 }
2447
David Majnemer8de68642014-12-05 08:11:58 +00002448 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002449 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002450}
2451
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002452static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002453 bool Default = true;
2454 if (TC.getTriple().isOSDarwin()) {
2455 // The native darwin assembler doesn't support the linker_option directives,
2456 // so we disable them if we think the .s file will be passed to it.
2457 Default = TC.useIntegratedAs();
2458 }
2459 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2460 Default);
2461}
2462
Ted Kremenek62093662013-03-12 17:02:12 +00002463static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2464 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002465 bool UseDwarfDirectory =
2466 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2467 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002468 return !UseDwarfDirectory;
2469}
2470
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002471/// \brief Check whether the given input tree contains any compilation actions.
2472static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002473 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002474 return true;
2475
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002476 for (const auto &Act : *A)
2477 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002478 return true;
2479
2480 return false;
2481}
2482
2483/// \brief Check if -relax-all should be passed to the internal assembler.
2484/// This is done by default when compiling non-assembler source with -O0.
2485static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2486 bool RelaxDefault = true;
2487
2488 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2489 RelaxDefault = A->getOption().matches(options::OPT_O0);
2490
2491 if (RelaxDefault) {
2492 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002493 for (const auto &Act : C.getActions()) {
2494 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002495 RelaxDefault = true;
2496 break;
2497 }
2498 }
2499 }
2500
2501 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002503}
2504
Paul Robinson0334a042015-12-19 19:41:48 +00002505// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2506// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002507static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002508 assert(A.getOption().matches(options::OPT_gN_Group) &&
2509 "Not a -g option that specifies a debug-info level");
2510 if (A.getOption().matches(options::OPT_g0) ||
2511 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002512 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002513 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2514 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002515 return codegenoptions::DebugLineTablesOnly;
2516 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002517}
2518
Douglas Katzman3459ce22015-10-08 04:24:12 +00002519// Extract the integer N from a string spelled "-dwarf-N", returning 0
2520// on mismatch. The StringRef input (rather than an Arg) allows
2521// for use by the "-Xassembler" option parser.
2522static unsigned DwarfVersionNum(StringRef ArgValue) {
2523 return llvm::StringSwitch<unsigned>(ArgValue)
2524 .Case("-gdwarf-2", 2)
2525 .Case("-gdwarf-3", 3)
2526 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002527 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002528 .Default(0);
2529}
2530
2531static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002532 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002533 unsigned DwarfVersion,
2534 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002535 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002536 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002537 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2538 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002539 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002540 CmdArgs.push_back("-debug-info-kind=limited");
2541 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002542 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002543 CmdArgs.push_back("-debug-info-kind=standalone");
2544 break;
2545 default:
2546 break;
2547 }
2548 if (DwarfVersion > 0)
2549 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002550 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002551 switch (DebuggerTuning) {
2552 case llvm::DebuggerKind::GDB:
2553 CmdArgs.push_back("-debugger-tuning=gdb");
2554 break;
2555 case llvm::DebuggerKind::LLDB:
2556 CmdArgs.push_back("-debugger-tuning=lldb");
2557 break;
2558 case llvm::DebuggerKind::SCE:
2559 CmdArgs.push_back("-debugger-tuning=sce");
2560 break;
2561 default:
2562 break;
2563 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002564}
2565
David Blaikie9260ed62013-07-25 21:19:01 +00002566static void CollectArgsForIntegratedAssembler(Compilation &C,
2567 const ArgList &Args,
2568 ArgStringList &CmdArgs,
2569 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002570 if (UseRelaxAll(C, Args))
2571 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002572
David Majnemer2b9349d2015-12-21 22:09:34 +00002573 // Only default to -mincremental-linker-compatible if we think we are
2574 // targeting the MSVC linker.
2575 bool DefaultIncrementalLinkerCompatible =
2576 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2577 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2578 options::OPT_mno_incremental_linker_compatible,
2579 DefaultIncrementalLinkerCompatible))
2580 CmdArgs.push_back("-mincremental-linker-compatible");
2581
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002582 // When passing -I arguments to the assembler we sometimes need to
2583 // unconditionally take the next argument. For example, when parsing
2584 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2585 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2586 // arg after parsing the '-I' arg.
2587 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002588
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002589 // When using an integrated assembler, translate -Wa, and -Xassembler
2590 // options.
2591 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002592 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002593 for (const Arg *A :
2594 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2595 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002596
Benjamin Kramer72e64312015-09-24 14:48:49 +00002597 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002598 if (TakeNextArg) {
2599 CmdArgs.push_back(Value.data());
2600 TakeNextArg = false;
2601 continue;
2602 }
David Blaikie9260ed62013-07-25 21:19:01 +00002603
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002604 switch (C.getDefaultToolChain().getArch()) {
2605 default:
2606 break;
2607 case llvm::Triple::mips:
2608 case llvm::Triple::mipsel:
2609 case llvm::Triple::mips64:
2610 case llvm::Triple::mips64el:
2611 if (Value == "--trap") {
2612 CmdArgs.push_back("-target-feature");
2613 CmdArgs.push_back("+use-tcc-in-div");
2614 continue;
2615 }
2616 if (Value == "--break") {
2617 CmdArgs.push_back("-target-feature");
2618 CmdArgs.push_back("-use-tcc-in-div");
2619 continue;
2620 }
2621 if (Value.startswith("-msoft-float")) {
2622 CmdArgs.push_back("-target-feature");
2623 CmdArgs.push_back("+soft-float");
2624 continue;
2625 }
2626 if (Value.startswith("-mhard-float")) {
2627 CmdArgs.push_back("-target-feature");
2628 CmdArgs.push_back("-soft-float");
2629 continue;
2630 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002631
2632 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2633 .Case("-mips1", "+mips1")
2634 .Case("-mips2", "+mips2")
2635 .Case("-mips3", "+mips3")
2636 .Case("-mips4", "+mips4")
2637 .Case("-mips5", "+mips5")
2638 .Case("-mips32", "+mips32")
2639 .Case("-mips32r2", "+mips32r2")
2640 .Case("-mips32r3", "+mips32r3")
2641 .Case("-mips32r5", "+mips32r5")
2642 .Case("-mips32r6", "+mips32r6")
2643 .Case("-mips64", "+mips64")
2644 .Case("-mips64r2", "+mips64r2")
2645 .Case("-mips64r3", "+mips64r3")
2646 .Case("-mips64r5", "+mips64r5")
2647 .Case("-mips64r6", "+mips64r6")
2648 .Default(nullptr);
2649 if (MipsTargetFeature)
2650 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002651 }
2652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002653 if (Value == "-force_cpusubtype_ALL") {
2654 // Do nothing, this is the default and we don't support anything else.
2655 } else if (Value == "-L") {
2656 CmdArgs.push_back("-msave-temp-labels");
2657 } else if (Value == "--fatal-warnings") {
2658 CmdArgs.push_back("-massembler-fatal-warnings");
2659 } else if (Value == "--noexecstack") {
2660 CmdArgs.push_back("-mnoexecstack");
2661 } else if (Value == "-compress-debug-sections" ||
2662 Value == "--compress-debug-sections") {
2663 CompressDebugSections = true;
2664 } else if (Value == "-nocompress-debug-sections" ||
2665 Value == "--nocompress-debug-sections") {
2666 CompressDebugSections = false;
2667 } else if (Value.startswith("-I")) {
2668 CmdArgs.push_back(Value.data());
2669 // We need to consume the next argument if the current arg is a plain
2670 // -I. The next arg will be the include directory.
2671 if (Value == "-I")
2672 TakeNextArg = true;
2673 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002674 // "-gdwarf-N" options are not cc1as options.
2675 unsigned DwarfVersion = DwarfVersionNum(Value);
2676 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2677 CmdArgs.push_back(Value.data());
2678 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002679 RenderDebugEnablingArgs(Args, CmdArgs,
2680 codegenoptions::LimitedDebugInfo,
2681 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002682 }
Renato Golin7c542b42015-07-27 23:44:45 +00002683 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2684 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2685 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002686 } else {
2687 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002688 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002689 }
2690 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002691 }
2692 if (CompressDebugSections) {
2693 if (llvm::zlib::isAvailable())
2694 CmdArgs.push_back("-compress-debug-sections");
2695 else
2696 D.Diag(diag::warn_debug_compression_unavailable);
2697 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002698 if (MipsTargetFeature != nullptr) {
2699 CmdArgs.push_back("-target-feature");
2700 CmdArgs.push_back(MipsTargetFeature);
2701 }
David Blaikie9260ed62013-07-25 21:19:01 +00002702}
2703
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002704// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002705// FIXME: Make sure we can also emit shared objects if they're requested
2706// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002707static void addClangRT(const ToolChain &TC, const ArgList &Args,
2708 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002709 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002710}
2711
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002712namespace {
2713enum OpenMPRuntimeKind {
2714 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2715 /// without knowing what runtime to target.
2716 OMPRT_Unknown,
2717
2718 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2719 /// the default for Clang.
2720 OMPRT_OMP,
2721
2722 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2723 /// this runtime but can swallow the pragmas, and find and link against the
2724 /// runtime library itself.
2725 OMPRT_GOMP,
2726
Chandler Carruthc6625c62015-05-28 21:10:31 +00002727 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002728 /// OpenMP runtime. We support this mode for users with existing dependencies
2729 /// on this runtime library name.
2730 OMPRT_IOMP5
2731};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002732}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002733
2734/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002735static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2736 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002737 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2738
2739 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2740 if (A)
2741 RuntimeName = A->getValue();
2742
2743 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002744 .Case("libomp", OMPRT_OMP)
2745 .Case("libgomp", OMPRT_GOMP)
2746 .Case("libiomp5", OMPRT_IOMP5)
2747 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002748
2749 if (RT == OMPRT_Unknown) {
2750 if (A)
2751 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002752 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002753 else
2754 // FIXME: We could use a nicer diagnostic here.
2755 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2756 }
2757
2758 return RT;
2759}
2760
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002761static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2762 const ArgList &Args) {
2763 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2764 options::OPT_fno_openmp, false))
2765 return;
2766
2767 switch (getOpenMPRuntime(TC, Args)) {
2768 case OMPRT_OMP:
2769 CmdArgs.push_back("-lomp");
2770 break;
2771 case OMPRT_GOMP:
2772 CmdArgs.push_back("-lgomp");
2773 break;
2774 case OMPRT_IOMP5:
2775 CmdArgs.push_back("-liomp5");
2776 break;
2777 case OMPRT_Unknown:
2778 // Already diagnosed.
2779 break;
2780 }
2781}
2782
Alexey Samsonov52550342014-09-15 19:58:40 +00002783static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2784 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002785 bool IsShared, bool IsWhole) {
2786 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002787 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002788 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002789 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002790 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002791}
2792
Alexey Samsonov52550342014-09-15 19:58:40 +00002793// Tries to use a file with the list of dynamic symbols that need to be exported
2794// from the runtime library. Returns true if the file was found.
2795static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2796 ArgStringList &CmdArgs,
2797 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002798 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002799 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2800 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002801 return true;
2802 }
2803 return false;
2804}
2805
2806static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2807 ArgStringList &CmdArgs) {
2808 // Force linking against the system libraries sanitizers depends on
2809 // (see PR15823 why this is necessary).
2810 CmdArgs.push_back("--no-as-needed");
2811 CmdArgs.push_back("-lpthread");
2812 CmdArgs.push_back("-lrt");
2813 CmdArgs.push_back("-lm");
2814 // There's no libdl on FreeBSD.
2815 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2816 CmdArgs.push_back("-ldl");
2817}
2818
2819static void
2820collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2821 SmallVectorImpl<StringRef> &SharedRuntimes,
2822 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002823 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2824 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2825 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002826 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2827 // Collect shared runtimes.
2828 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2829 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002830 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002831 // The stats_client library is also statically linked into DSOs.
2832 if (SanArgs.needsStatsRt())
2833 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002834
Alexey Samsonov52550342014-09-15 19:58:40 +00002835 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002836 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002837 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002838 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002839 }
2840 if (SanArgs.needsAsanRt()) {
2841 if (SanArgs.needsSharedAsanRt()) {
2842 HelperStaticRuntimes.push_back("asan-preinit");
2843 } else {
2844 StaticRuntimes.push_back("asan");
2845 if (SanArgs.linkCXXRuntimes())
2846 StaticRuntimes.push_back("asan_cxx");
2847 }
2848 }
2849 if (SanArgs.needsDfsanRt())
2850 StaticRuntimes.push_back("dfsan");
2851 if (SanArgs.needsLsanRt())
2852 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002853 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002854 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002855 if (SanArgs.linkCXXRuntimes())
2856 StaticRuntimes.push_back("msan_cxx");
2857 }
2858 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002859 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002860 if (SanArgs.linkCXXRuntimes())
2861 StaticRuntimes.push_back("tsan_cxx");
2862 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002863 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002864 StaticRuntimes.push_back("ubsan_standalone");
2865 if (SanArgs.linkCXXRuntimes())
2866 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002867 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002868 if (SanArgs.needsSafeStackRt())
2869 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002870 if (SanArgs.needsCfiRt())
2871 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002872 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002873 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002874 if (SanArgs.linkCXXRuntimes())
2875 StaticRuntimes.push_back("ubsan_standalone_cxx");
2876 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002877 if (SanArgs.needsStatsRt()) {
2878 NonWholeStaticRuntimes.push_back("stats");
2879 RequiredSymbols.push_back("__sanitizer_stats_register");
2880 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002881}
2882
Alexey Samsonov52550342014-09-15 19:58:40 +00002883// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2884// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2885static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002886 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002887 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002888 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002889 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 NonWholeStaticRuntimes, HelperStaticRuntimes,
2891 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002892 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002893 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002894 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002895 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002896 bool AddExportDynamic = false;
2897 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002898 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002899 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2900 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002901 for (auto RT : NonWholeStaticRuntimes) {
2902 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2903 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2904 }
2905 for (auto S : RequiredSymbols) {
2906 CmdArgs.push_back("-u");
2907 CmdArgs.push_back(Args.MakeArgString(S));
2908 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002909 // If there is a static runtime with no dynamic list, force all the symbols
2910 // to be dynamic to be sure we export sanitizer interface functions.
2911 if (AddExportDynamic)
2912 CmdArgs.push_back("-export-dynamic");
2913 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002914}
2915
Reid Kleckner86ea7702015-02-04 23:45:07 +00002916static bool areOptimizationsEnabled(const ArgList &Args) {
2917 // Find the last -O arg and see if it is non-zero.
2918 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2919 return !A->getOption().matches(options::OPT_O0);
2920 // Defaults to -O0.
2921 return false;
2922}
2923
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002924static bool shouldUseFramePointerForTarget(const ArgList &Args,
2925 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002926 switch (Triple.getArch()) {
2927 case llvm::Triple::xcore:
2928 case llvm::Triple::wasm32:
2929 case llvm::Triple::wasm64:
2930 // XCore never wants frame pointers, regardless of OS.
2931 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002932 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002933 default:
2934 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002935 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002936
2937 if (Triple.isOSLinux()) {
2938 switch (Triple.getArch()) {
2939 // Don't use a frame pointer on linux if optimizing for certain targets.
2940 case llvm::Triple::mips64:
2941 case llvm::Triple::mips64el:
2942 case llvm::Triple::mips:
2943 case llvm::Triple::mipsel:
2944 case llvm::Triple::systemz:
2945 case llvm::Triple::x86:
2946 case llvm::Triple::x86_64:
2947 return !areOptimizationsEnabled(Args);
2948 default:
2949 return true;
2950 }
2951 }
2952
2953 if (Triple.isOSWindows()) {
2954 switch (Triple.getArch()) {
2955 case llvm::Triple::x86:
2956 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002957 case llvm::Triple::arm:
2958 case llvm::Triple::thumb:
2959 // Windows on ARM builds with FPO disabled to aid fast stack walking
2960 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002961 default:
2962 // All other supported Windows ISAs use xdata unwind information, so frame
2963 // pointers are not generally useful.
2964 return false;
2965 }
2966 }
2967
2968 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002969}
2970
Rafael Espindola224dd632011-12-14 21:02:23 +00002971static bool shouldUseFramePointer(const ArgList &Args,
2972 const llvm::Triple &Triple) {
2973 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2974 options::OPT_fomit_frame_pointer))
2975 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002976 if (Args.hasArg(options::OPT_pg))
2977 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002978
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002979 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002980}
2981
Eric Christopherb7d97e92013-04-03 01:58:53 +00002982static bool shouldUseLeafFramePointer(const ArgList &Args,
2983 const llvm::Triple &Triple) {
2984 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2985 options::OPT_momit_leaf_frame_pointer))
2986 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002987 if (Args.hasArg(options::OPT_pg))
2988 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002989
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002990 if (Triple.isPS4CPU())
2991 return false;
2992
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002993 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002994}
2995
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002996/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002997static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002998 SmallString<128> cwd;
2999 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003000 CmdArgs.push_back("-fdebug-compilation-dir");
3001 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003002 }
3003}
3004
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003005static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003006 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3007 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3008 SmallString<128> T(FinalOutput->getValue());
3009 llvm::sys::path::replace_extension(T, "dwo");
3010 return Args.MakeArgString(T);
3011 } else {
3012 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003013 SmallString<128> T(
3014 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003015 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003016 llvm::sys::path::replace_extension(F, "dwo");
3017 T += F;
3018 return Args.MakeArgString(F);
3019 }
3020}
3021
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003022static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3023 const JobAction &JA, const ArgList &Args,
3024 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003025 ArgStringList ExtractArgs;
3026 ExtractArgs.push_back("--extract-dwo");
3027
3028 ArgStringList StripArgs;
3029 StripArgs.push_back("--strip-dwo");
3030
3031 // Grabbing the output of the earlier compile step.
3032 StripArgs.push_back(Output.getFilename());
3033 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003034 ExtractArgs.push_back(OutFile);
3035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003036 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003037 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003038
3039 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003040 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003041
3042 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003043 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003044}
3045
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003046/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003047/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3048static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003049 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003050 if (A->getOption().matches(options::OPT_O4) ||
3051 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003052 return true;
3053
3054 if (A->getOption().matches(options::OPT_O0))
3055 return false;
3056
3057 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3058
Rafael Espindola91780de2013-08-26 14:05:41 +00003059 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003060 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003061 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003062 return true;
3063
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003064 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003065 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003066 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003067
3068 unsigned OptLevel = 0;
3069 if (S.getAsInteger(10, OptLevel))
3070 return false;
3071
3072 return OptLevel > 1;
3073 }
3074
3075 return false;
3076}
3077
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003078/// Add -x lang to \p CmdArgs for \p Input.
3079static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3080 ArgStringList &CmdArgs) {
3081 // When using -verify-pch, we don't want to provide the type
3082 // 'precompiled-header' if it was inferred from the file extension
3083 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3084 return;
3085
3086 CmdArgs.push_back("-x");
3087 if (Args.hasArg(options::OPT_rewrite_objc))
3088 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3089 else
3090 CmdArgs.push_back(types::getTypeName(Input.getType()));
3091}
3092
David Majnemerc371ff02015-03-22 08:39:22 +00003093static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003094 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003095 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003096
3097 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003098 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003099
3100 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003101 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003102 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003103 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003104}
3105
Rafael Espindola577637a2015-01-03 00:06:04 +00003106// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003107// options that build systems might add but are unused when assembling or only
3108// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003109static void claimNoWarnArgs(const ArgList &Args) {
3110 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003111 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003112 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003113 Args.ClaimAllArgs(options::OPT_flto);
3114 Args.ClaimAllArgs(options::OPT_fno_lto);
3115}
3116
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003117static void appendUserToPath(SmallVectorImpl<char> &Result) {
3118#ifdef LLVM_ON_UNIX
3119 const char *Username = getenv("LOGNAME");
3120#else
3121 const char *Username = getenv("USERNAME");
3122#endif
3123 if (Username) {
3124 // Validate that LoginName can be used in a path, and get its length.
3125 size_t Len = 0;
3126 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003127 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003128 Username = nullptr;
3129 break;
3130 }
3131 }
3132
3133 if (Username && Len > 0) {
3134 Result.append(Username, Username + Len);
3135 return;
3136 }
3137 }
3138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003139// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003140#ifdef LLVM_ON_UNIX
3141 std::string UID = llvm::utostr(getuid());
3142#else
3143 // FIXME: Windows seems to have an 'SID' that might work.
3144 std::string UID = "9999";
3145#endif
3146 Result.append(UID.begin(), UID.end());
3147}
3148
David Majnemere11d3732015-06-08 00:22:46 +00003149VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3150 const llvm::Triple &Triple,
3151 const llvm::opt::ArgList &Args,
3152 bool IsWindowsMSVC) {
3153 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3154 IsWindowsMSVC) ||
3155 Args.hasArg(options::OPT_fmsc_version) ||
3156 Args.hasArg(options::OPT_fms_compatibility_version)) {
3157 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3158 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003159 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003160
3161 if (MSCVersion && MSCompatibilityVersion) {
3162 if (D)
3163 D->Diag(diag::err_drv_argument_not_allowed_with)
3164 << MSCVersion->getAsString(Args)
3165 << MSCompatibilityVersion->getAsString(Args);
3166 return VersionTuple();
3167 }
3168
3169 if (MSCompatibilityVersion) {
3170 VersionTuple MSVT;
3171 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3172 D->Diag(diag::err_drv_invalid_value)
3173 << MSCompatibilityVersion->getAsString(Args)
3174 << MSCompatibilityVersion->getValue();
3175 return MSVT;
3176 }
3177
3178 if (MSCVersion) {
3179 unsigned Version = 0;
3180 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3181 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3182 << MSCVersion->getValue();
3183 return getMSCompatibilityVersion(Version);
3184 }
3185
3186 unsigned Major, Minor, Micro;
3187 Triple.getEnvironmentVersion(Major, Minor, Micro);
3188 if (Major || Minor || Micro)
3189 return VersionTuple(Major, Minor, Micro);
3190
3191 return VersionTuple(18);
3192 }
3193 return VersionTuple();
3194}
3195
Diego Novilloa0545962015-07-10 18:00:07 +00003196static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3197 const InputInfo &Output, const ArgList &Args,
3198 ArgStringList &CmdArgs) {
3199 auto *ProfileGenerateArg = Args.getLastArg(
3200 options::OPT_fprofile_instr_generate,
3201 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003202 options::OPT_fprofile_generate_EQ,
3203 options::OPT_fno_profile_instr_generate);
3204 if (ProfileGenerateArg &&
3205 ProfileGenerateArg->getOption().matches(
3206 options::OPT_fno_profile_instr_generate))
3207 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003208
3209 auto *ProfileUseArg = Args.getLastArg(
3210 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003211 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3212 options::OPT_fno_profile_instr_use);
3213 if (ProfileUseArg &&
3214 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3215 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003216
3217 if (ProfileGenerateArg && ProfileUseArg)
3218 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003219 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003220
Diego Novillo758f3f52015-08-05 21:49:51 +00003221 if (ProfileGenerateArg) {
3222 if (ProfileGenerateArg->getOption().matches(
3223 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003224 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3225 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003226 else if (ProfileGenerateArg->getOption().matches(
3227 options::OPT_fprofile_generate_EQ)) {
3228 SmallString<128> Path(ProfileGenerateArg->getValue());
3229 llvm::sys::path::append(Path, "default.profraw");
3230 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003231 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3232 }
3233 // The default is to use Clang Instrumentation.
3234 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003235 }
Diego Novilloa0545962015-07-10 18:00:07 +00003236
Diego Novillo758f3f52015-08-05 21:49:51 +00003237 if (ProfileUseArg) {
3238 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3239 ProfileUseArg->render(Args, CmdArgs);
3240 else if ((ProfileUseArg->getOption().matches(
3241 options::OPT_fprofile_use_EQ) ||
3242 ProfileUseArg->getOption().matches(
3243 options::OPT_fprofile_instr_use))) {
3244 SmallString<128> Path(
3245 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3246 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3247 llvm::sys::path::append(Path, "default.profdata");
3248 CmdArgs.push_back(
3249 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3250 }
Diego Novilloa0545962015-07-10 18:00:07 +00003251 }
3252
3253 if (Args.hasArg(options::OPT_ftest_coverage) ||
3254 Args.hasArg(options::OPT_coverage))
3255 CmdArgs.push_back("-femit-coverage-notes");
3256 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3257 false) ||
3258 Args.hasArg(options::OPT_coverage))
3259 CmdArgs.push_back("-femit-coverage-data");
3260
Diego Novilloc4b94da2015-08-05 23:27:40 +00003261 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3262 options::OPT_fno_coverage_mapping, false) &&
3263 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003264 D.Diag(diag::err_drv_argument_only_allowed_with)
3265 << "-fcoverage-mapping"
3266 << "-fprofile-instr-generate";
3267
Diego Novilloc4b94da2015-08-05 23:27:40 +00003268 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3269 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003270 CmdArgs.push_back("-fcoverage-mapping");
3271
3272 if (C.getArgs().hasArg(options::OPT_c) ||
3273 C.getArgs().hasArg(options::OPT_S)) {
3274 if (Output.isFilename()) {
3275 CmdArgs.push_back("-coverage-file");
3276 SmallString<128> CoverageFilename;
3277 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3278 CoverageFilename = FinalOutput->getValue();
3279 } else {
3280 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3281 }
3282 if (llvm::sys::path::is_relative(CoverageFilename)) {
3283 SmallString<128> Pwd;
3284 if (!llvm::sys::fs::current_path(Pwd)) {
3285 llvm::sys::path::append(Pwd, CoverageFilename);
3286 CoverageFilename.swap(Pwd);
3287 }
3288 }
3289 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3290 }
3291 }
3292}
3293
Paul Robinsond083b9a2015-12-16 17:25:27 +00003294static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3295 ArgStringList &CmdArgs) {
3296 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3297 false) ||
3298 Args.hasFlag(options::OPT_fprofile_generate,
3299 options::OPT_fno_profile_instr_generate, false) ||
3300 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3301 options::OPT_fno_profile_instr_generate, false) ||
3302 Args.hasFlag(options::OPT_fprofile_instr_generate,
3303 options::OPT_fno_profile_instr_generate, false) ||
3304 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3305 options::OPT_fno_profile_instr_generate, false) ||
3306 Args.hasArg(options::OPT_fcreate_profile) ||
3307 Args.hasArg(options::OPT_coverage)))
3308 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3309}
3310
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003311/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3312/// smooshes them together with platform defaults, to decide whether
3313/// this compile should be using PIC mode or not. Returns a tuple of
3314/// (RelocationModel, PICLevel, IsPIE).
3315static std::tuple<llvm::Reloc::Model, unsigned, bool>
3316ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3317 const ArgList &Args) {
3318 // FIXME: why does this code...and so much everywhere else, use both
3319 // ToolChain.getTriple() and Triple?
3320 bool PIE = ToolChain.isPIEDefault();
3321 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003322 // The Darwin/MachO default to use PIC does not apply when using -static.
3323 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3324 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003325 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003326 bool IsPICLevelTwo = PIC;
3327
3328 bool KernelOrKext =
3329 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3330
3331 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003332 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003333 switch (ToolChain.getArch()) {
3334 case llvm::Triple::arm:
3335 case llvm::Triple::armeb:
3336 case llvm::Triple::thumb:
3337 case llvm::Triple::thumbeb:
3338 case llvm::Triple::aarch64:
3339 case llvm::Triple::mips:
3340 case llvm::Triple::mipsel:
3341 case llvm::Triple::mips64:
3342 case llvm::Triple::mips64el:
3343 PIC = true; // "-fpic"
3344 break;
3345
3346 case llvm::Triple::x86:
3347 case llvm::Triple::x86_64:
3348 PIC = true; // "-fPIC"
3349 IsPICLevelTwo = true;
3350 break;
3351
3352 default:
3353 break;
3354 }
3355 }
3356
3357 // OpenBSD-specific defaults for PIE
3358 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3359 switch (ToolChain.getArch()) {
3360 case llvm::Triple::mips64:
3361 case llvm::Triple::mips64el:
3362 case llvm::Triple::sparcel:
3363 case llvm::Triple::x86:
3364 case llvm::Triple::x86_64:
3365 IsPICLevelTwo = false; // "-fpie"
3366 break;
3367
3368 case llvm::Triple::ppc:
3369 case llvm::Triple::sparc:
3370 case llvm::Triple::sparcv9:
3371 IsPICLevelTwo = true; // "-fPIE"
3372 break;
3373
3374 default:
3375 break;
3376 }
3377 }
3378
3379 // The last argument relating to either PIC or PIE wins, and no
3380 // other argument is used. If the last argument is any flavor of the
3381 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3382 // option implicitly enables PIC at the same level.
3383 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3384 options::OPT_fpic, options::OPT_fno_pic,
3385 options::OPT_fPIE, options::OPT_fno_PIE,
3386 options::OPT_fpie, options::OPT_fno_pie);
3387 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3388 // is forced, then neither PIC nor PIE flags will have no effect.
3389 if (!ToolChain.isPICDefaultForced()) {
3390 if (LastPICArg) {
3391 Option O = LastPICArg->getOption();
3392 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3393 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3394 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3395 PIC =
3396 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3397 IsPICLevelTwo =
3398 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3399 } else {
3400 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003401 if (Triple.isPS4CPU()) {
3402 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3403 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3404 if (Model != "kernel") {
3405 PIC = true;
3406 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3407 << LastPICArg->getSpelling();
3408 }
3409 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003410 }
3411 }
3412 }
3413
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003414 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3415 // PIC level would've been set to level 1, force it back to level 2 PIC
3416 // instead.
3417 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003418 IsPICLevelTwo |= ToolChain.isPICDefault();
3419
James Y Knightc4015d32015-08-21 04:14:55 +00003420 // This kernel flags are a trump-card: they will disable PIC/PIE
3421 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003422 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3423 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003424 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003425
3426 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3427 // This is a very special mode. It trumps the other modes, almost no one
3428 // uses it, and it isn't even valid on any OS but Darwin.
3429 if (!ToolChain.getTriple().isOSDarwin())
3430 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3431 << A->getSpelling() << ToolChain.getTriple().str();
3432
3433 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3434
3435 // Only a forced PIC mode can cause the actual compile to have PIC defines
3436 // etc., no flags are sufficient. This behavior was selected to closely
3437 // match that of llvm-gcc and Apple GCC before that.
3438 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3439
3440 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3441 }
3442
3443 if (PIC)
3444 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3445
3446 return std::make_tuple(llvm::Reloc::Static, 0, false);
3447}
3448
3449static const char *RelocationModelName(llvm::Reloc::Model Model) {
3450 switch (Model) {
3451 case llvm::Reloc::Default:
3452 return nullptr;
3453 case llvm::Reloc::Static:
3454 return "static";
3455 case llvm::Reloc::PIC_:
3456 return "pic";
3457 case llvm::Reloc::DynamicNoPIC:
3458 return "dynamic-no-pic";
3459 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003460 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003461}
3462
3463static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3464 ArgStringList &CmdArgs) {
3465 llvm::Reloc::Model RelocationModel;
3466 unsigned PICLevel;
3467 bool IsPIE;
3468 std::tie(RelocationModel, PICLevel, IsPIE) =
3469 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3470
3471 if (RelocationModel != llvm::Reloc::Static)
3472 CmdArgs.push_back("-KPIC");
3473}
3474
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003475void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003476 const InputInfo &Output, const InputInfoList &Inputs,
3477 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003478 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3479 const llvm::Triple Triple(TripleStr);
3480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003481 bool KernelOrKext =
3482 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003483 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003484 ArgStringList CmdArgs;
3485
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003486 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003487 bool IsWindowsCygnus =
3488 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003489 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003490 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003491
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003492 // Check number of inputs for sanity. We need at least one input.
3493 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003494 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003495 // CUDA compilation may have multiple inputs (source file + results of
3496 // device-side compilations). All other jobs are expected to have exactly one
3497 // input.
3498 bool IsCuda = types::isCuda(Input.getType());
3499 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003500
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003501 // Invoke ourselves in -cc1 mode.
3502 //
3503 // FIXME: Implement custom jobs for internal actions.
3504 CmdArgs.push_back("-cc1");
3505
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003506 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003507 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003508 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003509
Artem Belevichfa11ab52015-11-17 22:28:46 +00003510 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003511 if (IsCuda) {
3512 // FIXME: We need a (better) way to pass information about
3513 // particular compilation pass we're constructing here. For now we
3514 // can check which toolchain we're using and pick the other one to
3515 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003516 if (&getToolChain() == C.getCudaDeviceToolChain())
3517 AuxToolChain = C.getCudaHostToolChain();
3518 else if (&getToolChain() == C.getCudaHostToolChain())
3519 AuxToolChain = C.getCudaDeviceToolChain();
3520 else
3521 llvm_unreachable("Can't figure out CUDA compilation mode.");
3522 assert(AuxToolChain != nullptr && "No aux toolchain.");
3523 CmdArgs.push_back("-aux-triple");
3524 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003525 CmdArgs.push_back("-fcuda-target-overloads");
3526 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003527 }
3528
James Y Knight2db38f32015-08-15 03:45:25 +00003529 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3530 Triple.getArch() == llvm::Triple::thumb)) {
3531 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003532 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003533 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003534 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003535 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003536 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003537 }
3538
Tim Northover336f1892014-03-29 13:16:12 +00003539 // Push all default warning arguments that are specific to
3540 // the given target. These come before user provided warning options
3541 // are provided.
3542 getToolChain().addClangWarningOptions(CmdArgs);
3543
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003544 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003545 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003547 if (isa<AnalyzeJobAction>(JA)) {
3548 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3549 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003550 } else if (isa<MigrateJobAction>(JA)) {
3551 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003552 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003553 if (Output.getType() == types::TY_Dependencies)
3554 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003555 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003556 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003557 if (Args.hasArg(options::OPT_rewrite_objc) &&
3558 !Args.hasArg(options::OPT_g_Group))
3559 CmdArgs.push_back("-P");
3560 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003561 } else if (isa<AssembleJobAction>(JA)) {
3562 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003563
David Blaikie9260ed62013-07-25 21:19:01 +00003564 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003565
3566 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003568 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003569 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003570 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003571
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003572 if (JA.getType() == types::TY_Nothing)
3573 CmdArgs.push_back("-fsyntax-only");
3574 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003575 CmdArgs.push_back("-emit-pch");
3576 else
3577 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003578 } else if (isa<VerifyPCHJobAction>(JA)) {
3579 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003580 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003581 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3582 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003583 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003584 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003585 } else if (JA.getType() == types::TY_LLVM_IR ||
3586 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003587 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003588 } else if (JA.getType() == types::TY_LLVM_BC ||
3589 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003590 CmdArgs.push_back("-emit-llvm-bc");
3591 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003592 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003593 } else if (JA.getType() == types::TY_AST) {
3594 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003595 } else if (JA.getType() == types::TY_ModuleFile) {
3596 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003597 } else if (JA.getType() == types::TY_RewrittenObjC) {
3598 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003599 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003600 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3601 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003602 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003603 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003605 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003606
3607 // Preserve use-list order by default when emitting bitcode, so that
3608 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3609 // same result as running passes here. For LTO, we don't need to preserve
3610 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003611 if (JA.getType() == types::TY_LLVM_BC)
3612 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003613
3614 if (D.isUsingLTO())
3615 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616 }
3617
Teresa Johnsonaff22322015-12-07 19:21:34 +00003618 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3619 if (!types::isLLVMIR(Input.getType()))
3620 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3621 << "-x ir";
3622 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3623 }
3624
Justin Bognera88f0122014-06-20 22:59:50 +00003625 // We normally speed up the clang process a bit by skipping destructors at
3626 // exit, but when we're generating diagnostics we can rely on some of the
3627 // cleanup.
3628 if (!C.isForDiagnostics())
3629 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003630
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003631// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003632#ifdef NDEBUG
3633 CmdArgs.push_back("-disable-llvm-verifier");
3634#endif
3635
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003636 // Set the main file name, so that debug info works even with
3637 // -save-temps.
3638 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003639 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003640
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003641 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003642 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003643 if (Args.hasArg(options::OPT_static))
3644 CmdArgs.push_back("-static-define");
3645
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003646 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003647 // Enable region store model by default.
3648 CmdArgs.push_back("-analyzer-store=region");
3649
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003650 // Treat blocks as analysis entry points.
3651 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3652
Ted Kremenek49c79792011-03-24 00:28:47 +00003653 CmdArgs.push_back("-analyzer-eagerly-assume");
3654
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003655 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003656 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003657 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003658
Devin Coughlin65c77082016-01-21 20:09:49 +00003659 if (!IsWindowsMSVC) {
3660 CmdArgs.push_back("-analyzer-checker=unix");
3661 } else {
3662 // Enable "unix" checkers that also work on Windows.
3663 CmdArgs.push_back("-analyzer-checker=unix.API");
3664 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3665 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3666 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3667 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3668 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3669 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003670
Sean Evesonb38c32b2016-01-06 10:03:58 +00003671 // Disable some unix checkers for PS4.
3672 if (IsPS4CPU) {
3673 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3674 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3675 }
3676
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003677 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003678 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003680 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003681
Artem Belevichba558952015-05-06 18:20:23 +00003682 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003683 CmdArgs.push_back("-analyzer-checker=cplusplus");
3684
Sean Evesonb38c32b2016-01-06 10:03:58 +00003685 if (!IsPS4CPU) {
3686 CmdArgs.push_back(
3687 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3693 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003694
3695 // Default nullability checks.
3696 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3697 CmdArgs.push_back(
3698 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003699 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003700
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003701 // Set the output format. The default is plist, for (lame) historical
3702 // reasons.
3703 CmdArgs.push_back("-analyzer-output");
3704 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003705 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003706 else
3707 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003708
Ted Kremenekfe449a22010-03-22 22:32:05 +00003709 // Disable the presentation of standard compiler warnings when
3710 // using --analyze. We only want to show static analyzer diagnostics
3711 // or frontend errors.
3712 CmdArgs.push_back("-w");
3713
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003714 // Add -Xanalyzer arguments when running as analyzer.
3715 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003716 }
3717
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003718 CheckCodeGenerationOptions(D, Args);
3719
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003720 llvm::Reloc::Model RelocationModel;
3721 unsigned PICLevel;
3722 bool IsPIE;
3723 std::tie(RelocationModel, PICLevel, IsPIE) =
3724 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003725
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003726 const char *RMName = RelocationModelName(RelocationModel);
3727 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003728 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003729 CmdArgs.push_back(RMName);
3730 }
3731 if (PICLevel > 0) {
3732 CmdArgs.push_back("-pic-level");
3733 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3734 if (IsPIE) {
3735 CmdArgs.push_back("-pie-level");
3736 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003737 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003738 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003739
Renato Golin4854d802015-11-09 12:40:41 +00003740 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3741 CmdArgs.push_back("-meabi");
3742 CmdArgs.push_back(A->getValue());
3743 }
3744
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003745 CmdArgs.push_back("-mthread-model");
3746 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3747 CmdArgs.push_back(A->getValue());
3748 else
3749 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3750
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003751 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3752
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003753 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3754 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003755 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003756
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003757 // LLVM Code Generator Options.
3758
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003759 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3760 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003761 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3762 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003763 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003764 CmdArgs.push_back(A->getValue());
3765 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003766 }
3767 }
3768
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003769 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3770 StringRef v = A->getValue();
3771 CmdArgs.push_back("-mllvm");
3772 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3773 A->claim();
3774 }
3775
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003776 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3777 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003778 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003779 }
3780
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003781 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3782 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003783 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003784 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003785 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003786 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3787 CmdArgs.push_back("-fpcc-struct-return");
3788 } else {
3789 assert(A->getOption().matches(options::OPT_freg_struct_return));
3790 CmdArgs.push_back("-freg-struct-return");
3791 }
3792 }
3793
Roman Divacky65b88cd2011-03-01 17:40:53 +00003794 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3795 CmdArgs.push_back("-mrtd");
3796
Rafael Espindola224dd632011-12-14 21:02:23 +00003797 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003798 CmdArgs.push_back("-mdisable-fp-elim");
3799 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3800 options::OPT_fno_zero_initialized_in_bss))
3801 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003802
3803 bool OFastEnabled = isOptimizationLevelFast(Args);
3804 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3805 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003806 OptSpecifier StrictAliasingAliasOption =
3807 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003808 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3809 // doesn't do any TBAA.
3810 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003811 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003812 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003813 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003814 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3815 options::OPT_fno_struct_path_tbaa))
3816 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003817 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3818 false))
3819 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003820 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3821 options::OPT_fno_strict_vtable_pointers,
3822 false))
3823 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003824 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3825 options::OPT_fno_optimize_sibling_calls))
3826 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003827
Eric Christopher006208c2013-04-04 06:29:47 +00003828 // Handle segmented stacks.
3829 if (Args.hasArg(options::OPT_fsplit_stack))
3830 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003831
3832 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3833 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003834 OptSpecifier FastMathAliasOption =
3835 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3836
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003837 // Handle various floating point optimization flags, mapping them to the
3838 // appropriate LLVM code generation flags. The pattern for all of these is to
3839 // default off the codegen optimizations, and if any flag enables them and no
3840 // flag disables them after the flag enabling them, enable the codegen
3841 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003842 if (Arg *A = Args.getLastArg(
3843 options::OPT_ffast_math, FastMathAliasOption,
3844 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3845 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3846 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003847 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3848 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003849 A->getOption().getID() != options::OPT_fhonor_infinities)
3850 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003851 if (Arg *A = Args.getLastArg(
3852 options::OPT_ffast_math, FastMathAliasOption,
3853 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3854 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3855 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003856 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3857 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003858 A->getOption().getID() != options::OPT_fhonor_nans)
3859 CmdArgs.push_back("-menable-no-nans");
3860
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003861 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3862 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003863 if (Arg *A =
3864 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3865 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3866 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003867 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3868 // However, turning *off* -ffast_math merely restores the toolchain default
3869 // (which may be false).
3870 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3871 A->getOption().getID() == options::OPT_ffast_math ||
3872 A->getOption().getID() == options::OPT_Ofast)
3873 MathErrno = false;
3874 else if (A->getOption().getID() == options::OPT_fmath_errno)
3875 MathErrno = true;
3876 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003877 if (MathErrno)
3878 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003879
3880 // There are several flags which require disabling very specific
3881 // optimizations. Any of these being disabled forces us to turn off the
3882 // entire set of LLVM optimizations, so collect them through all the flag
3883 // madness.
3884 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003885 if (Arg *A = Args.getLastArg(
3886 options::OPT_ffast_math, FastMathAliasOption,
3887 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3888 options::OPT_fno_unsafe_math_optimizations,
3889 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003890 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3891 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003892 A->getOption().getID() != options::OPT_fno_associative_math)
3893 AssociativeMath = true;
3894 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003895 if (Arg *A = Args.getLastArg(
3896 options::OPT_ffast_math, FastMathAliasOption,
3897 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3898 options::OPT_fno_unsafe_math_optimizations,
3899 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003900 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3901 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003902 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3903 ReciprocalMath = true;
3904 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003905 if (Arg *A = Args.getLastArg(
3906 options::OPT_ffast_math, FastMathAliasOption,
3907 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3908 options::OPT_fno_unsafe_math_optimizations,
3909 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003910 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3911 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003912 A->getOption().getID() != options::OPT_fsigned_zeros)
3913 SignedZeros = false;
3914 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003915 if (Arg *A = Args.getLastArg(
3916 options::OPT_ffast_math, FastMathAliasOption,
3917 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3918 options::OPT_fno_unsafe_math_optimizations,
3919 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003920 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3921 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003922 A->getOption().getID() != options::OPT_ftrapping_math)
3923 TrappingMath = false;
3924 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3925 !TrappingMath)
3926 CmdArgs.push_back("-menable-unsafe-fp-math");
3927
Sanjay Patel76c9e092015-01-23 16:40:50 +00003928 if (!SignedZeros)
3929 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003930
Sanjay Patel359b1052015-04-09 15:03:23 +00003931 if (ReciprocalMath)
3932 CmdArgs.push_back("-freciprocal-math");
3933
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003935 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003936 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003937 options::OPT_ffp_contract)) {
3938 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003939 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003940 if (Val == "fast" || Val == "on" || Val == "off") {
3941 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3942 } else {
3943 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003945 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003946 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3947 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003948 // If fast-math is set then set the fp-contract mode to fast.
3949 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3950 }
3951 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952
Sanjay Patel2987c292015-06-11 14:53:41 +00003953 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003954
Bob Wilson6a039162012-07-19 03:52:53 +00003955 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3956 // and if we find them, tell the frontend to provide the appropriate
3957 // preprocessor macros. This is distinct from enabling any optimizations as
3958 // these options induce language changes which must survive serialization
3959 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003960 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3961 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 if (!A->getOption().matches(options::OPT_fno_fast_math))
3963 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003964 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3965 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003966 if (A->getOption().matches(options::OPT_ffinite_math_only))
3967 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003968
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003969 // Decide whether to use verbose asm. Verbose assembly is the default on
3970 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003971 bool IsIntegratedAssemblerDefault =
3972 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003973 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003974 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003975 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003976 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003977
Rafael Espindolab8a12932015-05-22 20:44:03 +00003978 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3979 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003980 CmdArgs.push_back("-no-integrated-as");
3981
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003982 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3983 CmdArgs.push_back("-mdebug-pass");
3984 CmdArgs.push_back("Structure");
3985 }
3986 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3987 CmdArgs.push_back("-mdebug-pass");
3988 CmdArgs.push_back("Arguments");
3989 }
3990
Justin Lebar710a35f2016-01-25 22:36:35 +00003991 // Enable -mconstructor-aliases except on darwin, where we have to work around
3992 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3993 // aliases aren't supported.
3994 if (!getToolChain().getTriple().isOSDarwin() &&
3995 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003996 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003997
John McCall7ef5cb32011-03-18 02:56:14 +00003998 // Darwin's kernel doesn't support guard variables; just die if we
3999 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004000 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004001 CmdArgs.push_back("-fforbid-guard-variables");
4002
Akira Hatanaka02028482015-11-12 17:21:22 +00004003 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4004 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004005 CmdArgs.push_back("-mms-bitfields");
4006 }
John McCall8517abc2010-02-19 02:45:38 +00004007
Daniel Dunbar306945d2009-09-16 06:17:29 +00004008 // This is a coarse approximation of what llvm-gcc actually does, both
4009 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4010 // complicated ways.
4011 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004012 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4013 options::OPT_fno_asynchronous_unwind_tables,
4014 (getToolChain().IsUnwindTablesDefault() ||
4015 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4016 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004017 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4018 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004019 CmdArgs.push_back("-munwind-tables");
4020
Chandler Carruth05fb5852012-11-21 23:40:23 +00004021 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004022
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004023 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4024 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004025 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004026 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004027
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004028 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004029 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004030
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004031 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004032 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004033 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004034 }
4035
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004036 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004037 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004038 if (!CPU.empty()) {
4039 CmdArgs.push_back("-target-cpu");
4040 CmdArgs.push_back(Args.MakeArgString(CPU));
4041 }
4042
Rafael Espindolaeb265472013-08-21 21:59:03 +00004043 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4044 CmdArgs.push_back("-mfpmath");
4045 CmdArgs.push_back(A->getValue());
4046 }
4047
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004048 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004049 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004050
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004051 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004053 default:
4054 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004055
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004056 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004057 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004058 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004059 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004060 // Use the effective triple, which takes into account the deployment target.
4061 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004062 break;
4063
Tim Northover573cbee2014-05-24 12:52:07 +00004064 case llvm::Triple::aarch64:
4065 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004066 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004067 break;
4068
Eric Christopher0b26a612010-03-02 02:41:08 +00004069 case llvm::Triple::mips:
4070 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004071 case llvm::Triple::mips64:
4072 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004073 AddMIPSTargetArgs(Args, CmdArgs);
4074 break;
4075
Ulrich Weigand8afad612014-07-28 13:17:52 +00004076 case llvm::Triple::ppc:
4077 case llvm::Triple::ppc64:
4078 case llvm::Triple::ppc64le:
4079 AddPPCTargetArgs(Args, CmdArgs);
4080 break;
4081
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004082 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004083 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004084 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004085 AddSparcTargetArgs(Args, CmdArgs);
4086 break;
4087
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004088 case llvm::Triple::x86:
4089 case llvm::Triple::x86_64:
4090 AddX86TargetArgs(Args, CmdArgs);
4091 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004092
4093 case llvm::Triple::hexagon:
4094 AddHexagonTargetArgs(Args, CmdArgs);
4095 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004096
4097 case llvm::Triple::wasm32:
4098 case llvm::Triple::wasm64:
4099 AddWebAssemblyTargetArgs(Args, CmdArgs);
4100 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004101 }
4102
Douglas Katzman3459ce22015-10-08 04:24:12 +00004103 // The 'g' groups options involve a somewhat intricate sequence of decisions
4104 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004105 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004106 // * what level of debug info to generate
4107 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004108 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004109 // This avoids having to monkey around further in cc1 other than to disable
4110 // codeview if not running in a Windows environment. Perhaps even that
4111 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004112 unsigned DwarfVersion = 0;
4113 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4114 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004115 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004116 bool EmitCodeView = false;
4117
Hans Wennborg75958c42013-08-08 00:17:41 +00004118 // Add clang-cl arguments.
4119 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00004120 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004121
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004122 // Pass the linker version in use.
4123 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4124 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004125 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004126 }
4127
Eric Christopherb7d97e92013-04-03 01:58:53 +00004128 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004129 CmdArgs.push_back("-momit-leaf-frame-pointer");
4130
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004131 // Explicitly error on some things we know we don't support and can't just
4132 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00004133 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004134 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4135 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004136 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004137 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004138 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4139 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004140 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004141 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004142 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004143 }
4144
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004145 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004146 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004147 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004148 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004149 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4150 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004151 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004152 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004153 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004154
Chad Rosierbe10f982011-08-02 17:58:04 +00004155 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004156 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004157 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4158 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004159 }
4160
Rafael Espindola08a692a2010-03-07 04:46:18 +00004161 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004162 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004163 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004164 // If the last option explicitly specified a debug-info level, use it.
4165 if (A->getOption().matches(options::OPT_gN_Group)) {
4166 DebugInfoKind = DebugLevelToInfoKind(*A);
4167 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4168 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4169 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004170 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004171 A->getIndex() > SplitDwarfArg->getIndex())
4172 SplitDwarfArg = nullptr;
4173 } else
4174 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004175 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004176 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004177
Paul Robinson0334a042015-12-19 19:41:48 +00004178 // If a debugger tuning argument appeared, remember it.
4179 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4180 options::OPT_ggdbN_Group)) {
4181 if (A->getOption().matches(options::OPT_glldb))
4182 DebuggerTuning = llvm::DebuggerKind::LLDB;
4183 else if (A->getOption().matches(options::OPT_gsce))
4184 DebuggerTuning = llvm::DebuggerKind::SCE;
4185 else
4186 DebuggerTuning = llvm::DebuggerKind::GDB;
4187 }
4188
4189 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004190 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004191 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004192 DwarfVersion = DwarfVersionNum(A->getSpelling());
4193
Reid Kleckner124955a2015-08-05 18:51:13 +00004194 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004195 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4196 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4197 // DwarfVersion remains at 0 if no explicit choice was made.
4198 CmdArgs.push_back("-gcodeview");
4199 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004200 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004201 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4202 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004203
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004204 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4205 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004206
4207 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004208 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004209 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004210 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004211
Eric Christopher138c32b2013-09-13 22:37:55 +00004212 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004213 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004214 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004215 CmdArgs.push_back("-dwarf-ext-refs");
4216 CmdArgs.push_back("-fmodule-format=obj");
4217 }
4218
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004219 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4220 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004221 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004222 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004223 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004224 CmdArgs.push_back("-backend-option");
4225 CmdArgs.push_back("-split-dwarf=Enable");
4226 }
4227
Douglas Katzman3459ce22015-10-08 04:24:12 +00004228 // After we've dealt with all combinations of things that could
4229 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4230 // figure out if we need to "upgrade" it to standalone debug info.
4231 // We parse these two '-f' options whether or not they will be used,
4232 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4233 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4234 options::OPT_fno_standalone_debug,
4235 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004236 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4237 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004238 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4239 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004240
Eric Christopher138c32b2013-09-13 22:37:55 +00004241 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4242 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4243 CmdArgs.push_back("-backend-option");
4244 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4245 }
Eric Christophereec89c22013-06-18 00:03:50 +00004246
Eric Christopher0d403d22014-02-14 01:27:03 +00004247 // -gdwarf-aranges turns on the emission of the aranges section in the
4248 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004249 // Always enabled on the PS4.
4250 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004251 CmdArgs.push_back("-backend-option");
4252 CmdArgs.push_back("-generate-arange-section");
4253 }
4254
David Blaikief36d9ba2014-01-27 18:52:43 +00004255 if (Args.hasFlag(options::OPT_fdebug_types_section,
4256 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004257 CmdArgs.push_back("-backend-option");
4258 CmdArgs.push_back("-generate-type-units");
4259 }
Eric Christophereec89c22013-06-18 00:03:50 +00004260
Dan Gohmana5b804b2016-01-07 00:50:27 +00004261 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4262 // default.
4263 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4264 Triple.getArch() == llvm::Triple::wasm32 ||
4265 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004266
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004267 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004268 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004269 CmdArgs.push_back("-ffunction-sections");
4270 }
4271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4273 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004274 CmdArgs.push_back("-fdata-sections");
4275 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004276
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004277 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004278 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004279 CmdArgs.push_back("-fno-unique-section-names");
4280
Chris Lattner3c77a352010-06-22 00:03:40 +00004281 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4282
Diego Novilloa0545962015-07-10 18:00:07 +00004283 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004284
Paul Robinsond083b9a2015-12-16 17:25:27 +00004285 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4286 if (getToolChain().getTriple().isPS4CPU())
4287 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4288
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004289 // Pass options for controlling the default header search paths.
4290 if (Args.hasArg(options::OPT_nostdinc)) {
4291 CmdArgs.push_back("-nostdsysteminc");
4292 CmdArgs.push_back("-nobuiltininc");
4293 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004294 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004295 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004296 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4297 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4298 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004299
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004300 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004301 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004302 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004303
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004304 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4305
Ted Kremenekf7639e12012-03-06 20:06:33 +00004306 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004307 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004308 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004309 options::OPT_ccc_arcmt_modify,
4310 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004311 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004312 switch (A->getOption().getID()) {
4313 default:
4314 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004315 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004316 CmdArgs.push_back("-arcmt-check");
4317 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004318 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004319 CmdArgs.push_back("-arcmt-modify");
4320 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004321 case options::OPT_ccc_arcmt_migrate:
4322 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004323 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004324 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004325
4326 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4327 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004328 break;
John McCalld70fb982011-06-15 23:25:17 +00004329 }
4330 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004331 } else {
4332 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4333 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4334 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004335 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004336
Ted Kremenekf7639e12012-03-06 20:06:33 +00004337 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4338 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004339 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4340 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004341 }
4342 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004343 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004344
4345 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004346 options::OPT_objcmt_migrate_subscripting,
4347 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004348 // None specified, means enable them all.
4349 CmdArgs.push_back("-objcmt-migrate-literals");
4350 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004351 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004352 } else {
4353 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4354 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004355 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004356 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004357 } else {
4358 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4359 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4360 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4361 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4362 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4363 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004364 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004365 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4366 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4367 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4368 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4369 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4370 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4371 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004372 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004373 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004374 }
4375
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004376 // Add preprocessing options like -I, -D, etc. if we are using the
4377 // preprocessor.
4378 //
4379 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004380 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004381 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4382 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004383
Rafael Espindolaa7431922011-07-21 23:40:37 +00004384 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4385 // that "The compiler can only warn and ignore the option if not recognized".
4386 // When building with ccache, it will pass -D options to clang even on
4387 // preprocessed inputs and configure concludes that -fPIC is not supported.
4388 Args.ClaimAllArgs(options::OPT_D);
4389
Alp Toker7874bdc2013-11-15 20:40:58 +00004390 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004391 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4392 if (A->getOption().matches(options::OPT_O4)) {
4393 CmdArgs.push_back("-O3");
4394 D.Diag(diag::warn_O4_is_O3);
4395 } else {
4396 A->render(Args, CmdArgs);
4397 }
4398 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004399
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004400 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004401 for (const Arg *A :
4402 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4403 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004404 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004405 }
4406
Rafael Espindola577637a2015-01-03 00:06:04 +00004407 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004408
Richard Smith3be1cb22014-08-07 00:24:21 +00004409 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004410 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004411 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4412 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004413 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004414 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004415
4416 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004417 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004418 //
4419 // If a std is supplied, only add -trigraphs if it follows the
4420 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004421 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004422 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4423 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004424 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004425 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004426 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004427 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004428 else
4429 Std->render(Args, CmdArgs);
4430
Nico Weber00721502014-12-23 22:32:37 +00004431 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004432 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004433 options::OPT_ftrigraphs,
4434 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004435 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004436 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004437 } else {
4438 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004439 //
4440 // FIXME: Clang doesn't correctly handle -std= when the input language
4441 // doesn't match. For the time being just ignore this for C++ inputs;
4442 // eventually we want to do all the standard defaulting here instead of
4443 // splitting it between the driver and clang -cc1.
4444 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004445 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4446 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004447 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004448 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004449
Nico Weber00721502014-12-23 22:32:37 +00004450 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4451 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004452 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004453
Richard Smith282b4492013-09-04 22:50:31 +00004454 // GCC's behavior for -Wwrite-strings is a bit strange:
4455 // * In C, this "warning flag" changes the types of string literals from
4456 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4457 // for the discarded qualifier.
4458 // * In C++, this is just a normal warning flag.
4459 //
4460 // Implementing this warning correctly in C is hard, so we follow GCC's
4461 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4462 // a non-const char* in C, rather than using this crude hack.
4463 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004464 // FIXME: This should behave just like a warning flag, and thus should also
4465 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4466 Arg *WriteStrings =
4467 Args.getLastArg(options::OPT_Wwrite_strings,
4468 options::OPT_Wno_write_strings, options::OPT_w);
4469 if (WriteStrings &&
4470 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004471 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004472 }
4473
Chandler Carruth61fbf622011-04-23 09:27:53 +00004474 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004475 // during C++ compilation, which it is by default. GCC keeps this define even
4476 // in the presence of '-w', match this behavior bug-for-bug.
4477 if (types::isCXX(InputType) &&
4478 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4479 true)) {
4480 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004481 }
4482
Chandler Carruthe0391482010-05-22 02:21:53 +00004483 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4484 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4485 if (Asm->getOption().matches(options::OPT_fasm))
4486 CmdArgs.push_back("-fgnu-keywords");
4487 else
4488 CmdArgs.push_back("-fno-gnu-keywords");
4489 }
4490
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004491 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4492 CmdArgs.push_back("-fno-dwarf-directory-asm");
4493
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004494 if (ShouldDisableAutolink(Args, getToolChain()))
4495 CmdArgs.push_back("-fno-autolink");
4496
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004497 // Add in -fdebug-compilation-dir if necessary.
4498 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004499
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004500 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4501 StringRef Map = A->getValue();
4502 if (Map.find('=') == StringRef::npos)
4503 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4504 else
4505 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4506 A->claim();
4507 }
4508
Richard Smith9a568822011-11-21 19:36:32 +00004509 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4510 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004511 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004512 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004513 }
4514
Richard Smith79c927b2013-11-06 19:31:51 +00004515 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4516 CmdArgs.push_back("-foperator-arrow-depth");
4517 CmdArgs.push_back(A->getValue());
4518 }
4519
Richard Smith9a568822011-11-21 19:36:32 +00004520 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4521 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004522 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004523 }
4524
Richard Smitha3d3bd22013-05-08 02:12:03 +00004525 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4526 CmdArgs.push_back("-fconstexpr-steps");
4527 CmdArgs.push_back(A->getValue());
4528 }
4529
Richard Smithb3a14522013-02-22 01:59:51 +00004530 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4531 CmdArgs.push_back("-fbracket-depth");
4532 CmdArgs.push_back(A->getValue());
4533 }
4534
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004535 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4536 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004537 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004538 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004539 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4540 } else
4541 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004542 }
4543
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004544 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004545 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004546
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004547 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4548 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004549 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004550 }
David Chisnall5778fce2009-08-31 16:41:57 +00004551
Chris Lattnere23003d2010-01-09 21:54:33 +00004552 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4553 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004554 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004555 }
4556
Chris Lattnerb35583d2010-04-07 20:49:23 +00004557 CmdArgs.push_back("-ferror-limit");
4558 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004559 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004560 else
4561 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004562
Chandler Carrutha77a7272010-05-06 04:55:18 +00004563 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4564 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004565 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004566 }
4567
4568 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4569 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004570 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004571 }
4572
Richard Smithf6f003a2011-12-16 19:06:07 +00004573 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4574 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004575 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004576 }
4577
Nick Lewycky24653262014-12-16 21:39:02 +00004578 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4579 CmdArgs.push_back("-fspell-checking-limit");
4580 CmdArgs.push_back(A->getValue());
4581 }
4582
Daniel Dunbar2c978472009-11-04 06:24:47 +00004583 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004584 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004585 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004586 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004587 } else {
4588 // If -fmessage-length=N was not specified, determine whether this is a
4589 // terminal and, if so, implicitly define -fmessage-length appropriately.
4590 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004591 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004592 }
4593
John McCallb4a99d32013-02-19 01:57:35 +00004594 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4595 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4596 options::OPT_fvisibility_ms_compat)) {
4597 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4598 CmdArgs.push_back("-fvisibility");
4599 CmdArgs.push_back(A->getValue());
4600 } else {
4601 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4602 CmdArgs.push_back("-fvisibility");
4603 CmdArgs.push_back("hidden");
4604 CmdArgs.push_back("-ftype-visibility");
4605 CmdArgs.push_back("default");
4606 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004607 }
4608
Douglas Gregor08329632010-06-15 17:05:35 +00004609 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004610
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004611 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4612
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004613 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004614 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4615 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004616 CmdArgs.push_back("-ffreestanding");
4617
Daniel Dunbare357d562009-12-03 18:42:11 +00004618 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004619 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004620 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004621 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004622 // Emulated TLS is enabled by default on Android, and can be enabled manually
4623 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004624 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004625 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4626 EmulatedTLSDefault))
4627 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004628 // AltiVec-like language extensions aren't relevant for assembling.
4629 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004630 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004631 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4632 }
Richard Trieu91844232012-06-26 18:18:47 +00004633 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4634 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004635
Alexey Bataevdb390212015-05-20 04:24:19 +00004636 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004637 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4638 options::OPT_fno_openmp, false))
4639 switch (getOpenMPRuntime(getToolChain(), Args)) {
4640 case OMPRT_OMP:
4641 case OMPRT_IOMP5:
4642 // Clang can generate useful OpenMP code for these two runtime libraries.
4643 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004644
4645 // If no option regarding the use of TLS in OpenMP codegeneration is
4646 // given, decide a default based on the target. Otherwise rely on the
4647 // options and pass the right information to the frontend.
4648 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004649 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004650 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004651 break;
4652 default:
4653 // By default, if Clang doesn't know how to generate useful OpenMP code
4654 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4655 // down to the actual compilation.
4656 // FIXME: It would be better to have a mode which *only* omits IR
4657 // generation based on the OpenMP support so that we get consistent
4658 // semantic analysis, etc.
4659 break;
4660 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004661
Peter Collingbourne32701642013-11-01 18:16:25 +00004662 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004663 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004664
Eric Christopher459d2712013-02-19 06:16:53 +00004665 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004666 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4667 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4668 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4669 Arch == llvm::Triple::ppc64le))
4670 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4671 << "ppc/ppc64/ppc64le";
4672 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004673
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004674 // -fzvector is incompatible with -faltivec.
4675 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4676 if (Args.hasArg(options::OPT_faltivec))
4677 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4678 << "-faltivec";
4679
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004680 if (getToolChain().SupportsProfiling())
4681 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004682
4683 // -flax-vector-conversions is default.
4684 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4685 options::OPT_fno_lax_vector_conversions))
4686 CmdArgs.push_back("-fno-lax-vector-conversions");
4687
John Brawna7b4ec02015-08-10 11:11:28 +00004688 if (Args.getLastArg(options::OPT_fapple_kext) ||
4689 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004690 CmdArgs.push_back("-fapple-kext");
4691
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004692 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004693 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004694 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004695 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4696 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004697
4698 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4699 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004700 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004701 }
4702
Bob Wilson14adb362012-02-03 06:27:22 +00004703 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004704
Chandler Carruth6e501032011-03-27 00:04:55 +00004705 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4706 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004707 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004708 if (A->getOption().matches(options::OPT_fwrapv))
4709 CmdArgs.push_back("-fwrapv");
4710 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4711 options::OPT_fno_strict_overflow)) {
4712 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4713 CmdArgs.push_back("-fwrapv");
4714 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004715
4716 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4717 options::OPT_fno_reroll_loops))
4718 if (A->getOption().matches(options::OPT_freroll_loops))
4719 CmdArgs.push_back("-freroll-loops");
4720
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004721 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004722 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4723 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004724
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004725 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4726
Daniel Dunbar4930e332009-11-17 08:07:36 +00004727 // -stack-protector=0 is default.
4728 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004729 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4730 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4731 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4732 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4733 Args.ClaimAllArgs(options::OPT_fstack_protector);
4734 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004735 options::OPT_fstack_protector_all,
4736 options::OPT_fstack_protector_strong,
4737 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004738 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004739 StackProtectorLevel = std::max<unsigned>(
4740 LangOptions::SSPOn,
4741 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004742 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004743 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004744 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004745 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004746 } else {
4747 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004748 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004749 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004750 if (StackProtectorLevel) {
4751 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004752 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004753 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004754
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004755 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004756 for (const Arg *A : Args.filtered(options::OPT__param)) {
4757 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004758 if (Str.startswith("ssp-buffer-size=")) {
4759 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004760 CmdArgs.push_back("-stack-protector-buffer-size");
4761 // FIXME: Verify the argument is a valid integer.
4762 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004763 }
Sean Silva14facf32015-06-09 01:57:17 +00004764 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004765 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004766 }
4767
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004768 // Translate -mstackrealign
4769 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004770 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004771 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004772
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004773 if (Args.hasArg(options::OPT_mstack_alignment)) {
4774 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4775 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004776 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004777
Hans Wennborg77dc2362015-01-20 19:45:50 +00004778 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4779 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4780
4781 if (!Size.empty())
4782 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4783 else
4784 CmdArgs.push_back("-mstack-probe-size=0");
4785 }
4786
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004787 switch (getToolChain().getArch()) {
4788 case llvm::Triple::aarch64:
4789 case llvm::Triple::aarch64_be:
4790 case llvm::Triple::arm:
4791 case llvm::Triple::armeb:
4792 case llvm::Triple::thumb:
4793 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004794 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004795 break;
4796
4797 default:
4798 break;
4799 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004800
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004801 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4802 options::OPT_mno_restrict_it)) {
4803 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4804 CmdArgs.push_back("-backend-option");
4805 CmdArgs.push_back("-arm-restrict-it");
4806 } else {
4807 CmdArgs.push_back("-backend-option");
4808 CmdArgs.push_back("-arm-no-restrict-it");
4809 }
James Y Knight2db38f32015-08-15 03:45:25 +00004810 } else if (Triple.isOSWindows() &&
4811 (Triple.getArch() == llvm::Triple::arm ||
4812 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004813 // Windows on ARM expects restricted IT blocks
4814 CmdArgs.push_back("-backend-option");
4815 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004816 }
4817
Daniel Dunbard18049a2009-04-07 21:16:11 +00004818 // Forward -f options with positive and negative forms; we translate
4819 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004820 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4821 StringRef fname = A->getValue();
4822 if (!llvm::sys::fs::exists(fname))
4823 D.Diag(diag::err_drv_no_such_file) << fname;
4824 else
4825 A->render(Args, CmdArgs);
4826 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004827
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004828 // -fbuiltin is default unless -mkernel is used.
4829 bool UseBuiltins =
4830 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4831 !Args.hasArg(options::OPT_mkernel));
4832 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004833 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004834
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004835 // -ffreestanding implies -fno-builtin.
4836 if (Args.hasArg(options::OPT_ffreestanding))
4837 UseBuiltins = false;
4838
4839 // Process the -fno-builtin-* options.
4840 for (const auto &Arg : Args) {
4841 const Option &O = Arg->getOption();
4842 if (!O.matches(options::OPT_fno_builtin_))
4843 continue;
4844
4845 Arg->claim();
4846 // If -fno-builtin is specified, then there's no need to pass the option to
4847 // the frontend.
4848 if (!UseBuiltins)
4849 continue;
4850
4851 StringRef FuncName = Arg->getValue();
4852 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4853 }
4854
Nuno Lopes13c88c72009-12-16 16:59:22 +00004855 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4856 options::OPT_fno_assume_sane_operator_new))
4857 CmdArgs.push_back("-fno-assume-sane-operator-new");
4858
Daniel Dunbar4930e332009-11-17 08:07:36 +00004859 // -fblocks=0 is default.
4860 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004861 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004862 (Args.hasArg(options::OPT_fgnu_runtime) &&
4863 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4864 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004865 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004866
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004867 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004868 !getToolChain().hasBlocksRuntime())
4869 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004870 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004871
Richard Smith47972af2015-06-16 00:08:24 +00004872 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004873 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004874 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004875 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004876 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004877 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4878 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004879 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004880 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004881 HaveModules = true;
4882 }
4883 }
4884
Richard Smith47972af2015-06-16 00:08:24 +00004885 // -fmodule-maps enables implicit reading of module map files. By default,
4886 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004887 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4888 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004889 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004890 }
4891
Daniel Jasperac42b752013-10-21 06:34:34 +00004892 // -fmodules-decluse checks that modules used are declared so (off by
4893 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004894 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004895 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004896 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004897 }
4898
Daniel Jasper962b38e2014-04-11 11:47:45 +00004899 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4900 // all #included headers are part of modules.
4901 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004902 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004903 CmdArgs.push_back("-fmodules-strict-decluse");
4904 }
4905
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004906 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4907 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4908 options::OPT_fno_implicit_modules)) {
4909 CmdArgs.push_back("-fno-implicit-modules");
4910 }
4911
Daniel Jasperac42b752013-10-21 06:34:34 +00004912 // -fmodule-name specifies the module that is currently being built (or
4913 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004914 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004915
Richard Smith9887d792014-10-17 01:42:53 +00004916 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004917 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004918 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004919
Richard Smithe842a472014-10-22 02:05:46 +00004920 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004921 if (HaveModules)
4922 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4923 else
4924 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004925
4926 // -fmodule-cache-path specifies where our implicitly-built module files
4927 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004928 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004929 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004930 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004931 if (HaveModules) {
4932 if (C.isForDiagnostics()) {
4933 // When generating crash reports, we want to emit the modules along with
4934 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004935 Path = Output.getFilename();
4936 llvm::sys::path::replace_extension(Path, ".cache");
4937 llvm::sys::path::append(Path, "modules");
4938 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004939 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004940 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004941 llvm::sys::path::append(Path, "org.llvm.clang.");
4942 appendUserToPath(Path);
4943 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004944 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004945 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004946 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4947 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004948 }
4949
4950 // When building modules and generating crashdumps, we need to dump a module
4951 // dependency VFS alongside the output.
4952 if (HaveModules && C.isForDiagnostics()) {
4953 SmallString<128> VFSDir(Output.getFilename());
4954 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004955 // Add the cache directory as a temp so the crash diagnostics pick it up.
4956 C.addTempFile(Args.MakeArgString(VFSDir));
4957
Justin Bognera88f0122014-06-20 22:59:50 +00004958 llvm::sys::path::append(VFSDir, "vfs");
4959 CmdArgs.push_back("-module-dependency-dir");
4960 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004961 }
4962
Richard Smith9887d792014-10-17 01:42:53 +00004963 if (HaveModules)
4964 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004965
Douglas Gregor35b04d62013-02-07 19:01:24 +00004966 // Pass through all -fmodules-ignore-macro arguments.
4967 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004968 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4969 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004970
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004971 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4972
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004973 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4974 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4975 D.Diag(diag::err_drv_argument_not_allowed_with)
4976 << A->getAsString(Args) << "-fbuild-session-timestamp";
4977
4978 llvm::sys::fs::file_status Status;
4979 if (llvm::sys::fs::status(A->getValue(), Status))
4980 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004981 CmdArgs.push_back(Args.MakeArgString(
4982 "-fbuild-session-timestamp=" +
4983 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004984 }
4985
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004986 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004987 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4988 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004989 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4990
4991 Args.AddLastArg(CmdArgs,
4992 options::OPT_fmodules_validate_once_per_build_session);
4993 }
4994
Ben Langmuirdcf73862014-03-12 00:06:17 +00004995 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4996
John McCalldfea9982010-04-09 19:12:06 +00004997 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004998 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004999 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005000 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005001
Anders Carlssond470fef2010-11-21 00:09:52 +00005002 // -felide-constructors is the default.
5003 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005004 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005005 CmdArgs.push_back("-fno-elide-constructors");
5006
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005007 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005008
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005009 if (KernelOrKext || (types::isCXX(InputType) &&
5010 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5011 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005012 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005013
Tony Linthicum76329bf2011-12-12 21:14:55 +00005014 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005015 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5016 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005017 CmdArgs.push_back("-fshort-enums");
5018
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005019 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005020 if (Arg *A = Args.getLastArg(
5021 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5022 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5023 if (A->getOption().matches(options::OPT_funsigned_char) ||
5024 A->getOption().matches(options::OPT_fno_signed_char)) {
5025 CmdArgs.push_back("-fno-signed-char");
5026 }
5027 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005028 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005029 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005030
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005031 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005032 if (!Args.hasFlag(
5033 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5034 !IsWindowsCygnus && !IsWindowsGNU &&
5035 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5036 getToolChain().getArch() != llvm::Triple::hexagon &&
5037 getToolChain().getArch() != llvm::Triple::xcore &&
5038 ((getToolChain().getTriple().getVendor() !=
5039 llvm::Triple::MipsTechnologies) ||
5040 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005041 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005042 CmdArgs.push_back("-fno-use-cxa-atexit");
5043
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005044 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005045 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005046 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005047 CmdArgs.push_back("-fms-extensions");
5048
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005049 // -fno-use-line-directives is default.
5050 if (Args.hasFlag(options::OPT_fuse_line_directives,
5051 options::OPT_fno_use_line_directives, false))
5052 CmdArgs.push_back("-fuse-line-directives");
5053
Francois Pichet1b4f1632011-09-17 04:32:15 +00005054 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005055 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005056 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005057 (IsWindowsMSVC &&
5058 Args.hasFlag(options::OPT_fms_extensions,
5059 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005060 CmdArgs.push_back("-fms-compatibility");
5061
David Majnemerc371ff02015-03-22 08:39:22 +00005062 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005063 VersionTuple MSVT = visualstudio::getMSVCVersion(
5064 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5065 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005066 CmdArgs.push_back(
5067 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005068
David Majnemer8db91762015-05-18 04:49:30 +00005069 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5070 if (ImplyVCPPCXXVer) {
5071 if (IsMSVC2015Compatible)
5072 CmdArgs.push_back("-std=c++14");
5073 else
5074 CmdArgs.push_back("-std=c++11");
5075 }
5076
Eric Christopher5ecce122013-02-18 00:38:31 +00005077 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005078 if (Args.hasFlag(options::OPT_fborland_extensions,
5079 options::OPT_fno_borland_extensions, false))
5080 CmdArgs.push_back("-fborland-extensions");
5081
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005082 // -fno-declspec is default, except for PS4.
5083 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5084 getToolChain().getTriple().isPS4()))
5085 CmdArgs.push_back("-fdeclspec");
5086 else if (Args.hasArg(options::OPT_fno_declspec))
5087 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5088
David Majnemerc371ff02015-03-22 08:39:22 +00005089 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5090 // than 19.
5091 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5092 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005093 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005094 CmdArgs.push_back("-fno-threadsafe-statics");
5095
Francois Pichet02744872011-09-01 16:38:08 +00005096 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5097 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005098 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005099 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005100 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005101
Chandler Carruthe03aa552010-04-17 20:17:31 +00005102 // -fgnu-keywords default varies depending on language; only pass if
5103 // specified.
5104 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005105 options::OPT_fno_gnu_keywords))
5106 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005107
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005108 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005109 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005110 CmdArgs.push_back("-fgnu89-inline");
5111
Chad Rosier9c76d242012-03-15 22:31:42 +00005112 if (Args.hasArg(options::OPT_fno_inline))
5113 CmdArgs.push_back("-fno-inline");
5114
Chad Rosier64d6be92012-03-06 21:17:19 +00005115 if (Args.hasArg(options::OPT_fno_inline_functions))
5116 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005117
John McCall5fb5df92012-06-20 06:18:46 +00005118 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005119
John McCall5fb5df92012-06-20 06:18:46 +00005120 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005121 // legacy is the default. Except for deployment taget of 10.5,
5122 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5123 // gets ignored silently.
5124 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005125 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5126 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005127 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005128 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005129 if (getToolChain().UseObjCMixedDispatch())
5130 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5131 else
5132 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5133 }
5134 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005135
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005136 // When ObjectiveC legacy runtime is in effect on MacOSX,
5137 // turn on the option to do Array/Dictionary subscripting
5138 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005139 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005140 getToolChain().getTriple().isMacOSX() &&
5141 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5142 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005143 objcRuntime.isNeXTFamily())
5144 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005145
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005146 // -fencode-extended-block-signature=1 is default.
5147 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5148 CmdArgs.push_back("-fencode-extended-block-signature");
5149 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005150
John McCall24fc0de2011-07-06 00:26:06 +00005151 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5152 // NOTE: This logic is duplicated in ToolChains.cpp.
5153 bool ARC = isObjCAutoRefCount(Args);
5154 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005155 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005156
John McCall24fc0de2011-07-06 00:26:06 +00005157 CmdArgs.push_back("-fobjc-arc");
5158
Chandler Carruth491db322011-11-04 07:34:47 +00005159 // FIXME: It seems like this entire block, and several around it should be
5160 // wrapped in isObjC, but for now we just use it here as this is where it
5161 // was being used previously.
5162 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5163 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5164 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5165 else
5166 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5167 }
5168
John McCall24fc0de2011-07-06 00:26:06 +00005169 // Allow the user to enable full exceptions code emission.
5170 // We define off for Objective-CC, on for Objective-C++.
5171 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5172 options::OPT_fno_objc_arc_exceptions,
5173 /*default*/ types::isCXX(InputType)))
5174 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005175
John McCall24fc0de2011-07-06 00:26:06 +00005176 }
5177
5178 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5179 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005180 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005181 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005182
John McCall24fc0de2011-07-06 00:26:06 +00005183 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5184 // takes precedence.
5185 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5186 if (!GCArg)
5187 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5188 if (GCArg) {
5189 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005190 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005191 } else if (getToolChain().SupportsObjCGC()) {
5192 GCArg->render(Args, CmdArgs);
5193 } else {
5194 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005195 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005196 }
5197 }
5198
John McCallfbe5ed72015-11-05 19:19:56 +00005199 // Pass down -fobjc-weak or -fno-objc-weak if present.
5200 if (types::isObjC(InputType)) {
5201 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5202 options::OPT_fno_objc_weak);
5203 if (!WeakArg) {
5204 // nothing to do
5205 } else if (GCArg) {
5206 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5207 D.Diag(diag::err_objc_weak_with_gc);
5208 } else if (!objcRuntime.allowsWeak()) {
5209 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5210 D.Diag(diag::err_objc_weak_unsupported);
5211 } else {
5212 WeakArg->render(Args, CmdArgs);
5213 }
5214 }
5215
Bob Wilsonb111ec92015-03-02 19:01:14 +00005216 if (Args.hasFlag(options::OPT_fapplication_extension,
5217 options::OPT_fno_application_extension, false))
5218 CmdArgs.push_back("-fapplication-extension");
5219
Reid Klecknerc542d372014-06-27 17:02:02 +00005220 // Handle GCC-style exception args.
5221 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5223 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005224
Tim Northovere931f9f2015-10-30 16:30:41 +00005225 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005226 CmdArgs.push_back("-fsjlj-exceptions");
5227
5228 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005229 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5230 options::OPT_fno_assume_sane_operator_new))
5231 CmdArgs.push_back("-fno-assume-sane-operator-new");
5232
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005233 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5234 // most platforms.
5235 if (Args.hasFlag(options::OPT_fsized_deallocation,
5236 options::OPT_fno_sized_deallocation, false))
5237 CmdArgs.push_back("-fsized-deallocation");
5238
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005239 // -fconstant-cfstrings is default, and may be subject to argument translation
5240 // on Darwin.
5241 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5242 options::OPT_fno_constant_cfstrings) ||
5243 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5244 options::OPT_mno_constant_cfstrings))
5245 CmdArgs.push_back("-fno-constant-cfstrings");
5246
John Thompsoned4e2952009-11-05 20:14:16 +00005247 // -fshort-wchar default varies depending on platform; only
5248 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005249 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5250 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005251 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005252
Hans Wennborg28c96312013-07-31 23:39:13 +00005253 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005254 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005256 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005257
Daniel Dunbar096ed292011-10-05 21:04:55 +00005258 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5259 // -fno-pack-struct doesn't apply to -fpack-struct=.
5260 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005261 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005262 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005263 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005264 } else if (Args.hasFlag(options::OPT_fpack_struct,
5265 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005266 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005267 }
5268
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005269 // Handle -fmax-type-align=N and -fno-type-align
5270 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5271 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5272 if (!SkipMaxTypeAlign) {
5273 std::string MaxTypeAlignStr = "-fmax-type-align=";
5274 MaxTypeAlignStr += A->getValue();
5275 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5276 }
5277 } else if (getToolChain().getTriple().isOSDarwin()) {
5278 if (!SkipMaxTypeAlign) {
5279 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5280 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5281 }
5282 }
5283
John Brawna7b4ec02015-08-10 11:11:28 +00005284 // -fcommon is the default unless compiling kernel code or the target says so
5285 bool NoCommonDefault =
5286 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5287 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5288 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005289 CmdArgs.push_back("-fno-common");
5290
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005291 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005292 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005293 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005294 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005295 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005296 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005297
Daniel Dunbar6358d682010-10-15 22:30:42 +00005298 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005299 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005300 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005301 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005302
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005303 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005304 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5305 StringRef value = inputCharset->getValue();
5306 if (value != "UTF-8")
5307 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5308 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005309 }
5310
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005311 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005312 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5313 StringRef value = execCharset->getValue();
5314 if (value != "UTF-8")
5315 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5316 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005317 }
5318
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005319 // -fcaret-diagnostics is default.
5320 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5321 options::OPT_fno_caret_diagnostics, true))
5322 CmdArgs.push_back("-fno-caret-diagnostics");
5323
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005324 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005325 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005326 options::OPT_fno_diagnostics_fixit_info))
5327 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005328
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005329 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005330 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005331 options::OPT_fno_diagnostics_show_option))
5332 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005333
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005334 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005335 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005336 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005337 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005338 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005339
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005340 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005341 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005342 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005343 }
5344
Chandler Carruthb6766f02011-03-27 01:50:55 +00005345 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005346 options::OPT_fdiagnostics_show_note_include_stack,
5347 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005348 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005349 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005350 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5351 else
5352 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5353 }
5354
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005355 // Color diagnostics are the default, unless the terminal doesn't support
5356 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005357 // Support both clang's -f[no-]color-diagnostics and gcc's
5358 // -f[no-]diagnostics-colors[=never|always|auto].
5359 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005360 for (const auto &Arg : Args) {
5361 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005362 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5363 !O.matches(options::OPT_fdiagnostics_color) &&
5364 !O.matches(options::OPT_fno_color_diagnostics) &&
5365 !O.matches(options::OPT_fno_diagnostics_color) &&
5366 !O.matches(options::OPT_fdiagnostics_color_EQ))
5367 continue;
5368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005369 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005370 if (O.matches(options::OPT_fcolor_diagnostics) ||
5371 O.matches(options::OPT_fdiagnostics_color)) {
5372 ShowColors = Colors_On;
5373 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5374 O.matches(options::OPT_fno_diagnostics_color)) {
5375 ShowColors = Colors_Off;
5376 } else {
5377 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005378 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005379 if (value == "always")
5380 ShowColors = Colors_On;
5381 else if (value == "never")
5382 ShowColors = Colors_Off;
5383 else if (value == "auto")
5384 ShowColors = Colors_Auto;
5385 else
5386 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005387 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005388 }
5389 }
5390 if (ShowColors == Colors_On ||
5391 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005392 CmdArgs.push_back("-fcolor-diagnostics");
5393
Nico Rieck7857d462013-09-11 00:38:02 +00005394 if (Args.hasArg(options::OPT_fansi_escape_codes))
5395 CmdArgs.push_back("-fansi-escape-codes");
5396
Daniel Dunbardb097022009-06-08 21:13:54 +00005397 if (!Args.hasFlag(options::OPT_fshow_source_location,
5398 options::OPT_fno_show_source_location))
5399 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005400
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005402 true))
5403 CmdArgs.push_back("-fno-show-column");
5404
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005405 if (!Args.hasFlag(options::OPT_fspell_checking,
5406 options::OPT_fno_spell_checking))
5407 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005408
Chad Rosierc8e56e82012-12-05 21:08:21 +00005409 // -fno-asm-blocks is default.
5410 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5411 false))
5412 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005413
Steven Wucb0d13f2015-01-16 23:05:28 +00005414 // -fgnu-inline-asm is default.
5415 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5416 options::OPT_fno_gnu_inline_asm, true))
5417 CmdArgs.push_back("-fno-gnu-inline-asm");
5418
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005419 // Enable vectorization per default according to the optimization level
5420 // selected. For optimization levels that want vectorization we use the alias
5421 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005422 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005423 OptSpecifier VectorizeAliasOption =
5424 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005425 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005426 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005427 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005428
Chad Rosier136d67d2014-04-28 19:30:57 +00005429 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005430 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005431 OptSpecifier SLPVectAliasOption =
5432 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005433 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005434 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005435 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005436
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005437 // -fno-slp-vectorize-aggressive is default.
5438 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005439 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005440 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005441
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005442 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5443 A->render(Args, CmdArgs);
5444
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005445 // -fdollars-in-identifiers default varies depending on platform and
5446 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005447 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005448 options::OPT_fno_dollars_in_identifiers)) {
5449 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005450 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005451 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005452 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005453 }
5454
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005455 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5456 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005457 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005458 options::OPT_fno_unit_at_a_time)) {
5459 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005460 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005461 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005462
Eli Friedman055c9702011-11-02 01:53:16 +00005463 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5464 options::OPT_fno_apple_pragma_pack, false))
5465 CmdArgs.push_back("-fapple-pragma-pack");
5466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005467 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005468 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5469 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005470 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005471 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005472 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005474// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5475//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005476// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005477#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005478 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005479 (getToolChain().getArch() == llvm::Triple::arm ||
5480 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005481 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5482 CmdArgs.push_back("-fno-builtin-strcat");
5483 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5484 CmdArgs.push_back("-fno-builtin-strcpy");
5485 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005486#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005487
Justin Bognera88f0122014-06-20 22:59:50 +00005488 // Enable rewrite includes if the user's asked for it or if we're generating
5489 // diagnostics.
5490 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5491 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005492 if (Args.hasFlag(options::OPT_frewrite_includes,
5493 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005494 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005495 CmdArgs.push_back("-frewrite-includes");
5496
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005497 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005498 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005499 options::OPT_traditional_cpp)) {
5500 if (isa<PreprocessJobAction>(JA))
5501 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005502 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005503 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005504 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005505
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005506 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005507 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005508
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005509 // Handle serialized diagnostics.
5510 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5511 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005512 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005513 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005514
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005515 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5516 CmdArgs.push_back("-fretain-comments-from-system-headers");
5517
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005518 // Forward -fcomment-block-commands to -cc1.
5519 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005520 // Forward -fparse-all-comments to -cc1.
5521 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005522
John Brawnad31ace2015-09-23 13:55:40 +00005523 // Turn -fplugin=name.so into -load name.so
5524 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5525 CmdArgs.push_back("-load");
5526 CmdArgs.push_back(A->getValue());
5527 A->claim();
5528 }
5529
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005530 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5531 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005532 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005533 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5534 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005535
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005536 // We translate this by hand to the -cc1 argument, since nightly test uses
5537 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005538 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005539 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005540 } else
Sean Silva14facf32015-06-09 01:57:17 +00005541 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005542 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005543
Bob Wilson23a55f12014-12-21 07:00:00 +00005544 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005545 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5546 // by the frontend.
5547 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5548 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005549
Daniel Dunbard67a3222009-03-30 06:36:42 +00005550 if (Output.getType() == types::TY_Dependencies) {
5551 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005552 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005553 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005554 CmdArgs.push_back(Output.getFilename());
5555 } else {
5556 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005557 }
5558
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005559 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005560
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005561 if (Input.isFilename())
5562 CmdArgs.push_back(Input.getFilename());
5563 else
5564 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005565
Chris Lattnere9d7d782009-11-03 19:50:27 +00005566 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5567
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005568 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005569
5570 // Optionally embed the -cc1 level arguments into the debug info, for build
5571 // analysis.
5572 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005573 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005574 for (const auto &Arg : Args)
5575 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005576
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005577 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005578 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005579 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005580 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005581 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005582 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005583 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005584 }
5585 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005586 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005587 }
5588
Eric Christopherd3804002013-02-22 20:12:52 +00005589 // Add the split debug info name to the command lines here so we
5590 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005591 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005592 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5593 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005594 const char *SplitDwarfOut;
5595 if (SplitDwarf) {
5596 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005597 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005598 CmdArgs.push_back(SplitDwarfOut);
5599 }
5600
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005601 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5602 // Include them with -fcuda-include-gpubinary.
5603 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005604 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005605 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005606 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005607 }
5608
Eric Christopherd3804002013-02-22 20:12:52 +00005609 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005610 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005611 Output.getType() == types::TY_Object &&
5612 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005613 auto CLCommand =
5614 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005615 C.addCommand(llvm::make_unique<FallbackCommand>(
5616 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005617 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005618 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005619 }
5620
Eric Christopherf1545832013-02-22 23:50:16 +00005621 // Handle the debug info splitting at object creation time if we're
5622 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005623 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005624 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005625 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005626
Roman Divacky178e01602011-02-10 16:52:03 +00005627 if (Arg *A = Args.getLastArg(options::OPT_pg))
5628 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005629 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5630 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005631
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005632 // Claim some arguments which clang supports automatically.
5633
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005634 // -fpch-preprocess is used with gcc to add a special marker in the output to
5635 // include the PCH file. Clang's PTH solution is completely transparent, so we
5636 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005637 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005638
Daniel Dunbar17731772009-03-23 19:03:36 +00005639 // Claim some arguments which clang doesn't support, but we don't
5640 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005641 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5642 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005643
Rafael Espindolab0092d72013-09-04 19:37:35 +00005644 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005645 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005646}
5647
John McCall5fb5df92012-06-20 06:18:46 +00005648/// Add options related to the Objective-C runtime/ABI.
5649///
5650/// Returns true if the runtime is non-fragile.
5651ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5652 ArgStringList &cmdArgs,
5653 RewriteKind rewriteKind) const {
5654 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005655 Arg *runtimeArg =
5656 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5657 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005658
5659 // Just forward -fobjc-runtime= to the frontend. This supercedes
5660 // options about fragility.
5661 if (runtimeArg &&
5662 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5663 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005664 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005665 if (runtime.tryParse(value)) {
5666 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005667 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005668 }
5669
5670 runtimeArg->render(args, cmdArgs);
5671 return runtime;
5672 }
5673
5674 // Otherwise, we'll need the ABI "version". Version numbers are
5675 // slightly confusing for historical reasons:
5676 // 1 - Traditional "fragile" ABI
5677 // 2 - Non-fragile ABI, version 1
5678 // 3 - Non-fragile ABI, version 2
5679 unsigned objcABIVersion = 1;
5680 // If -fobjc-abi-version= is present, use that to set the version.
5681 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005682 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005683 if (value == "1")
5684 objcABIVersion = 1;
5685 else if (value == "2")
5686 objcABIVersion = 2;
5687 else if (value == "3")
5688 objcABIVersion = 3;
5689 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005690 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005691 } else {
5692 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005693 bool nonFragileABIIsDefault =
5694 (rewriteKind == RK_NonFragile ||
5695 (rewriteKind == RK_None &&
5696 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005697 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5698 options::OPT_fno_objc_nonfragile_abi,
5699 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005700// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005701#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5702 unsigned nonFragileABIVersion = 1;
5703#else
5704 unsigned nonFragileABIVersion = 2;
5705#endif
5706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005707 if (Arg *abiArg =
5708 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005709 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005710 if (value == "1")
5711 nonFragileABIVersion = 1;
5712 else if (value == "2")
5713 nonFragileABIVersion = 2;
5714 else
5715 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005716 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005717 }
5718
5719 objcABIVersion = 1 + nonFragileABIVersion;
5720 } else {
5721 objcABIVersion = 1;
5722 }
5723 }
5724
5725 // We don't actually care about the ABI version other than whether
5726 // it's non-fragile.
5727 bool isNonFragile = objcABIVersion != 1;
5728
5729 // If we have no runtime argument, ask the toolchain for its default runtime.
5730 // However, the rewriter only really supports the Mac runtime, so assume that.
5731 ObjCRuntime runtime;
5732 if (!runtimeArg) {
5733 switch (rewriteKind) {
5734 case RK_None:
5735 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5736 break;
5737 case RK_Fragile:
5738 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5739 break;
5740 case RK_NonFragile:
5741 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5742 break;
5743 }
5744
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005745 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005746 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5747 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005748 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005749 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5750
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005751 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005752 } else {
5753 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5754 }
5755
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005756 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005757 } else {
5758 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005759 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005760 // non-fragile mode or the GCC runtime in fragile mode.
5761 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005762 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005763 else
5764 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005765 }
5766
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005767 cmdArgs.push_back(
5768 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005769 return runtime;
5770}
5771
Reid Klecknerc542d372014-06-27 17:02:02 +00005772static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5773 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5774 I += HaveDash;
5775 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005776}
Reid Klecknerc542d372014-06-27 17:02:02 +00005777
Benjamin Kramere003ca22015-10-28 13:54:16 +00005778namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005779struct EHFlags {
5780 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5781 bool Synch;
5782 bool Asynch;
5783 bool NoExceptC;
5784};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005785} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005786
5787/// /EH controls whether to run destructor cleanups when exceptions are
5788/// thrown. There are three modifiers:
5789/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5790/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5791/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5792/// - c: Assume that extern "C" functions are implicitly noexcept. This
5793/// modifier is an optimization, so we ignore it for now.
5794/// The default is /EHs-c-, meaning cleanups are disabled.
5795static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5796 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005797
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005798 std::vector<std::string> EHArgs =
5799 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005800 for (auto EHVal : EHArgs) {
5801 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5802 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005803 case 'a':
5804 EH.Asynch = maybeConsumeDash(EHVal, I);
5805 continue;
5806 case 'c':
5807 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5808 continue;
5809 case 's':
5810 EH.Synch = maybeConsumeDash(EHVal, I);
5811 continue;
5812 default:
5813 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005814 }
5815 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5816 break;
5817 }
5818 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005819
Reid Klecknerc542d372014-06-27 17:02:02 +00005820 return EH;
5821}
5822
Douglas Katzman3459ce22015-10-08 04:24:12 +00005823void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005824 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005825 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005826 unsigned RTOptionID = options::OPT__SLASH_MT;
5827
Hans Wennborgf1a74252013-09-10 20:18:04 +00005828 if (Args.hasArg(options::OPT__SLASH_LDd))
5829 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5830 // but defining _DEBUG is sticky.
5831 RTOptionID = options::OPT__SLASH_MTd;
5832
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005833 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005834 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005835
David Majnemere2afb472015-07-24 06:49:13 +00005836 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005837 switch (RTOptionID) {
5838 case options::OPT__SLASH_MD:
5839 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005840 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005841 CmdArgs.push_back("-D_MT");
5842 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005843 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 break;
5845 case options::OPT__SLASH_MDd:
5846 CmdArgs.push_back("-D_DEBUG");
5847 CmdArgs.push_back("-D_MT");
5848 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005849 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005850 break;
5851 case options::OPT__SLASH_MT:
5852 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005853 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005854 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005855 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856 break;
5857 case options::OPT__SLASH_MTd:
5858 CmdArgs.push_back("-D_DEBUG");
5859 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005860 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 break;
5862 default:
5863 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005864 }
5865
David Majnemere2afb472015-07-24 06:49:13 +00005866 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5867 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5868 } else {
5869 CmdArgs.push_back(FlagForCRT.data());
5870
5871 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5872 // users want. The /Za flag to cl.exe turns this off, but it's not
5873 // implemented in clang.
5874 CmdArgs.push_back("--dependent-lib=oldnames");
5875 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005876
Hans Wennborg8858a032014-07-21 23:42:07 +00005877 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5878 // would produce interleaved output, so ignore /showIncludes in such cases.
5879 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5880 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5881 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005882
David Majnemerf6072342014-07-01 22:24:56 +00005883 // This controls whether or not we emit RTTI data for polymorphic types.
5884 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5885 /*default=*/false))
5886 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005887
Reid Kleckner124955a2015-08-05 18:51:13 +00005888 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005889 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00005890 if (*EmitCodeView)
5891 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00005892 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005893 CmdArgs.push_back("-gcodeview");
5894
Reid Klecknerc542d372014-06-27 17:02:02 +00005895 const Driver &D = getToolChain().getDriver();
5896 EHFlags EH = parseClangCLEHFlags(D, Args);
5897 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005898 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005899 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005900 CmdArgs.push_back("-fexceptions");
5901 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005902
Hans Wennborge50cec32014-06-13 20:59:54 +00005903 // /EP should expand to -E -P.
5904 if (Args.hasArg(options::OPT__SLASH_EP)) {
5905 CmdArgs.push_back("-E");
5906 CmdArgs.push_back("-P");
5907 }
5908
David Majnemera5b195a2015-02-14 01:35:12 +00005909 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005910 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5911 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005912 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5913 else
5914 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5915
5916 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5917 VolatileOptionID = A->getOption().getID();
5918
5919 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5920 CmdArgs.push_back("-fms-volatile");
5921
David Majnemer86c318f2014-02-11 21:05:00 +00005922 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5923 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5924 if (MostGeneralArg && BestCaseArg)
5925 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5926 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5927
5928 if (MostGeneralArg) {
5929 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5930 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5931 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5932
5933 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5934 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5935 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5936 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5937 << FirstConflict->getAsString(Args)
5938 << SecondConflict->getAsString(Args);
5939
5940 if (SingleArg)
5941 CmdArgs.push_back("-fms-memptr-rep=single");
5942 else if (MultipleArg)
5943 CmdArgs.push_back("-fms-memptr-rep=multiple");
5944 else
5945 CmdArgs.push_back("-fms-memptr-rep=virtual");
5946 }
5947
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005948 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5949 A->render(Args, CmdArgs);
5950
Hans Wennborg81f74482013-09-10 01:07:07 +00005951 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5952 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005953 if (Args.hasArg(options::OPT__SLASH_fallback))
5954 CmdArgs.push_back("msvc-fallback");
5955 else
5956 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005957 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005958}
5959
Douglas Katzman95354292015-06-23 20:42:09 +00005960visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005961 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005962 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005963 return CLFallback.get();
5964}
5965
Daniel Sanders7f933f42015-01-30 17:35:23 +00005966void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5967 ArgStringList &CmdArgs) const {
5968 StringRef CPUName;
5969 StringRef ABIName;
5970 const llvm::Triple &Triple = getToolChain().getTriple();
5971 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5972
5973 CmdArgs.push_back("-target-abi");
5974 CmdArgs.push_back(ABIName.data());
5975}
5976
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005977void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005978 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005979 const ArgList &Args,
5980 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005981 ArgStringList CmdArgs;
5982
5983 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5984 const InputInfo &Input = Inputs[0];
5985
James Y Knight2db38f32015-08-15 03:45:25 +00005986 std::string TripleStr =
5987 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5988 const llvm::Triple Triple(TripleStr);
5989
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005990 // Don't warn about "clang -w -c foo.s"
5991 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005992 // and "clang -emit-llvm -c foo.s"
5993 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005994
Rafael Espindola577637a2015-01-03 00:06:04 +00005995 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005996
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005997 // Invoke ourselves in -cc1as mode.
5998 //
5999 // FIXME: Implement custom jobs for internal actions.
6000 CmdArgs.push_back("-cc1as");
6001
6002 // Add the "effective" target triple.
6003 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006004 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6005
6006 // Set the output mode, we currently only expect to be used as a real
6007 // assembler.
6008 CmdArgs.push_back("-filetype");
6009 CmdArgs.push_back("obj");
6010
Eric Christopher45f2e712012-12-18 00:31:10 +00006011 // Set the main file name, so that debug info works even with
6012 // -save-temps or preprocessed assembly.
6013 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006014 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006015
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006016 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006017 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006018 if (!CPU.empty()) {
6019 CmdArgs.push_back("-target-cpu");
6020 CmdArgs.push_back(Args.MakeArgString(CPU));
6021 }
6022
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006023 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006024 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006025
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006026 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006027 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006028
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006029 // Pass along any -I options so we get proper .include search paths.
6030 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6031
Eric Christopherfc3ee562012-01-10 00:38:01 +00006032 // Determine the original source input.
6033 const Action *SourceAction = &JA;
6034 while (SourceAction->getKind() != Action::InputClass) {
6035 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6036 SourceAction = SourceAction->getInputs()[0];
6037 }
6038
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006039 // Forward -g and handle debug info related flags, assuming we are dealing
6040 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006041 if (SourceAction->getType() == types::TY_Asm ||
6042 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006043 bool WantDebug = false;
6044 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006045 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006046 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006047 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6048 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006049 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006050 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006051 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006052 if (DwarfVersion == 0)
6053 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006054 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006055 (WantDebug ? codegenoptions::LimitedDebugInfo
6056 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006057 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006058
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006059 // Add the -fdebug-compilation-dir flag if needed.
6060 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006061
6062 // Set the AT_producer to the clang version when using the integrated
6063 // assembler on assembly source files.
6064 CmdArgs.push_back("-dwarf-debug-producer");
6065 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006066
6067 // And pass along -I options
6068 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006069 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006070
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006071 // Handle -fPIC et al -- the relocation-model affects the assembler
6072 // for some targets.
6073 llvm::Reloc::Model RelocationModel;
6074 unsigned PICLevel;
6075 bool IsPIE;
6076 std::tie(RelocationModel, PICLevel, IsPIE) =
6077 ParsePICArgs(getToolChain(), Triple, Args);
6078
6079 const char *RMName = RelocationModelName(RelocationModel);
6080 if (RMName) {
6081 CmdArgs.push_back("-mrelocation-model");
6082 CmdArgs.push_back(RMName);
6083 }
6084
Kevin Enderby292dc082011-12-22 19:31:58 +00006085 // Optionally embed the -cc1as level arguments into the debug info, for build
6086 // analysis.
6087 if (getToolChain().UseDwarfDebugFlags()) {
6088 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006089 for (const auto &Arg : Args)
6090 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006091
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006092 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006093 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6094 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006095 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006096 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006097 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006098 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006099 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006100 }
6101 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006102 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006103 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006104
6105 // FIXME: Add -static support, once we have it.
6106
Daniel Sanders7f933f42015-01-30 17:35:23 +00006107 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006108 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006109 default:
6110 break;
6111
6112 case llvm::Triple::mips:
6113 case llvm::Triple::mipsel:
6114 case llvm::Triple::mips64:
6115 case llvm::Triple::mips64el:
6116 AddMIPSTargetArgs(Args, CmdArgs);
6117 break;
6118 }
6119
David Blaikie372d9502014-01-17 03:17:40 +00006120 // Consume all the warning flags. Usually this would be handled more
6121 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6122 // doesn't handle that so rather than warning about unused flags that are
6123 // actually used, we'll lie by omission instead.
6124 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006125 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006126
David Blaikie9260ed62013-07-25 21:19:01 +00006127 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6128 getToolChain().getDriver());
6129
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006130 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006131
6132 assert(Output.isFilename() && "Unexpected lipo output.");
6133 CmdArgs.push_back("-o");
6134 CmdArgs.push_back(Output.getFilename());
6135
Daniel Dunbarb440f562010-08-02 02:38:21 +00006136 assert(Input.isFilename() && "Invalid input.");
6137 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006138
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006139 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006140 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006141
6142 // Handle the debug info splitting at object creation time if we're
6143 // creating an object.
6144 // TODO: Currently only works on linux with newer objcopy.
6145 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006146 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006147 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006148 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006149}
6150
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006151void GnuTool::anchor() {}
6152
Daniel Dunbara3246a02009-03-18 08:07:30 +00006153void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006154 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006155 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006156 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006157 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006158 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006159
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006160 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006161 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006162 // It is unfortunate that we have to claim here, as this means
6163 // we will basically never report anything interesting for
6164 // platforms using a generic gcc, even if we are just using gcc
6165 // to get to the assembler.
6166 A->claim();
6167
Daniel Dunbar939c1212010-08-03 16:14:14 +00006168 // Don't forward any -g arguments to assembly steps.
6169 if (isa<AssembleJobAction>(JA) &&
6170 A->getOption().matches(options::OPT_g_Group))
6171 continue;
6172
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006173 // Don't forward any -W arguments to assembly and link steps.
6174 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6175 A->getOption().matches(options::OPT_W_Group))
6176 continue;
6177
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006178 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006179 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006180 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006181
Daniel Dunbar4e295052010-01-25 22:35:08 +00006182 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006183
6184 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006185 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006186 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006187 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006188 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006189 }
6190
Daniel Dunbar5716d872009-05-02 21:41:52 +00006191 // Try to force gcc to match the tool chain we want, if we recognize
6192 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006193 //
6194 // FIXME: The triple class should directly provide the information we want
6195 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006196 switch (getToolChain().getArch()) {
6197 default:
6198 break;
6199 case llvm::Triple::x86:
6200 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006201 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006202 break;
6203 case llvm::Triple::x86_64:
6204 case llvm::Triple::ppc64:
6205 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006206 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006207 break;
6208 case llvm::Triple::sparcel:
6209 CmdArgs.push_back("-EL");
6210 break;
6211 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006212
Daniel Dunbarb440f562010-08-02 02:38:21 +00006213 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006214 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006215 CmdArgs.push_back(Output.getFilename());
6216 } else {
6217 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006218 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006219 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006221 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006222
6223 // Only pass -x if gcc will understand it; otherwise hope gcc
6224 // understands the suffix correctly. The main use case this would go
6225 // wrong in is for linker inputs if they happened to have an odd
6226 // suffix; really the only way to get this to happen is a command
6227 // like '-x foobar a.c' which will treat a.c like a linker input.
6228 //
6229 // FIXME: For the linker case specifically, can we safely convert
6230 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006231 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006232 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006233 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006234 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006235 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006236 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006237 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006238 else if (II.getType() == types::TY_ModuleFile)
6239 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006240 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006241
Daniel Dunbara3246a02009-03-18 08:07:30 +00006242 if (types::canTypeBeUserSpecified(II.getType())) {
6243 CmdArgs.push_back("-x");
6244 CmdArgs.push_back(types::getTypeName(II.getType()));
6245 }
6246
Daniel Dunbarb440f562010-08-02 02:38:21 +00006247 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006248 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006249 else {
6250 const Arg &A = II.getInputArg();
6251
6252 // Reverse translate some rewritten options.
6253 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6254 CmdArgs.push_back("-lstdc++");
6255 continue;
6256 }
6257
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006258 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006259 A.render(Args, CmdArgs);
6260 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006261 }
6262
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006263 const std::string customGCCName = D.getCCCGenericGCCName();
6264 const char *GCCName;
6265 if (!customGCCName.empty())
6266 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006267 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006268 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006269 } else
6270 GCCName = "gcc";
6271
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006272 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006274}
6275
Douglas Katzman95354292015-06-23 20:42:09 +00006276void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6277 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006278 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006279}
6280
Douglas Katzman95354292015-06-23 20:42:09 +00006281void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6282 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006283 const Driver &D = getToolChain().getDriver();
6284
Eric Christophercc7ff502015-01-29 00:56:17 +00006285 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006286 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006287 case types::TY_LLVM_IR:
6288 case types::TY_LTO_IR:
6289 case types::TY_LLVM_BC:
6290 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006291 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006292 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006293 // We assume we've got an "integrated" assembler in that gcc will produce an
6294 // object file itself.
6295 case types::TY_Object:
6296 CmdArgs.push_back("-c");
6297 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006298 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006299 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006300 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006301 case types::TY_Nothing:
6302 CmdArgs.push_back("-fsyntax-only");
6303 break;
6304 default:
6305 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006306 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006307}
6308
Douglas Katzman95354292015-06-23 20:42:09 +00006309void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6310 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006311 // The types are (hopefully) good enough.
6312}
6313
Tony Linthicum76329bf2011-12-12 21:14:55 +00006314// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006315void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006316 ArgStringList &CmdArgs) const {
6317}
6318
Douglas Katzman95354292015-06-23 20:42:09 +00006319void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6320 const InputInfo &Output,
6321 const InputInfoList &Inputs,
6322 const ArgList &Args,
6323 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006324 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6327 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006328 ArgStringList CmdArgs;
6329
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 std::string MArchString = "-march=hexagon";
6331 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006332
6333 RenderExtraToolArgs(JA, CmdArgs);
6334
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006335 std::string AsName = "hexagon-llvm-mc";
6336 std::string MCpuString = "-mcpu=hexagon" +
6337 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6338 CmdArgs.push_back("-filetype=obj");
6339 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6340
Tony Linthicum76329bf2011-12-12 21:14:55 +00006341 if (Output.isFilename()) {
6342 CmdArgs.push_back("-o");
6343 CmdArgs.push_back(Output.getFilename());
6344 } else {
6345 assert(Output.isNothing() && "Unexpected output");
6346 CmdArgs.push_back("-fsyntax-only");
6347 }
6348
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006349 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6350 std::string N = llvm::utostr(G.getValue());
6351 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6352 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006354 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006355
Tony Linthicum76329bf2011-12-12 21:14:55 +00006356 // Only pass -x if gcc will understand it; otherwise hope gcc
6357 // understands the suffix correctly. The main use case this would go
6358 // wrong in is for linker inputs if they happened to have an odd
6359 // suffix; really the only way to get this to happen is a command
6360 // like '-x foobar a.c' which will treat a.c like a linker input.
6361 //
6362 // FIXME: For the linker case specifically, can we safely convert
6363 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006364 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006365 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006366 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006367 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006368 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369 else if (II.getType() == types::TY_AST)
6370 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006371 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006372 else if (II.getType() == types::TY_ModuleFile)
6373 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006374 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006375
6376 if (II.isFilename())
6377 CmdArgs.push_back(II.getFilename());
6378 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006379 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006380 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006381 II.getInputArg().render(Args, CmdArgs);
6382 }
6383
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006384 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006385 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006386}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006387
Douglas Katzman95354292015-06-23 20:42:09 +00006388void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6389 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006390}
6391
Douglas Katzman54366072015-07-27 16:53:08 +00006392static void
6393constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006394 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006395 const InputInfo &Output, const InputInfoList &Inputs,
6396 const ArgList &Args, ArgStringList &CmdArgs,
6397 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006399 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006400
Matthew Curtise689b052012-12-06 15:46:07 +00006401 //----------------------------------------------------------------------------
6402 //
6403 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006404 bool IsStatic = Args.hasArg(options::OPT_static);
6405 bool IsShared = Args.hasArg(options::OPT_shared);
6406 bool IsPIE = Args.hasArg(options::OPT_pie);
6407 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6408 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6409 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6410 bool UseG0 = false;
6411 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006412
Matthew Curtise689b052012-12-06 15:46:07 +00006413 //----------------------------------------------------------------------------
6414 // Silence warnings for various options
6415 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006416 Args.ClaimAllArgs(options::OPT_g_Group);
6417 Args.ClaimAllArgs(options::OPT_emit_llvm);
6418 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6419 // handled somewhere else.
6420 Args.ClaimAllArgs(options::OPT_static_libgcc);
6421
6422 //----------------------------------------------------------------------------
6423 //
6424 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006425 if (Args.hasArg(options::OPT_s))
6426 CmdArgs.push_back("-s");
6427
6428 if (Args.hasArg(options::OPT_r))
6429 CmdArgs.push_back("-r");
6430
6431 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006432 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006433
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006434 CmdArgs.push_back("-march=hexagon");
6435 std::string CpuVer =
6436 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6437 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6438 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006439
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006440 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006441 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006442 // The following should be the default, but doing as hexagon-gcc does.
6443 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006444 }
6445
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006447 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006448
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006449 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006450 CmdArgs.push_back("-pie");
6451
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6453 std::string N = llvm::utostr(G.getValue());
6454 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6455 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006456 }
6457
Matthew Curtise689b052012-12-06 15:46:07 +00006458 //----------------------------------------------------------------------------
6459 //
6460 //----------------------------------------------------------------------------
6461 CmdArgs.push_back("-o");
6462 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006463
Matthew Curtise689b052012-12-06 15:46:07 +00006464 //----------------------------------------------------------------------------
6465 // moslib
6466 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006467 std::vector<std::string> OsLibs;
6468 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006469
Sean Silva14facf32015-06-09 01:57:17 +00006470 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6471 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006472 OsLibs.emplace_back(A->getValue());
6473 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006474 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 if (OsLibs.empty()) {
6476 OsLibs.push_back("standalone");
6477 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006478 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479
Matthew Curtise689b052012-12-06 15:46:07 +00006480 //----------------------------------------------------------------------------
6481 // Start Files
6482 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006483 const std::string MCpuSuffix = "/" + CpuVer;
6484 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6485 const std::string RootDir =
6486 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6487 const std::string StartSubDir =
6488 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006489
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006490 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6491 const char *Name) -> std::string {
6492 std::string RelName = SubDir + Name;
6493 std::string P = HTC.GetFilePath(RelName.c_str());
6494 if (llvm::sys::fs::exists(P))
6495 return P;
6496 return RootDir + RelName;
6497 };
6498
6499 if (IncStdLib && IncStartFiles) {
6500 if (!IsShared) {
6501 if (HasStandalone) {
6502 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6503 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006504 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6506 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006507 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508 std::string Init = UseShared
6509 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6510 : Find(RootDir, StartSubDir, "/init.o");
6511 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006512 }
6513
6514 //----------------------------------------------------------------------------
6515 // Library Search Paths
6516 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006517 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6518 for (const auto &LibPath : LibPaths)
6519 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006520
6521 //----------------------------------------------------------------------------
6522 //
6523 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006524 Args.AddAllArgs(CmdArgs,
6525 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6526 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006527
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006528 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006529
6530 //----------------------------------------------------------------------------
6531 // Libraries
6532 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006534 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006535 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006536 CmdArgs.push_back("-lm");
6537 }
6538
6539 CmdArgs.push_back("--start-group");
6540
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006541 if (!IsShared) {
6542 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006543 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006544 CmdArgs.push_back("-lc");
6545 }
6546 CmdArgs.push_back("-lgcc");
6547
6548 CmdArgs.push_back("--end-group");
6549 }
6550
6551 //----------------------------------------------------------------------------
6552 // End files
6553 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006554 if (IncStdLib && IncStartFiles) {
6555 std::string Fini = UseShared
6556 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6557 : Find(RootDir, StartSubDir, "/fini.o");
6558 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006559 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006560}
6561
Douglas Katzman95354292015-06-23 20:42:09 +00006562void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6563 const InputInfo &Output,
6564 const InputInfoList &Inputs,
6565 const ArgList &Args,
6566 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006567 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006568
6569 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006571 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006572
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006573 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006574 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006575 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006576}
6577// Hexagon tools end.
6578
Tom Stellard8fa33092015-07-18 01:49:05 +00006579void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6580 const InputInfo &Output,
6581 const InputInfoList &Inputs,
6582 const ArgList &Args,
6583 const char *LinkingOutput) const {
6584
6585 std::string Linker = getToolChain().GetProgramPath(getShortName());
6586 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006587 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6588 CmdArgs.push_back("-o");
6589 CmdArgs.push_back(Output.getFilename());
6590 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6591 CmdArgs, Inputs));
6592}
6593// AMDGPU tools end.
6594
Dan Gohman52816862015-12-16 23:30:41 +00006595wasm::Linker::Linker(const ToolChain &TC)
6596 : GnuTool("wasm::Linker", "lld", TC) {}
6597
6598bool wasm::Linker::isLinkJob() const {
6599 return true;
6600}
6601
6602bool wasm::Linker::hasIntegratedCPP() const {
6603 return false;
6604}
6605
6606void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6607 const InputInfo &Output,
6608 const InputInfoList &Inputs,
6609 const ArgList &Args,
6610 const char *LinkingOutput) const {
6611 const char *Linker = Args.MakeArgString(getToolChain().GetLinkerPath());
6612 ArgStringList CmdArgs;
6613 CmdArgs.push_back("-flavor");
6614 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006615
6616 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006617 // size is of particular importance. This is significantly facilitated by
6618 // the enabling of -ffunction-sections and -fdata-sections in
6619 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006620 if (areOptimizationsEnabled(Args))
6621 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006622
Dan Gohman52816862015-12-16 23:30:41 +00006623 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6624 CmdArgs.push_back("-o");
6625 CmdArgs.push_back(Output.getFilename());
6626 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6627}
6628
Renato Golin7c542b42015-07-27 23:44:45 +00006629const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006630 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006631 if (!Arch.empty())
6632 MArch = Arch;
6633 else
Bernard Ogden31561762013-12-12 13:27:11 +00006634 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006635 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006636
6637 // Handle -march=native.
6638 if (MArch == "native") {
6639 std::string CPU = llvm::sys::getHostCPUName();
6640 if (CPU != "generic") {
6641 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006642 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006643 // If there is no valid architecture suffix for this CPU we don't know how
6644 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006645 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006646 MArch = "";
6647 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006648 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006649 }
6650 }
6651
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006652 return MArch;
6653}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006654
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006655/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006656StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006657 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006658 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6659 // here means an -march=native that we can't handle, so instead return no CPU.
6660 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006661 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006662
John Brawna95c1a82015-05-08 12:52:18 +00006663 // We need to return an empty string here on invalid MArch values as the
6664 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006665 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006666}
6667
6668/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006669std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006670 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006671 // FIXME: Warn on inconsistent use of -mcpu and -march.
6672 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006673 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006674 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006675 // Handle -mcpu=native.
6676 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006677 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006678 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006679 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006680 }
6681
Renato Goline17c5802015-07-27 23:44:42 +00006682 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006683}
6684
6685/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006686/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006687// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006688StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6689 const llvm::Triple &Triple) {
6690 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006691 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006692 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006693 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006694 if (ArchKind == llvm::ARM::AK_INVALID)
6695 // In case of generic Arch, i.e. "arm",
6696 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006697 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006698 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006699 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6700 // armv7k triple if it's actually been specified via "-arch armv7k".
6701 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006702 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006703 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006704 }
Renato Golin3c007252015-05-28 15:05:53 +00006705 if (ArchKind == llvm::ARM::AK_INVALID)
6706 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006707 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006708}
6709
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006710void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006711 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006712 if (Args.hasArg(options::OPT_r))
6713 return;
6714
John Brawn94fd9632015-05-21 12:19:49 +00006715 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6716 // to generate BE-8 executables.
6717 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6718 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006719}
6720
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006721mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006722 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6723 // was first introduced in Release 3. However, other compilers have
6724 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006725 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6726 .Case("mips1", NanLegacy)
6727 .Case("mips2", NanLegacy)
6728 .Case("mips3", NanLegacy)
6729 .Case("mips4", NanLegacy)
6730 .Case("mips5", NanLegacy)
6731 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006732 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006733 .Case("mips32r3", NanLegacy | Nan2008)
6734 .Case("mips32r5", NanLegacy | Nan2008)
6735 .Case("mips32r6", Nan2008)
6736 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006737 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006738 .Case("mips64r3", NanLegacy | Nan2008)
6739 .Case("mips64r5", NanLegacy | Nan2008)
6740 .Case("mips64r6", Nan2008)
6741 .Default(NanLegacy);
6742}
6743
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006744bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6745 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6746 return A && (A->getValue() == StringRef(Value));
6747}
6748
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006749bool mips::isUCLibc(const ArgList &Args) {
6750 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006751 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006752}
6753
Daniel Sanders2bf13662014-07-10 14:40:57 +00006754bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006755 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6756 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006757 .Case("2008", true)
6758 .Case("legacy", false)
6759 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006760
6761 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006762 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006763 .Cases("mips32r6", "mips64r6", true)
6764 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006765
6766 return false;
6767}
6768
Daniel Sanders379d44b2014-07-16 11:52:23 +00006769bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006770 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006771 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006772 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006773 return false;
6774
6775 if (ABIName != "32")
6776 return false;
6777
Toma Tabacu94ea6862015-06-16 13:54:13 +00006778 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6779 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006780 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006781 return false;
6782
Daniel Sanders379d44b2014-07-16 11:52:23 +00006783 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006784 .Cases("mips2", "mips3", "mips4", "mips5", true)
6785 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6786 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6787 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006788}
6789
Toma Tabacu94ea6862015-06-16 13:54:13 +00006790bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6791 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006792 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006793 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6794
6795 // FPXX shouldn't be used if -msingle-float is present.
6796 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6797 options::OPT_mdouble_float))
6798 if (A->getOption().matches(options::OPT_msingle_float))
6799 UseFPXX = false;
6800
6801 return UseFPXX;
6802}
6803
Tim Northover157d9112014-01-16 08:48:16 +00006804llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006805 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6806 // archs which Darwin doesn't use.
6807
6808 // The matching this routine does is fairly pointless, since it is neither the
6809 // complete architecture list, nor a reasonable subset. The problem is that
6810 // historically the driver driver accepts this and also ties its -march=
6811 // handling to the architecture name, so we need to be careful before removing
6812 // support for it.
6813
6814 // This code must be kept in sync with Clang's Darwin specific argument
6815 // translation.
6816
6817 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006818 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6819 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6820 .Case("ppc64", llvm::Triple::ppc64)
6821 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6822 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6823 llvm::Triple::x86)
6824 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6825 // This is derived from the driver driver.
6826 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6827 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6828 .Cases("armv7s", "xscale", llvm::Triple::arm)
6829 .Case("arm64", llvm::Triple::aarch64)
6830 .Case("r600", llvm::Triple::r600)
6831 .Case("amdgcn", llvm::Triple::amdgcn)
6832 .Case("nvptx", llvm::Triple::nvptx)
6833 .Case("nvptx64", llvm::Triple::nvptx64)
6834 .Case("amdil", llvm::Triple::amdil)
6835 .Case("spir", llvm::Triple::spir)
6836 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006837}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006838
Tim Northover157d9112014-01-16 08:48:16 +00006839void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006840 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006841 T.setArch(Arch);
6842
6843 if (Str == "x86_64h")
6844 T.setArchName(Str);
6845 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6846 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006847 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006848 }
6849}
6850
Bob Wilsondecc03e2012-11-23 06:14:39 +00006851const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006852 const InputInfo &Input) {
6853 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006854}
6855
Bob Wilsondecc03e2012-11-23 06:14:39 +00006856const char *Clang::getBaseInputStem(const ArgList &Args,
6857 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006858 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006859
Chris Lattner906bb902011-01-16 08:14:11 +00006860 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006861 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006862
6863 return Str;
6864}
6865
Bob Wilsondecc03e2012-11-23 06:14:39 +00006866const char *Clang::getDependencyFileName(const ArgList &Args,
6867 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006868 // FIXME: Think about this more.
6869 std::string Res;
6870
6871 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006872 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006873 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006874 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006875 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006876 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006877 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006878}
6879
Douglas Katzman95354292015-06-23 20:42:09 +00006880void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6881 const InputInfo &Output,
6882 const InputInfoList &Inputs,
6883 const ArgList &Args,
6884 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006885 const ToolChain &ToolChain = getToolChain();
6886 const Driver &D = ToolChain.getDriver();
6887 ArgStringList CmdArgs;
6888
6889 // Silence warning for "clang -g foo.o -o foo"
6890 Args.ClaimAllArgs(options::OPT_g_Group);
6891 // and "clang -emit-llvm foo.o -o foo"
6892 Args.ClaimAllArgs(options::OPT_emit_llvm);
6893 // and for "clang -w foo.o -o foo". Other warning options are already
6894 // handled somewhere else.
6895 Args.ClaimAllArgs(options::OPT_w);
6896
6897 if (!D.SysRoot.empty())
6898 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6899
6900 // CloudABI only supports static linkage.
6901 CmdArgs.push_back("-Bstatic");
6902 CmdArgs.push_back("--eh-frame-hdr");
6903 CmdArgs.push_back("--gc-sections");
6904
6905 if (Output.isFilename()) {
6906 CmdArgs.push_back("-o");
6907 CmdArgs.push_back(Output.getFilename());
6908 } else {
6909 assert(Output.isNothing() && "Invalid output.");
6910 }
6911
Douglas Katzman78b37b02015-11-17 20:28:07 +00006912 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006913 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6915 }
6916
6917 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006918 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006919 Args.AddAllArgs(CmdArgs,
6920 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6921 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006922
Teresa Johnson945bc502015-10-15 20:35:53 +00006923 if (D.isUsingLTO())
6924 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006925
6926 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6927
Douglas Katzman78b37b02015-11-17 20:28:07 +00006928 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006929 if (D.CCCIsCXX())
6930 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6931 CmdArgs.push_back("-lc");
6932 CmdArgs.push_back("-lcompiler_rt");
6933 }
6934
Douglas Katzman78b37b02015-11-17 20:28:07 +00006935 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006936 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6937
6938 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006939 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006940}
6941
Douglas Katzman95354292015-06-23 20:42:09 +00006942void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6943 const InputInfo &Output,
6944 const InputInfoList &Inputs,
6945 const ArgList &Args,
6946 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006947 ArgStringList CmdArgs;
6948
6949 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6950 const InputInfo &Input = Inputs[0];
6951
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006952 // Determine the original source input.
6953 const Action *SourceAction = &JA;
6954 while (SourceAction->getKind() != Action::InputClass) {
6955 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6956 SourceAction = SourceAction->getInputs()[0];
6957 }
6958
Eric Christopherf5a8f492015-12-08 00:10:10 +00006959 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006960 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006961 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6962 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006963 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006964 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006965 const llvm::Triple &T(getToolChain().getTriple());
6966 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006967 CmdArgs.push_back("-Q");
6968 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006969
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006970 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006971 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006972 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006973 if (Args.hasArg(options::OPT_gstabs))
6974 CmdArgs.push_back("--gstabs");
6975 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006976 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006977 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006978
Daniel Dunbarbe220842009-03-20 16:06:39 +00006979 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006980 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006981
Daniel Dunbar6d484762010-07-22 01:47:22 +00006982 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006983 if (getToolChain().getArch() == llvm::Triple::x86 ||
6984 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006985 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6986 CmdArgs.push_back("-force_cpusubtype_ALL");
6987
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006988 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006989 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006990 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006991 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006992 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006993 CmdArgs.push_back("-static");
6994
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006995 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006996
6997 assert(Output.isFilename() && "Unexpected lipo output.");
6998 CmdArgs.push_back("-o");
6999 CmdArgs.push_back(Output.getFilename());
7000
Daniel Dunbarb440f562010-08-02 02:38:21 +00007001 assert(Input.isFilename() && "Invalid input.");
7002 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007003
7004 // asm_final spec is empty.
7005
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007006 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007008}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007009
Tim Northover157d9112014-01-16 08:48:16 +00007010void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007011
Tim Northover157d9112014-01-16 08:48:16 +00007012void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7013 ArgStringList &CmdArgs) const {
7014 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007015
Daniel Dunbarc1964212009-03-26 16:23:12 +00007016 // Derived from darwin_arch spec.
7017 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007018 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007019
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007020 // FIXME: Is this needed anymore?
7021 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007022 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007023}
7024
Douglas Katzman95354292015-06-23 20:42:09 +00007025bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007026 // We only need to generate a temp path for LTO if we aren't compiling object
7027 // files. When compiling source files, we run 'dsymutil' after linking. We
7028 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007029 for (const auto &Input : Inputs)
7030 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007031 return true;
7032
7033 return false;
7034}
7035
Douglas Katzman95354292015-06-23 20:42:09 +00007036void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7037 ArgStringList &CmdArgs,
7038 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007039 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007040 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007041
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007042 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007043 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7044 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007045 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7046 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007047 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007048 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007049 }
7050
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007051 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007052 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007053 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7054 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007055
Bob Wilson3d27dad2013-08-02 22:25:34 +00007056 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7057 CmdArgs.push_back("-export_dynamic");
7058
Bob Wilsonb111ec92015-03-02 19:01:14 +00007059 // If we are using App Extension restrictions, pass a flag to the linker
7060 // telling it that the compiled code has been audited.
7061 if (Args.hasFlag(options::OPT_fapplication_extension,
7062 options::OPT_fno_application_extension, false))
7063 CmdArgs.push_back("-application_extension");
7064
Teresa Johnson945bc502015-10-15 20:35:53 +00007065 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007066 // If we are using LTO, then automatically create a temporary file path for
7067 // the linker to use, so that it's lifetime will extend past a possible
7068 // dsymutil step.
7069 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7070 const char *TmpPath = C.getArgs().MakeArgString(
7071 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7072 C.addTempFile(TmpPath);
7073 CmdArgs.push_back("-object_path_lto");
7074 CmdArgs.push_back(TmpPath);
7075 }
7076
7077 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7078 // it in clang installed libraries. If not found, the option is not used
7079 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7080 if (Version[0] >= 133) {
7081 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7082 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7083 SmallString<128> LibLTOPath(P);
7084 llvm::sys::path::append(LibLTOPath, "lib");
7085 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7086 if (llvm::sys::fs::exists(LibLTOPath)) {
7087 CmdArgs.push_back("-lto_library");
7088 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7089 } else {
7090 D.Diag(diag::warn_drv_lto_libpath);
7091 }
7092 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007093 }
7094
Daniel Dunbarc1964212009-03-26 16:23:12 +00007095 // Derived from the "link" spec.
7096 Args.AddAllArgs(CmdArgs, options::OPT_static);
7097 if (!Args.hasArg(options::OPT_static))
7098 CmdArgs.push_back("-dynamic");
7099 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7100 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7101 // here. How do we wish to handle such things?
7102 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007103
Daniel Dunbarc1964212009-03-26 16:23:12 +00007104 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007105 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007106 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007107 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007108
7109 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7110 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7111 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7112
7113 Arg *A;
7114 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7115 (A = Args.getLastArg(options::OPT_current__version)) ||
7116 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007117 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7118 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007119
7120 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7121 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7122 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7123 } else {
7124 CmdArgs.push_back("-dylib");
7125
7126 Arg *A;
7127 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7128 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7129 (A = Args.getLastArg(options::OPT_client__name)) ||
7130 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7131 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7132 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007133 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7134 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007135
Daniel Dunbarc1964212009-03-26 16:23:12 +00007136 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7137 "-dylib_compatibility_version");
7138 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7139 "-dylib_current_version");
7140
Tim Northover157d9112014-01-16 08:48:16 +00007141 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007142
7143 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7144 "-dylib_install_name");
7145 }
7146
7147 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7148 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7149 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007150 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007151 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007152 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7153 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7154 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7155 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7156 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7157 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007158 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007159 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7160 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7161 Args.AddAllArgs(CmdArgs, options::OPT_init);
7162
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007163 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007164 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007165
Daniel Dunbarc1964212009-03-26 16:23:12 +00007166 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7167 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7168 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7169 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7170 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007171
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007172 if (const Arg *A =
7173 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7174 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007175 if (A->getOption().matches(options::OPT_fpie) ||
7176 A->getOption().matches(options::OPT_fPIE))
7177 CmdArgs.push_back("-pie");
7178 else
7179 CmdArgs.push_back("-no_pie");
7180 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007181
7182 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7183 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7184 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7185 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7186 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7187 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7188 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7189 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7190 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7191 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7192 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7193 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7194 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7195 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7196 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7197 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007198
Daniel Dunbar84384642011-05-02 21:03:47 +00007199 // Give --sysroot= preference, over the Apple specific behavior to also use
7200 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007201 StringRef sysroot = C.getSysRoot();
7202 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007203 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007204 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007205 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7206 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007207 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007208 }
7209
Daniel Dunbarc1964212009-03-26 16:23:12 +00007210 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7211 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7212 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7213 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7214 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007215 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007216 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7217 Args.AddAllArgs(CmdArgs, options::OPT_y);
7218 Args.AddLastArg(CmdArgs, options::OPT_w);
7219 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7220 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7221 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7222 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7223 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7224 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7225 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7226 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7227 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7228 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7229 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7230 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7231}
7232
Douglas Katzman95354292015-06-23 20:42:09 +00007233void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7234 const InputInfo &Output,
7235 const InputInfoList &Inputs,
7236 const ArgList &Args,
7237 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007238 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007239
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007240 // If the number of arguments surpasses the system limits, we will encode the
7241 // input files in a separate file, shortening the command line. To this end,
7242 // build a list of input file names that can be passed via a file with the
7243 // -filelist linker option.
7244 llvm::opt::ArgStringList InputFileList;
7245
Daniel Dunbarc1964212009-03-26 16:23:12 +00007246 // The logic here is derived from gcc's behavior; most of which
7247 // comes from specs (starting with link_command). Consult gcc for
7248 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007249 ArgStringList CmdArgs;
7250
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007251 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7252 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7253 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007254 for (const auto &Arg : Args)
7255 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007256 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007257 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007258 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007260 return;
7261 }
7262
Daniel Dunbarc1964212009-03-26 16:23:12 +00007263 // I'm not sure why this particular decomposition exists in gcc, but
7264 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007265 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007267 // It seems that the 'e' option is completely ignored for dynamic executables
7268 // (the default), and with static executables, the last one wins, as expected.
7269 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7270 options::OPT_Z_Flag, options::OPT_u_Group,
7271 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007272
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007273 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7274 // members of static archive libraries which implement Objective-C classes or
7275 // categories.
7276 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7277 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007278
Daniel Dunbarc1964212009-03-26 16:23:12 +00007279 CmdArgs.push_back("-o");
7280 CmdArgs.push_back(Output.getFilename());
7281
Douglas Katzman78b37b02015-11-17 20:28:07 +00007282 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007283 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007284
Peter Collingbournec4122c12015-06-15 21:08:13 +00007285 // SafeStack requires its own runtime libraries
7286 // These libraries should be linked first, to make sure the
7287 // __safestack_init constructor executes before everything else
7288 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7289 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7290 "libclang_rt.safestack_osx.a",
7291 /*AlwaysLink=*/true);
7292 }
7293
Daniel Dunbarc1964212009-03-26 16:23:12 +00007294 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007295
Douglas Gregor9295df02012-05-15 21:00:27 +00007296 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007297 // Build the input file for -filelist (list of linker input files) in case we
7298 // need it later
7299 for (const auto &II : Inputs) {
7300 if (!II.isFilename()) {
7301 // This is a linker input argument.
7302 // We cannot mix input arguments and file names in a -filelist input, thus
7303 // we prematurely stop our list (remaining files shall be passed as
7304 // arguments).
7305 if (InputFileList.size() > 0)
7306 break;
7307
7308 continue;
7309 }
7310
7311 InputFileList.push_back(II.getFilename());
7312 }
7313
Douglas Katzman78b37b02015-11-17 20:28:07 +00007314 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007315 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7316
Douglas Katzman78b37b02015-11-17 20:28:07 +00007317 if (isObjCRuntimeLinked(Args) &&
7318 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007319 // We use arclite library for both ARC and subscripting support.
7320 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7321
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007322 CmdArgs.push_back("-framework");
7323 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007324 // Link libobj.
7325 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007326 }
John McCall31168b02011-06-15 23:02:42 +00007327
Daniel Dunbarc1964212009-03-26 16:23:12 +00007328 if (LinkingOutput) {
7329 CmdArgs.push_back("-arch_multiple");
7330 CmdArgs.push_back("-final_output");
7331 CmdArgs.push_back(LinkingOutput);
7332 }
7333
Daniel Dunbarc1964212009-03-26 16:23:12 +00007334 if (Args.hasArg(options::OPT_fnested_functions))
7335 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007336
Justin Bognerc7701242015-05-12 05:44:36 +00007337 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7338
Douglas Katzman78b37b02015-11-17 20:28:07 +00007339 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007340 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007341 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007342
Daniel Dunbarc1964212009-03-26 16:23:12 +00007343 // link_ssp spec is empty.
7344
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007345 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007346 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007347 }
7348
Douglas Katzman78b37b02015-11-17 20:28:07 +00007349 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350 // endfile_spec is empty.
7351 }
7352
7353 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7354 Args.AddAllArgs(CmdArgs, options::OPT_F);
7355
Steven Wu3ffb61b2015-02-06 18:08:29 +00007356 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007357 for (const Arg *A : Args.filtered(options::OPT_iframework))
7358 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007359
Douglas Katzman78b37b02015-11-17 20:28:07 +00007360 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007361 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7362 if (A->getValue() == StringRef("Accelerate")) {
7363 CmdArgs.push_back("-framework");
7364 CmdArgs.push_back("Accelerate");
7365 }
7366 }
7367 }
7368
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007369 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007370 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007371 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007372 Cmd->setInputFileList(std::move(InputFileList));
7373 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007374}
7375
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007376void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007377 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007378 const InputInfoList &Inputs,
7379 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007380 const char *LinkingOutput) const {
7381 ArgStringList CmdArgs;
7382
7383 CmdArgs.push_back("-create");
7384 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007385
7386 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007387 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007388
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007389 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007390 assert(II.isFilename() && "Unexpected lipo input.");
7391 CmdArgs.push_back(II.getFilename());
7392 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007393
7394 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007395 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007396}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007397
Daniel Dunbar88299622010-06-04 18:28:36 +00007398void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007399 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007400 const InputInfoList &Inputs,
7401 const ArgList &Args,
7402 const char *LinkingOutput) const {
7403 ArgStringList CmdArgs;
7404
Daniel Dunbareb86b042011-05-09 17:23:16 +00007405 CmdArgs.push_back("-o");
7406 CmdArgs.push_back(Output.getFilename());
7407
Daniel Dunbar88299622010-06-04 18:28:36 +00007408 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7409 const InputInfo &Input = Inputs[0];
7410 assert(Input.isFilename() && "Unexpected dsymutil input.");
7411 CmdArgs.push_back(Input.getFilename());
7412
Daniel Dunbar88299622010-06-04 18:28:36 +00007413 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007414 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007416}
7417
Eric Christopher551ef452011-08-23 17:56:55 +00007418void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007419 const InputInfo &Output,
7420 const InputInfoList &Inputs,
7421 const ArgList &Args,
7422 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007423 ArgStringList CmdArgs;
7424 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007425 CmdArgs.push_back("--debug-info");
7426 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007427 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007428
7429 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7430 const InputInfo &Input = Inputs[0];
7431 assert(Input.isFilename() && "Unexpected verify input");
7432
7433 // Grabbing the output of the earlier dsymutil run.
7434 CmdArgs.push_back(Input.getFilename());
7435
7436 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007437 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007439}
7440
Douglas Katzman95354292015-06-23 20:42:09 +00007441void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007442 const InputInfo &Output,
7443 const InputInfoList &Inputs,
7444 const ArgList &Args,
7445 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007446 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007447 ArgStringList CmdArgs;
7448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007449 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007450
7451 CmdArgs.push_back("-o");
7452 CmdArgs.push_back(Output.getFilename());
7453
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007454 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007455 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007457 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007458 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007459}
7460
Douglas Katzman95354292015-06-23 20:42:09 +00007461void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7462 const InputInfo &Output,
7463 const InputInfoList &Inputs,
7464 const ArgList &Args,
7465 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007466 ArgStringList CmdArgs;
7467
David Chisnall272a0712012-02-29 15:06:12 +00007468 // Demangle C++ names in errors
7469 CmdArgs.push_back("-C");
7470
Douglas Katzman78b37b02015-11-17 20:28:07 +00007471 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007472 CmdArgs.push_back("-e");
7473 CmdArgs.push_back("_start");
7474 }
7475
7476 if (Args.hasArg(options::OPT_static)) {
7477 CmdArgs.push_back("-Bstatic");
7478 CmdArgs.push_back("-dn");
7479 } else {
7480 CmdArgs.push_back("-Bdynamic");
7481 if (Args.hasArg(options::OPT_shared)) {
7482 CmdArgs.push_back("-shared");
7483 } else {
7484 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007485 CmdArgs.push_back(
7486 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007487 }
7488 }
7489
7490 if (Output.isFilename()) {
7491 CmdArgs.push_back("-o");
7492 CmdArgs.push_back(Output.getFilename());
7493 } else {
7494 assert(Output.isNothing() && "Invalid output.");
7495 }
7496
Douglas Katzman78b37b02015-11-17 20:28:07 +00007497 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007498 if (!Args.hasArg(options::OPT_shared))
7499 CmdArgs.push_back(
7500 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7501
7502 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7503 CmdArgs.push_back(
7504 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7505 CmdArgs.push_back(
7506 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007507 }
7508
Douglas Katzman6059ef92015-11-17 17:41:23 +00007509 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007511 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7512 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007513
7514 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7515
Douglas Katzman78b37b02015-11-17 20:28:07 +00007516 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007517 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007518 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007519 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007520 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007521 if (!Args.hasArg(options::OPT_shared)) {
7522 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007523 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007524 }
David Chisnallf571cde2012-02-15 13:39:01 +00007525 }
7526
Douglas Katzman78b37b02015-11-17 20:28:07 +00007527 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007528 CmdArgs.push_back(
7529 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007530 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007531 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007532
Xinliang David Li69306c02015-10-22 06:15:31 +00007533 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007534
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007535 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007536 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007537}
7538
Douglas Katzman95354292015-06-23 20:42:09 +00007539void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7540 const InputInfo &Output,
7541 const InputInfoList &Inputs,
7542 const ArgList &Args,
7543 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007544 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007545 ArgStringList CmdArgs;
7546
Rafael Espindolacc126272014-02-28 01:55:21 +00007547 switch (getToolChain().getArch()) {
7548 case llvm::Triple::x86:
7549 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7550 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007551 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007552 break;
7553
7554 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007555 CmdArgs.push_back("-mppc");
7556 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007557 break;
7558
7559 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007560 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007561 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007562 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7563 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7564 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007565 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007566 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007567
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007568 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007569 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007570 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7571 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7572 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007573 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007574 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007575
7576 case llvm::Triple::mips64:
7577 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007578 StringRef CPUName;
7579 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007580 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007581
7582 CmdArgs.push_back("-mabi");
7583 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7584
7585 if (getToolChain().getArch() == llvm::Triple::mips64)
7586 CmdArgs.push_back("-EB");
7587 else
7588 CmdArgs.push_back("-EL");
7589
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007590 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007591 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007592 }
7593
Rafael Espindolacc126272014-02-28 01:55:21 +00007594 default:
7595 break;
7596 }
7597
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007598 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007599
7600 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007601 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007602
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007603 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007604 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007606 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007607 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007608}
7609
Douglas Katzman95354292015-06-23 20:42:09 +00007610void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7611 const InputInfo &Output,
7612 const InputInfoList &Inputs,
7613 const ArgList &Args,
7614 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007615 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007616 ArgStringList CmdArgs;
7617
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007618 // Silence warning for "clang -g foo.o -o foo"
7619 Args.ClaimAllArgs(options::OPT_g_Group);
7620 // and "clang -emit-llvm foo.o -o foo"
7621 Args.ClaimAllArgs(options::OPT_emit_llvm);
7622 // and for "clang -w foo.o -o foo". Other warning options are already
7623 // handled somewhere else.
7624 Args.ClaimAllArgs(options::OPT_w);
7625
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007626 if (getToolChain().getArch() == llvm::Triple::mips64)
7627 CmdArgs.push_back("-EB");
7628 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7629 CmdArgs.push_back("-EL");
7630
Douglas Katzman78b37b02015-11-17 20:28:07 +00007631 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007632 CmdArgs.push_back("-e");
7633 CmdArgs.push_back("__start");
7634 }
7635
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007636 if (Args.hasArg(options::OPT_static)) {
7637 CmdArgs.push_back("-Bstatic");
7638 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007639 if (Args.hasArg(options::OPT_rdynamic))
7640 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007641 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007642 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007643 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007644 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007645 } else {
7646 CmdArgs.push_back("-dynamic-linker");
7647 CmdArgs.push_back("/usr/libexec/ld.so");
7648 }
7649 }
7650
Rafael Espindola044f7832013-06-05 04:28:55 +00007651 if (Args.hasArg(options::OPT_nopie))
7652 CmdArgs.push_back("-nopie");
7653
Daniel Dunbarb440f562010-08-02 02:38:21 +00007654 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007655 CmdArgs.push_back("-o");
7656 CmdArgs.push_back(Output.getFilename());
7657 } else {
7658 assert(Output.isNothing() && "Invalid output.");
7659 }
7660
Douglas Katzman78b37b02015-11-17 20:28:07 +00007661 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007662 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007663 if (Args.hasArg(options::OPT_pg))
7664 CmdArgs.push_back(
7665 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007666 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007667 CmdArgs.push_back(
7668 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7669 CmdArgs.push_back(
7670 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007671 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007672 CmdArgs.push_back(
7673 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007674 }
7675 }
7676
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007677 std::string Triple = getToolChain().getTripleString();
7678 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007679 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007680 CmdArgs.push_back(
7681 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007682
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007683 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7684 options::OPT_e, options::OPT_s, options::OPT_t,
7685 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007686
Daniel Dunbar54423b22010-09-17 00:24:54 +00007687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007688
Douglas Katzman78b37b02015-11-17 20:28:07 +00007689 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007690 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007691 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007692 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007693 CmdArgs.push_back("-lm_p");
7694 else
7695 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007696 }
7697
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007698 // FIXME: For some reason GCC passes -lgcc before adding
7699 // the default system libraries. Just mimic this for now.
7700 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007701
Eric Christopher17674ec2012-09-13 06:32:34 +00007702 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007703 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7704 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007705 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007706 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007707 }
7708
Chandler Carruth45661652011-12-17 22:32:42 +00007709 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007710 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007711 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007712 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007713 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007714 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007715
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007716 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007717 }
7718
Douglas Katzman78b37b02015-11-17 20:28:07 +00007719 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007720 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007721 CmdArgs.push_back(
7722 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007723 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007724 CmdArgs.push_back(
7725 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007726 }
7727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007728 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007729 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007730}
Ed Schoutene33194b2009-04-02 19:13:12 +00007731
Douglas Katzman95354292015-06-23 20:42:09 +00007732void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7733 const InputInfo &Output,
7734 const InputInfoList &Inputs,
7735 const ArgList &Args,
7736 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007737 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007738 ArgStringList CmdArgs;
7739
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007740 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007741
7742 CmdArgs.push_back("-o");
7743 CmdArgs.push_back(Output.getFilename());
7744
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007745 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007746 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007747
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007748 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007749 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007750}
7751
Douglas Katzman95354292015-06-23 20:42:09 +00007752void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7753 const InputInfo &Output,
7754 const InputInfoList &Inputs,
7755 const ArgList &Args,
7756 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007757 const Driver &D = getToolChain().getDriver();
7758 ArgStringList CmdArgs;
7759
Douglas Katzman78b37b02015-11-17 20:28:07 +00007760 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007761 CmdArgs.push_back("-e");
7762 CmdArgs.push_back("__start");
7763 }
7764
7765 if (Args.hasArg(options::OPT_static)) {
7766 CmdArgs.push_back("-Bstatic");
7767 } else {
7768 if (Args.hasArg(options::OPT_rdynamic))
7769 CmdArgs.push_back("-export-dynamic");
7770 CmdArgs.push_back("--eh-frame-hdr");
7771 CmdArgs.push_back("-Bdynamic");
7772 if (Args.hasArg(options::OPT_shared)) {
7773 CmdArgs.push_back("-shared");
7774 } else {
7775 CmdArgs.push_back("-dynamic-linker");
7776 CmdArgs.push_back("/usr/libexec/ld.so");
7777 }
7778 }
7779
7780 if (Output.isFilename()) {
7781 CmdArgs.push_back("-o");
7782 CmdArgs.push_back(Output.getFilename());
7783 } else {
7784 assert(Output.isNothing() && "Invalid output.");
7785 }
7786
Douglas Katzman78b37b02015-11-17 20:28:07 +00007787 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007788 if (!Args.hasArg(options::OPT_shared)) {
7789 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007790 CmdArgs.push_back(
7791 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007792 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 CmdArgs.push_back(
7794 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7795 CmdArgs.push_back(
7796 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007797 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007798 CmdArgs.push_back(
7799 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007800 }
7801 }
7802
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007803 Args.AddAllArgs(CmdArgs,
7804 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007805
7806 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7807
Douglas Katzman78b37b02015-11-17 20:28:07 +00007808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007809 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007810 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7811 if (Args.hasArg(options::OPT_pg))
7812 CmdArgs.push_back("-lm_p");
7813 else
7814 CmdArgs.push_back("-lm");
7815 }
7816
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007817 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007818 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007819 CmdArgs.push_back("-lpthread_p");
7820 else
7821 CmdArgs.push_back("-lpthread");
7822 }
7823
Eli Friedman9fa28852012-08-08 23:57:20 +00007824 if (!Args.hasArg(options::OPT_shared)) {
7825 if (Args.hasArg(options::OPT_pg))
7826 CmdArgs.push_back("-lc_p");
7827 else
7828 CmdArgs.push_back("-lc");
7829 }
7830
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007831 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007832 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007833 case llvm::Triple::arm:
7834 MyArch = "arm";
7835 break;
7836 case llvm::Triple::x86:
7837 MyArch = "i386";
7838 break;
7839 case llvm::Triple::x86_64:
7840 MyArch = "amd64";
7841 break;
7842 default:
7843 llvm_unreachable("Unsupported architecture");
7844 }
7845 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007846 }
7847
Douglas Katzman78b37b02015-11-17 20:28:07 +00007848 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007849 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007850 CmdArgs.push_back(
7851 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007852 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007853 CmdArgs.push_back(
7854 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007855 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007856
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007857 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007858 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007859}
7860
Douglas Katzman95354292015-06-23 20:42:09 +00007861void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7862 const InputInfo &Output,
7863 const InputInfoList &Inputs,
7864 const ArgList &Args,
7865 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007866 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007867 ArgStringList CmdArgs;
7868
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007869 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7870 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007871 switch (getToolChain().getArch()) {
7872 default:
7873 break;
7874 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007875 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007876 break;
7877 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007878 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007879 break;
7880 case llvm::Triple::mips:
7881 case llvm::Triple::mipsel:
7882 case llvm::Triple::mips64:
7883 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007884 StringRef CPUName;
7885 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007886 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007887
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007888 CmdArgs.push_back("-march");
7889 CmdArgs.push_back(CPUName.data());
7890
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007891 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007892 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007893
7894 if (getToolChain().getArch() == llvm::Triple::mips ||
7895 getToolChain().getArch() == llvm::Triple::mips64)
7896 CmdArgs.push_back("-EB");
7897 else
7898 CmdArgs.push_back("-EL");
7899
Dimitry Andric46f338c2015-12-27 10:36:44 +00007900 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7901 StringRef v = A->getValue();
7902 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7903 A->claim();
7904 }
7905
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007906 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007907 break;
7908 }
7909 case llvm::Triple::arm:
7910 case llvm::Triple::armeb:
7911 case llvm::Triple::thumb:
7912 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007913 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007914
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007915 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007916 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007917 else
Renato Golinf4421f72014-02-19 10:44:07 +00007918 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007920 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007921 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007922 case llvm::Triple::GNUEABI:
7923 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007924 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007925 break;
7926
7927 default:
7928 CmdArgs.push_back("-matpcs");
7929 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007930 break;
7931 }
7932 case llvm::Triple::sparc:
7933 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007934 case llvm::Triple::sparcv9: {
7935 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7936 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007937 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007938 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007939 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007940 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007942 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007943
7944 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007945 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007946
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007947 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007948 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007949
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007950 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007951 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007952}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007953
Douglas Katzman95354292015-06-23 20:42:09 +00007954void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7955 const InputInfo &Output,
7956 const InputInfoList &Inputs,
7957 const ArgList &Args,
7958 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007959 const toolchains::FreeBSD &ToolChain =
7960 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007961 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007962 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007963 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007964 !Args.hasArg(options::OPT_shared) &&
7965 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007966 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007967
7968 // Silence warning for "clang -g foo.o -o foo"
7969 Args.ClaimAllArgs(options::OPT_g_Group);
7970 // and "clang -emit-llvm foo.o -o foo"
7971 Args.ClaimAllArgs(options::OPT_emit_llvm);
7972 // and for "clang -w foo.o -o foo". Other warning options are already
7973 // handled somewhere else.
7974 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007975
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007976 if (!D.SysRoot.empty())
7977 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7978
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007979 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007980 CmdArgs.push_back("-pie");
7981
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007982 if (Args.hasArg(options::OPT_static)) {
7983 CmdArgs.push_back("-Bstatic");
7984 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007985 if (Args.hasArg(options::OPT_rdynamic))
7986 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007987 CmdArgs.push_back("--eh-frame-hdr");
7988 if (Args.hasArg(options::OPT_shared)) {
7989 CmdArgs.push_back("-Bshareable");
7990 } else {
7991 CmdArgs.push_back("-dynamic-linker");
7992 CmdArgs.push_back("/libexec/ld-elf.so.1");
7993 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007994 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007995 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7996 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7997 CmdArgs.push_back("--hash-style=both");
7998 }
7999 }
8000 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008001 }
8002
8003 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8004 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008005 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008006 CmdArgs.push_back("-m");
8007 CmdArgs.push_back("elf_i386_fbsd");
8008 }
8009
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008010 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008011 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008012 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008013 }
8014
Dimitry Andric904895f2015-12-27 06:47:09 +00008015 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8016 if (ToolChain.getArch() == llvm::Triple::mips ||
8017 ToolChain.getArch() == llvm::Triple::mipsel ||
8018 ToolChain.getArch() == llvm::Triple::mips64 ||
8019 ToolChain.getArch() == llvm::Triple::mips64el) {
8020 StringRef v = A->getValue();
8021 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8022 A->claim();
8023 }
8024 }
8025
Daniel Dunbarb440f562010-08-02 02:38:21 +00008026 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008027 CmdArgs.push_back("-o");
8028 CmdArgs.push_back(Output.getFilename());
8029 } else {
8030 assert(Output.isNothing() && "Invalid output.");
8031 }
8032
Douglas Katzman78b37b02015-11-17 20:28:07 +00008033 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008034 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008035 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008036 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008037 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008038 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008039 crt1 = "Scrt1.o";
8040 else
8041 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008042 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008043 if (crt1)
8044 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8045
8046 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8047
Craig Topper92fc2df2014-05-17 16:56:41 +00008048 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008049 if (Args.hasArg(options::OPT_static))
8050 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008051 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008052 crtbegin = "crtbeginS.o";
8053 else
8054 crtbegin = "crtbegin.o";
8055
8056 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008057 }
8058
8059 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008060 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008061 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8062 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008063 Args.AddAllArgs(CmdArgs, options::OPT_s);
8064 Args.AddAllArgs(CmdArgs, options::OPT_t);
8065 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8066 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008067
Teresa Johnson945bc502015-10-15 20:35:53 +00008068 if (D.isUsingLTO())
8069 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008070
Alexey Samsonov52550342014-09-15 19:58:40 +00008071 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008072 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008073
Douglas Katzman78b37b02015-11-17 20:28:07 +00008074 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008075 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008076 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008077 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008078 if (Args.hasArg(options::OPT_pg))
8079 CmdArgs.push_back("-lm_p");
8080 else
8081 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008082 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008083 if (NeedsSanitizerDeps)
8084 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008085 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8086 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008087 if (Args.hasArg(options::OPT_pg))
8088 CmdArgs.push_back("-lgcc_p");
8089 else
8090 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008091 if (Args.hasArg(options::OPT_static)) {
8092 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008093 } else if (Args.hasArg(options::OPT_pg)) {
8094 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008095 } else {
8096 CmdArgs.push_back("--as-needed");
8097 CmdArgs.push_back("-lgcc_s");
8098 CmdArgs.push_back("--no-as-needed");
8099 }
8100
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008101 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008102 if (Args.hasArg(options::OPT_pg))
8103 CmdArgs.push_back("-lpthread_p");
8104 else
8105 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008106 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008107
Roman Divacky66f22762011-02-10 16:59:40 +00008108 if (Args.hasArg(options::OPT_pg)) {
8109 if (Args.hasArg(options::OPT_shared))
8110 CmdArgs.push_back("-lc");
8111 else
8112 CmdArgs.push_back("-lc_p");
8113 CmdArgs.push_back("-lgcc_p");
8114 } else {
8115 CmdArgs.push_back("-lc");
8116 CmdArgs.push_back("-lgcc");
8117 }
8118
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008119 if (Args.hasArg(options::OPT_static)) {
8120 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008121 } else if (Args.hasArg(options::OPT_pg)) {
8122 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008123 } else {
8124 CmdArgs.push_back("--as-needed");
8125 CmdArgs.push_back("-lgcc_s");
8126 CmdArgs.push_back("--no-as-needed");
8127 }
8128 }
8129
Douglas Katzman78b37b02015-11-17 20:28:07 +00008130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008131 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008132 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008133 else
8134 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008135 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008136 }
8137
Xinliang David Li69306c02015-10-22 06:15:31 +00008138 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008139
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008140 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008142}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008143
Douglas Katzman95354292015-06-23 20:42:09 +00008144void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008145 const InputInfo &Output,
8146 const InputInfoList &Inputs,
8147 const ArgList &Args,
8148 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008149 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008150 ArgStringList CmdArgs;
8151
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008152 // GNU as needs different flags for creating the correct output format
8153 // on architectures with different ABIs or optional feature sets.
8154 switch (getToolChain().getArch()) {
8155 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008156 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008157 break;
8158 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008159 case llvm::Triple::armeb:
8160 case llvm::Triple::thumb:
8161 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008162 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008163 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8164 std::string Arch =
8165 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008166 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008167 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008168 }
8169
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008170 case llvm::Triple::mips:
8171 case llvm::Triple::mipsel:
8172 case llvm::Triple::mips64:
8173 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008174 StringRef CPUName;
8175 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008176 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008177
8178 CmdArgs.push_back("-march");
8179 CmdArgs.push_back(CPUName.data());
8180
8181 CmdArgs.push_back("-mabi");
8182 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8183
8184 if (getToolChain().getArch() == llvm::Triple::mips ||
8185 getToolChain().getArch() == llvm::Triple::mips64)
8186 CmdArgs.push_back("-EB");
8187 else
8188 CmdArgs.push_back("-EL");
8189
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008190 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008191 break;
8192 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008193
8194 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008195 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008196 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008197 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8198 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008199 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008200 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008201 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008202
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008203 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008204 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008205 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8206 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008207 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008208 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008209 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008210
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008211 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008212 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008213 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008214
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008215 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008216
8217 CmdArgs.push_back("-o");
8218 CmdArgs.push_back(Output.getFilename());
8219
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008220 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008221 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008222
David Chisnallddbd68f2011-09-27 22:03:18 +00008223 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008224 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008225}
8226
Douglas Katzman95354292015-06-23 20:42:09 +00008227void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8228 const InputInfo &Output,
8229 const InputInfoList &Inputs,
8230 const ArgList &Args,
8231 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008232 const Driver &D = getToolChain().getDriver();
8233 ArgStringList CmdArgs;
8234
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008235 if (!D.SysRoot.empty())
8236 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8237
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008238 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008239 if (Args.hasArg(options::OPT_static)) {
8240 CmdArgs.push_back("-Bstatic");
8241 } else {
8242 if (Args.hasArg(options::OPT_rdynamic))
8243 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008244 if (Args.hasArg(options::OPT_shared)) {
8245 CmdArgs.push_back("-Bshareable");
8246 } else {
8247 CmdArgs.push_back("-dynamic-linker");
8248 CmdArgs.push_back("/libexec/ld.elf_so");
8249 }
8250 }
8251
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008252 // Many NetBSD architectures support more than one ABI.
8253 // Determine the correct emulation for ld.
8254 switch (getToolChain().getArch()) {
8255 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008256 CmdArgs.push_back("-m");
8257 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008258 break;
8259 case llvm::Triple::arm:
8260 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008261 CmdArgs.push_back("-m");
8262 switch (getToolChain().getTriple().getEnvironment()) {
8263 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008264 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008265 CmdArgs.push_back("armelf_nbsd_eabi");
8266 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008267 case llvm::Triple::EABIHF:
8268 case llvm::Triple::GNUEABIHF:
8269 CmdArgs.push_back("armelf_nbsd_eabihf");
8270 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008271 default:
8272 CmdArgs.push_back("armelf_nbsd");
8273 break;
8274 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008275 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008276 case llvm::Triple::armeb:
8277 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008278 arm::appendEBLinkFlags(
8279 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008280 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008281 CmdArgs.push_back("-m");
8282 switch (getToolChain().getTriple().getEnvironment()) {
8283 case llvm::Triple::EABI:
8284 case llvm::Triple::GNUEABI:
8285 CmdArgs.push_back("armelfb_nbsd_eabi");
8286 break;
8287 case llvm::Triple::EABIHF:
8288 case llvm::Triple::GNUEABIHF:
8289 CmdArgs.push_back("armelfb_nbsd_eabihf");
8290 break;
8291 default:
8292 CmdArgs.push_back("armelfb_nbsd");
8293 break;
8294 }
8295 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008296 case llvm::Triple::mips64:
8297 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008298 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008299 CmdArgs.push_back("-m");
8300 if (getToolChain().getArch() == llvm::Triple::mips64)
8301 CmdArgs.push_back("elf32btsmip");
8302 else
8303 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008304 } else if (mips::hasMipsAbiArg(Args, "64")) {
8305 CmdArgs.push_back("-m");
8306 if (getToolChain().getArch() == llvm::Triple::mips64)
8307 CmdArgs.push_back("elf64btsmip");
8308 else
8309 CmdArgs.push_back("elf64ltsmip");
8310 }
8311 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008312 case llvm::Triple::ppc:
8313 CmdArgs.push_back("-m");
8314 CmdArgs.push_back("elf32ppc_nbsd");
8315 break;
8316
8317 case llvm::Triple::ppc64:
8318 case llvm::Triple::ppc64le:
8319 CmdArgs.push_back("-m");
8320 CmdArgs.push_back("elf64ppc");
8321 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008322
8323 case llvm::Triple::sparc:
8324 CmdArgs.push_back("-m");
8325 CmdArgs.push_back("elf32_sparc");
8326 break;
8327
8328 case llvm::Triple::sparcv9:
8329 CmdArgs.push_back("-m");
8330 CmdArgs.push_back("elf64_sparc");
8331 break;
8332
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008333 default:
8334 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008335 }
8336
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008337 if (Output.isFilename()) {
8338 CmdArgs.push_back("-o");
8339 CmdArgs.push_back(Output.getFilename());
8340 } else {
8341 assert(Output.isNothing() && "Invalid output.");
8342 }
8343
Douglas Katzman78b37b02015-11-17 20:28:07 +00008344 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008345 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008346 CmdArgs.push_back(
8347 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8348 CmdArgs.push_back(
8349 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8350 CmdArgs.push_back(
8351 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008352 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008353 CmdArgs.push_back(
8354 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8355 CmdArgs.push_back(
8356 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008357 }
8358 }
8359
8360 Args.AddAllArgs(CmdArgs, options::OPT_L);
8361 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8362 Args.AddAllArgs(CmdArgs, options::OPT_e);
8363 Args.AddAllArgs(CmdArgs, options::OPT_s);
8364 Args.AddAllArgs(CmdArgs, options::OPT_t);
8365 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8366 Args.AddAllArgs(CmdArgs, options::OPT_r);
8367
8368 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8369
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008370 unsigned Major, Minor, Micro;
8371 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8372 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008373 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008374 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008375 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008376 case llvm::Triple::arm:
8377 case llvm::Triple::armeb:
8378 case llvm::Triple::thumb:
8379 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008380 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008381 case llvm::Triple::ppc64:
8382 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008383 case llvm::Triple::sparc:
8384 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008385 case llvm::Triple::x86:
8386 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008387 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008388 break;
8389 default:
8390 break;
8391 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008392 }
8393
Douglas Katzman78b37b02015-11-17 20:28:07 +00008394 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008395 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008396 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008397 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8398 CmdArgs.push_back("-lm");
8399 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008400 if (Args.hasArg(options::OPT_pthread))
8401 CmdArgs.push_back("-lpthread");
8402 CmdArgs.push_back("-lc");
8403
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008404 if (useLibgcc) {
8405 if (Args.hasArg(options::OPT_static)) {
8406 // libgcc_eh depends on libc, so resolve as much as possible,
8407 // pull in any new requirements from libc and then get the rest
8408 // of libgcc.
8409 CmdArgs.push_back("-lgcc_eh");
8410 CmdArgs.push_back("-lc");
8411 CmdArgs.push_back("-lgcc");
8412 } else {
8413 CmdArgs.push_back("-lgcc");
8414 CmdArgs.push_back("--as-needed");
8415 CmdArgs.push_back("-lgcc_s");
8416 CmdArgs.push_back("--no-as-needed");
8417 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008418 }
8419 }
8420
Douglas Katzman78b37b02015-11-17 20:28:07 +00008421 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008422 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008423 CmdArgs.push_back(
8424 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008425 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008426 CmdArgs.push_back(
8427 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8428 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008429 }
8430
Xinliang David Li69306c02015-10-22 06:15:31 +00008431 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008432
Logan Chieneb9162f2014-06-26 14:23:45 +00008433 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008434 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008435}
8436
Douglas Katzman95354292015-06-23 20:42:09 +00008437void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8438 const InputInfo &Output,
8439 const InputInfoList &Inputs,
8440 const ArgList &Args,
8441 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008442 claimNoWarnArgs(Args);
8443
James Y Knight2db38f32015-08-15 03:45:25 +00008444 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8445 llvm::Triple Triple = llvm::Triple(TripleStr);
8446
Rafael Espindola92b00932010-08-10 00:25:48 +00008447 ArgStringList CmdArgs;
8448
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008449 llvm::Reloc::Model RelocationModel;
8450 unsigned PICLevel;
8451 bool IsPIE;
8452 std::tie(RelocationModel, PICLevel, IsPIE) =
8453 ParsePICArgs(getToolChain(), Triple, Args);
8454
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008455 switch (getToolChain().getArch()) {
8456 default:
8457 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008458 // Add --32/--64 to make sure we get the format we want.
8459 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008460 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008461 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008462 break;
8463 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008464 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8465 CmdArgs.push_back("--x32");
8466 else
8467 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008468 break;
8469 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008470 CmdArgs.push_back("-a32");
8471 CmdArgs.push_back("-mppc");
8472 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008473 break;
8474 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008475 CmdArgs.push_back("-a64");
8476 CmdArgs.push_back("-mppc64");
8477 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008478 break;
8479 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008480 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008481 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008482 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008483 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008484 break;
8485 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008486 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008487 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008488 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8489 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8490 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008491 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008492 }
8493 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008494 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008495 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8496 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8497 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008498 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008499 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008500 case llvm::Triple::arm:
8501 case llvm::Triple::armeb:
8502 case llvm::Triple::thumb:
8503 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008504 const llvm::Triple &Triple2 = getToolChain().getTriple();
8505 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008506 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008507 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008508 break;
8509 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008510 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008511 break;
8512 default:
8513 break;
8514 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008515
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008516 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008517 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8518 case arm::FloatABI::Soft:
8519 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8520 break;
8521 case arm::FloatABI::SoftFP:
8522 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8523 break;
8524 case arm::FloatABI::Hard:
8525 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8526 break;
8527 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008528
8529 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008530
8531 // FIXME: remove krait check when GNU tools support krait cpu
8532 // for now replace it with -march=armv7-a to avoid a lower
8533 // march from being picked in the absence of a cpu flag.
8534 Arg *A;
8535 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008536 StringRef(A->getValue()).lower() == "krait")
8537 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008538 else
8539 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008540 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008541 break;
8542 }
8543 case llvm::Triple::mips:
8544 case llvm::Triple::mipsel:
8545 case llvm::Triple::mips64:
8546 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008547 StringRef CPUName;
8548 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008549 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008550 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008551
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008552 CmdArgs.push_back("-march");
8553 CmdArgs.push_back(CPUName.data());
8554
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008555 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008556 CmdArgs.push_back(ABIName.data());
8557
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008558 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8559 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008560 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008561 CmdArgs.push_back("-mno-shared");
8562
Daniel Sanders379d44b2014-07-16 11:52:23 +00008563 // LLVM doesn't support -mplt yet and acts as if it is always given.
8564 // However, -mplt has no effect with the N64 ABI.
8565 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008566
8567 if (getToolChain().getArch() == llvm::Triple::mips ||
8568 getToolChain().getArch() == llvm::Triple::mips64)
8569 CmdArgs.push_back("-EB");
8570 else
8571 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008572
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008573 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8574 if (StringRef(A->getValue()) == "2008")
8575 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8576 }
8577
Daniel Sanders379d44b2014-07-16 11:52:23 +00008578 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8579 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8580 options::OPT_mfp64)) {
8581 A->claim();
8582 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008583 } else if (mips::shouldUseFPXX(
8584 Args, getToolChain().getTriple(), CPUName, ABIName,
8585 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008586 CmdArgs.push_back("-mfpxx");
8587
8588 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8589 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008590 if (Arg *A =
8591 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008592 if (A->getOption().matches(options::OPT_mips16)) {
8593 A->claim();
8594 A->render(Args, CmdArgs);
8595 } else {
8596 A->claim();
8597 CmdArgs.push_back("-no-mips16");
8598 }
8599 }
8600
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008601 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8602 options::OPT_mno_micromips);
8603 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8604 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8605
Simon Atanasyanbd986632013-11-26 11:58:04 +00008606 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8607 // Do not use AddLastArg because not all versions of MIPS assembler
8608 // support -mmsa / -mno-msa options.
8609 if (A->getOption().matches(options::OPT_mmsa))
8610 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8611 }
8612
Daniel Sanders379d44b2014-07-16 11:52:23 +00008613 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8614 options::OPT_msoft_float);
8615
Toma Tabacub36d6102015-06-11 12:13:18 +00008616 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8617 options::OPT_msingle_float);
8618
Daniel Sanders379d44b2014-07-16 11:52:23 +00008619 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8620 options::OPT_mno_odd_spreg);
8621
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008622 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008623 break;
8624 }
8625 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008626 // Always pass an -march option, since our default of z10 is later
8627 // than the GNU assembler's default.
8628 StringRef CPUName = getSystemZTargetCPU(Args);
8629 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008630 break;
8631 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008632 }
8633
Renato Golina74bbc72015-07-22 15:32:36 +00008634 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008635 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008636
8637 CmdArgs.push_back("-o");
8638 CmdArgs.push_back(Output.getFilename());
8639
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008640 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008641 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008643 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008644 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008645
8646 // Handle the debug info splitting at object creation time if we're
8647 // creating an object.
8648 // TODO: Currently only works on linux with newer objcopy.
8649 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008650 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008651 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008652 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008653}
8654
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008655static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008656 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008657 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008658 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008659 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8660 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008661 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008662 CmdArgs.push_back("-lgcc");
8663
Logan Chien3d3373c2012-11-19 12:04:11 +00008664 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008665 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008666 CmdArgs.push_back("-lgcc");
8667 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008668 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008669 CmdArgs.push_back("--as-needed");
8670 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008671 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008672 CmdArgs.push_back("--no-as-needed");
8673 }
8674
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008675 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008676 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008677 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008678 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008679
8680 // According to Android ABI, we have to link with libdl if we are
8681 // linking with non-static libgcc.
8682 //
8683 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8684 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8685 if (isAndroid && !StaticLibgcc)
8686 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008687}
8688
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008689static std::string getLinuxDynamicLinker(const ArgList &Args,
8690 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008691 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8692
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008693 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008694 if (ToolChain.getTriple().isArch64Bit())
8695 return "/system/bin/linker64";
8696 else
8697 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008698 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8699 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008700 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008701 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008702 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008703 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008704 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008705 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008706 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008707 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008708 return "/lib/ld-linux-armhf.so.3";
8709 else
8710 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008711 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8712 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008713 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008714 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008715 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008716 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008717 return "/lib/ld-linux.so.3";
8718 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8719 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008720 std::string LibDir =
8721 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008722 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008723 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008724 if (mips::isUCLibc(Args))
8725 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008726 else if (!ToolChain.getTriple().hasEnvironment()) {
8727 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8728 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8729 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8730 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008731 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008732
8733 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008734 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008735 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008737 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8738 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008739 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008740 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008741 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8742 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008743 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008744 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008745 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008746 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008747 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008748 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008749 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8750 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008751 else
8752 return "/lib64/ld-linux-x86-64.so.2";
8753}
8754
Renato Golinc4b49242014-02-13 10:01:16 +00008755static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008756 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008757 // Make use of compiler-rt if --rtlib option is used
8758 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8759
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008760 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008761 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008762 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008763 default:
8764 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008765 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008766 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008767 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008768 break;
8769 }
Renato Golinc4b49242014-02-13 10:01:16 +00008770 break;
8771 case ToolChain::RLT_Libgcc:
8772 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8773 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008774 }
8775}
8776
Rafael Espindola1e085772014-08-15 17:14:35 +00008777static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8778 switch (T.getArch()) {
8779 case llvm::Triple::x86:
8780 return "elf_i386";
8781 case llvm::Triple::aarch64:
8782 return "aarch64linux";
8783 case llvm::Triple::aarch64_be:
8784 return "aarch64_be_linux";
8785 case llvm::Triple::arm:
8786 case llvm::Triple::thumb:
8787 return "armelf_linux_eabi";
8788 case llvm::Triple::armeb:
8789 case llvm::Triple::thumbeb:
8790 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8791 case llvm::Triple::ppc:
8792 return "elf32ppclinux";
8793 case llvm::Triple::ppc64:
8794 return "elf64ppc";
8795 case llvm::Triple::ppc64le:
8796 return "elf64lppc";
8797 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008798 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008799 return "elf32_sparc";
8800 case llvm::Triple::sparcv9:
8801 return "elf64_sparc";
8802 case llvm::Triple::mips:
8803 return "elf32btsmip";
8804 case llvm::Triple::mipsel:
8805 return "elf32ltsmip";
8806 case llvm::Triple::mips64:
8807 if (mips::hasMipsAbiArg(Args, "n32"))
8808 return "elf32btsmipn32";
8809 return "elf64btsmip";
8810 case llvm::Triple::mips64el:
8811 if (mips::hasMipsAbiArg(Args, "n32"))
8812 return "elf32ltsmipn32";
8813 return "elf64ltsmip";
8814 case llvm::Triple::systemz:
8815 return "elf64_s390";
8816 case llvm::Triple::x86_64:
8817 if (T.getEnvironment() == llvm::Triple::GNUX32)
8818 return "elf32_x86_64";
8819 return "elf_x86_64";
8820 default:
8821 llvm_unreachable("Unexpected arch");
8822 }
8823}
8824
Douglas Katzman95354292015-06-23 20:42:09 +00008825void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8826 const InputInfo &Output,
8827 const InputInfoList &Inputs,
8828 const ArgList &Args,
8829 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008830 const toolchains::Linux &ToolChain =
8831 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008832 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008833
8834 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8835 llvm::Triple Triple = llvm::Triple(TripleStr);
8836
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008837 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008838 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008839 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008840 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8841 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008842 const bool HasCRTBeginEndFiles =
8843 ToolChain.getTriple().hasEnvironment() ||
8844 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008845
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008846 ArgStringList CmdArgs;
8847
Rafael Espindolad1002f62010-11-15 18:28:16 +00008848 // Silence warning for "clang -g foo.o -o foo"
8849 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008850 // and "clang -emit-llvm foo.o -o foo"
8851 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008852 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008853 // handled somewhere else.
8854 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008855
Peter Collingbourne39719a72015-11-20 20:49:39 +00008856 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8857 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008858 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008859 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008860 CmdArgs.push_back("-target");
8861 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8862 }
8863
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008864 if (!D.SysRoot.empty())
8865 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008866
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008867 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008868 CmdArgs.push_back("-pie");
8869
Rafael Espindola1c76c592010-11-07 22:57:16 +00008870 if (Args.hasArg(options::OPT_rdynamic))
8871 CmdArgs.push_back("-export-dynamic");
8872
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008873 if (Args.hasArg(options::OPT_s))
8874 CmdArgs.push_back("-s");
8875
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008876 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008877 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008878
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008879 for (const auto &Opt : ToolChain.ExtraOpts)
8880 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008881
8882 if (!Args.hasArg(options::OPT_static)) {
8883 CmdArgs.push_back("--eh-frame-hdr");
8884 }
8885
8886 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008887 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008888
8889 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008890 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8891 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008892 CmdArgs.push_back("-Bstatic");
8893 else
8894 CmdArgs.push_back("-static");
8895 } else if (Args.hasArg(options::OPT_shared)) {
8896 CmdArgs.push_back("-shared");
8897 }
8898
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00008899 if (!Args.hasArg(options::OPT_static)) {
8900 if (Args.hasArg(options::OPT_rdynamic))
8901 CmdArgs.push_back("-export-dynamic");
8902
8903 if (!Args.hasArg(options::OPT_shared)) {
8904 const std::string Loader =
8905 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
8906 CmdArgs.push_back("-dynamic-linker");
8907 CmdArgs.push_back(Args.MakeArgString(Loader));
8908 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008909 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008910
8911 CmdArgs.push_back("-o");
8912 CmdArgs.push_back(Output.getFilename());
8913
Douglas Katzman78b37b02015-11-17 20:28:07 +00008914 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008915 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008916 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008917 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008918 if (Args.hasArg(options::OPT_pg))
8919 crt1 = "gcrt1.o";
8920 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008921 crt1 = "Scrt1.o";
8922 else
8923 crt1 = "crt1.o";
8924 }
8925 if (crt1)
8926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008927
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8929 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008930
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008931 const char *crtbegin;
8932 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008933 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008934 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008935 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008936 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008937 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008938 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008939 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008940
8941 if (HasCRTBeginEndFiles)
8942 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008943
8944 // Add crtfastmath.o if available and fast math is enabled.
8945 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008946 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008947
8948 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008949 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008950
Douglas Katzman6059ef92015-11-17 17:41:23 +00008951 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008952
Teresa Johnson945bc502015-10-15 20:35:53 +00008953 if (D.isUsingLTO())
8954 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008955
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008956 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8957 CmdArgs.push_back("--no-demangle");
8958
Alexey Samsonov52550342014-09-15 19:58:40 +00008959 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008960 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008961 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008962 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008963
Douglas Katzman78b37b02015-11-17 20:28:07 +00008964 if (D.CCCIsCXX() &&
8965 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008966 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008967 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008968 if (OnlyLibstdcxxStatic)
8969 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008970 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008971 if (OnlyLibstdcxxStatic)
8972 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008973 CmdArgs.push_back("-lm");
8974 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008975 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8976 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008977
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008978 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008979 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8980 if (Args.hasArg(options::OPT_static))
8981 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008982
Alexey Samsonov52550342014-09-15 19:58:40 +00008983 if (NeedsSanitizerDeps)
8984 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8985
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008986 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8987 Args.hasArg(options::OPT_pthreads);
8988
8989 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8990 options::OPT_fno_openmp, false)) {
8991 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8992 // FIXME: Does this really make sense for all GNU toolchains?
8993 WantPthread = true;
8994
8995 // Also link the particular OpenMP runtimes.
8996 switch (getOpenMPRuntime(ToolChain, Args)) {
8997 case OMPRT_OMP:
8998 CmdArgs.push_back("-lomp");
8999 break;
9000 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009001 CmdArgs.push_back("-lgomp");
9002
9003 // FIXME: Exclude this for platforms with libgomp that don't require
9004 // librt. Most modern Linux platforms require it, but some may not.
9005 CmdArgs.push_back("-lrt");
9006 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009007 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009008 CmdArgs.push_back("-liomp5");
9009 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009010 case OMPRT_Unknown:
9011 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009012 break;
9013 }
Chandler Carruth01538002013-01-17 13:19:29 +00009014 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009015
Renato Golinc4b49242014-02-13 10:01:16 +00009016 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009017
Richard Smith31d1de22015-05-20 22:48:44 +00009018 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009019 CmdArgs.push_back("-lpthread");
9020
Rafael Espindolab17bc532016-01-25 18:29:16 +00009021 if (Args.hasArg(options::OPT_fsplit_stack))
9022 CmdArgs.push_back("--wrap=pthread_create");
9023
Chandler Carruth94a32012012-05-14 18:31:18 +00009024 CmdArgs.push_back("-lc");
9025
9026 if (Args.hasArg(options::OPT_static))
9027 CmdArgs.push_back("--end-group");
9028 else
Renato Golinc4b49242014-02-13 10:01:16 +00009029 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009030 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009031
Rafael Espindola81937ec2010-12-01 01:52:43 +00009032 if (!Args.hasArg(options::OPT_nostartfiles)) {
9033 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009034 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009035 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009036 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009037 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009038 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009039 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009040
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009041 if (HasCRTBeginEndFiles)
9042 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009043 if (!isAndroid)
9044 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009045 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009046 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009047
Peter Collingbourne39719a72015-11-20 20:49:39 +00009048 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009049}
9050
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009051// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9052// for the various SFI requirements like register masking. The assembly tool
9053// inserts the file containing the macros as an input into all the assembly
9054// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009055void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9056 const InputInfo &Output,
9057 const InputInfoList &Inputs,
9058 const ArgList &Args,
9059 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009060 const toolchains::NaClToolChain &ToolChain =
9061 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009062 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009063 "nacl-arm-macros.s");
9064 InputInfoList NewInputs;
9065 NewInputs.push_back(NaClMacros);
9066 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009067 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9068 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009069}
9070
Douglas Katzman750cfc52015-06-29 18:42:16 +00009071// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009072// we use static by default, do not yet support sanitizers or LTO, and a few
9073// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009074// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009075void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9076 const InputInfo &Output,
9077 const InputInfoList &Inputs,
9078 const ArgList &Args,
9079 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009080
Douglas Katzman54366072015-07-27 16:53:08 +00009081 const toolchains::NaClToolChain &ToolChain =
9082 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009083 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009084 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009085 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009086 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009087
9088 ArgStringList CmdArgs;
9089
9090 // Silence warning for "clang -g foo.o -o foo"
9091 Args.ClaimAllArgs(options::OPT_g_Group);
9092 // and "clang -emit-llvm foo.o -o foo"
9093 Args.ClaimAllArgs(options::OPT_emit_llvm);
9094 // and for "clang -w foo.o -o foo". Other warning options are already
9095 // handled somewhere else.
9096 Args.ClaimAllArgs(options::OPT_w);
9097
9098 if (!D.SysRoot.empty())
9099 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9100
9101 if (Args.hasArg(options::OPT_rdynamic))
9102 CmdArgs.push_back("-export-dynamic");
9103
9104 if (Args.hasArg(options::OPT_s))
9105 CmdArgs.push_back("-s");
9106
Douglas Katzman54366072015-07-27 16:53:08 +00009107 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9108 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009109 CmdArgs.push_back("--build-id");
9110
9111 if (!IsStatic)
9112 CmdArgs.push_back("--eh-frame-hdr");
9113
9114 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009115 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009116 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009117 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009118 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009119 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009120 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009121 else if (Arch == llvm::Triple::mipsel)
9122 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009123 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009124 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9125 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009126
9127 if (IsStatic)
9128 CmdArgs.push_back("-static");
9129 else if (Args.hasArg(options::OPT_shared))
9130 CmdArgs.push_back("-shared");
9131
9132 CmdArgs.push_back("-o");
9133 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009134 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009135 if (!Args.hasArg(options::OPT_shared))
9136 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9137 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9138
9139 const char *crtbegin;
9140 if (IsStatic)
9141 crtbegin = "crtbeginT.o";
9142 else if (Args.hasArg(options::OPT_shared))
9143 crtbegin = "crtbeginS.o";
9144 else
9145 crtbegin = "crtbegin.o";
9146 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9147 }
9148
9149 Args.AddAllArgs(CmdArgs, options::OPT_L);
9150 Args.AddAllArgs(CmdArgs, options::OPT_u);
9151
Douglas Katzman6059ef92015-11-17 17:41:23 +00009152 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009153
9154 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9155 CmdArgs.push_back("--no-demangle");
9156
9157 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9158
Douglas Katzman78b37b02015-11-17 20:28:07 +00009159 if (D.CCCIsCXX() &&
9160 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009161 bool OnlyLibstdcxxStatic =
9162 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009163 if (OnlyLibstdcxxStatic)
9164 CmdArgs.push_back("-Bstatic");
9165 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9166 if (OnlyLibstdcxxStatic)
9167 CmdArgs.push_back("-Bdynamic");
9168 CmdArgs.push_back("-lm");
9169 }
9170
9171 if (!Args.hasArg(options::OPT_nostdlib)) {
9172 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9173 // Always use groups, since it has no effect on dynamic libraries.
9174 CmdArgs.push_back("--start-group");
9175 CmdArgs.push_back("-lc");
9176 // NaCl's libc++ currently requires libpthread, so just always include it
9177 // in the group for C++.
9178 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009179 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009180 // Gold, used by Mips, handles nested groups differently than ld, and
9181 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9182 // which is not a desired behaviour here.
9183 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9184 if (getToolChain().getArch() == llvm::Triple::mipsel)
9185 CmdArgs.push_back("-lnacl");
9186
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009187 CmdArgs.push_back("-lpthread");
9188 }
9189
9190 CmdArgs.push_back("-lgcc");
9191 CmdArgs.push_back("--as-needed");
9192 if (IsStatic)
9193 CmdArgs.push_back("-lgcc_eh");
9194 else
9195 CmdArgs.push_back("-lgcc_s");
9196 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009197
9198 // Mips needs to create and use pnacl_legacy library that contains
9199 // definitions from bitcode/pnaclmm.c and definitions for
9200 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9201 if (getToolChain().getArch() == llvm::Triple::mipsel)
9202 CmdArgs.push_back("-lpnacl_legacy");
9203
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009204 CmdArgs.push_back("--end-group");
9205 }
9206
9207 if (!Args.hasArg(options::OPT_nostartfiles)) {
9208 const char *crtend;
9209 if (Args.hasArg(options::OPT_shared))
9210 crtend = "crtendS.o";
9211 else
9212 crtend = "crtend.o";
9213
9214 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9216 }
9217 }
9218
Peter Collingbourne39719a72015-11-20 20:49:39 +00009219 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009221}
9222
Douglas Katzman95354292015-06-23 20:42:09 +00009223void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9224 const InputInfo &Output,
9225 const InputInfoList &Inputs,
9226 const ArgList &Args,
9227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009228 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009229 ArgStringList CmdArgs;
9230
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009231 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009232
9233 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009234 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009235
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009236 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009237 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009238
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009239 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009240 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009241}
9242
Douglas Katzman95354292015-06-23 20:42:09 +00009243void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9244 const InputInfo &Output,
9245 const InputInfoList &Inputs,
9246 const ArgList &Args,
9247 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009248 const Driver &D = getToolChain().getDriver();
9249 ArgStringList CmdArgs;
9250
Daniel Dunbarb440f562010-08-02 02:38:21 +00009251 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009252 CmdArgs.push_back("-o");
9253 CmdArgs.push_back(Output.getFilename());
9254 } else {
9255 assert(Output.isNothing() && "Invalid output.");
9256 }
9257
Douglas Katzman78b37b02015-11-17 20:28:07 +00009258 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009259 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9260 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9261 CmdArgs.push_back(
9262 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9263 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009264 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009265
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009266 Args.AddAllArgs(CmdArgs,
9267 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009268
Daniel Dunbar54423b22010-09-17 00:24:54 +00009269 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009270
Xinliang David Li69306c02015-10-22 06:15:31 +00009271 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009272
Douglas Katzman78b37b02015-11-17 20:28:07 +00009273 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009274 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009275 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009276 CmdArgs.push_back("-lm");
9277 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009278 }
9279
Douglas Katzman78b37b02015-11-17 20:28:07 +00009280 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009281 if (Args.hasArg(options::OPT_pthread))
9282 CmdArgs.push_back("-lpthread");
9283 CmdArgs.push_back("-lc");
9284 CmdArgs.push_back("-lCompilerRT-Generic");
9285 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9286 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009287 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009288 }
9289
Logan Chieneb9162f2014-06-26 14:23:45 +00009290 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009291 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009292}
9293
Daniel Dunbarcc912342009-05-02 18:28:39 +00009294/// DragonFly Tools
9295
9296// For now, DragonFly Assemble does just about the same as for
9297// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009298void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9299 const InputInfo &Output,
9300 const InputInfoList &Inputs,
9301 const ArgList &Args,
9302 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009303 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009304 ArgStringList CmdArgs;
9305
9306 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9307 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009308 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009309 CmdArgs.push_back("--32");
9310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009311 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009312
9313 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009314 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009315
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009316 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009317 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009318
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009319 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009320 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009321}
9322
Douglas Katzman95354292015-06-23 20:42:09 +00009323void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9324 const InputInfo &Output,
9325 const InputInfoList &Inputs,
9326 const ArgList &Args,
9327 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009328 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009329 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009330
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009331 if (!D.SysRoot.empty())
9332 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9333
John McCall65b8da02013-04-11 22:55:55 +00009334 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009335 if (Args.hasArg(options::OPT_static)) {
9336 CmdArgs.push_back("-Bstatic");
9337 } else {
John McCall65b8da02013-04-11 22:55:55 +00009338 if (Args.hasArg(options::OPT_rdynamic))
9339 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009340 if (Args.hasArg(options::OPT_shared))
9341 CmdArgs.push_back("-Bshareable");
9342 else {
9343 CmdArgs.push_back("-dynamic-linker");
9344 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9345 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009346 CmdArgs.push_back("--hash-style=gnu");
9347 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009348 }
9349
9350 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9351 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009352 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009353 CmdArgs.push_back("-m");
9354 CmdArgs.push_back("elf_i386");
9355 }
9356
Daniel Dunbarb440f562010-08-02 02:38:21 +00009357 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009358 CmdArgs.push_back("-o");
9359 CmdArgs.push_back(Output.getFilename());
9360 } else {
9361 assert(Output.isNothing() && "Invalid output.");
9362 }
9363
Douglas Katzman78b37b02015-11-17 20:28:07 +00009364 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009365 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009366 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009367 CmdArgs.push_back(
9368 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009369 else {
9370 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009371 CmdArgs.push_back(
9372 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009373 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009374 CmdArgs.push_back(
9375 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009376 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009377 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009378 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009379 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009380 CmdArgs.push_back(
9381 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009382 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009383 CmdArgs.push_back(
9384 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009385 }
9386
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009387 Args.AddAllArgs(CmdArgs,
9388 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009389
Daniel Dunbar54423b22010-09-17 00:24:54 +00009390 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009391
Douglas Katzman78b37b02015-11-17 20:28:07 +00009392 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009393 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009394
9395 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009396 CmdArgs.push_back("-rpath");
9397 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009398 }
9399
Hans Wennborg70850d82013-07-18 20:29:38 +00009400 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009401 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009402 CmdArgs.push_back("-lm");
9403 }
9404
Daniel Dunbarcc912342009-05-02 18:28:39 +00009405 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009406 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009407
9408 if (!Args.hasArg(options::OPT_nolibc)) {
9409 CmdArgs.push_back("-lc");
9410 }
9411
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009412 if (Args.hasArg(options::OPT_static) ||
9413 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009414 CmdArgs.push_back("-lgcc");
9415 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009416 } else {
9417 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009418 CmdArgs.push_back("-lgcc_pic");
9419 if (!Args.hasArg(options::OPT_shared))
9420 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009421 } else {
John McCall65b8da02013-04-11 22:55:55 +00009422 CmdArgs.push_back("-lgcc");
9423 CmdArgs.push_back("--as-needed");
9424 CmdArgs.push_back("-lgcc_pic");
9425 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009426 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009427 }
9428 }
9429
Douglas Katzman78b37b02015-11-17 20:28:07 +00009430 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009431 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009432 CmdArgs.push_back(
9433 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009434 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009435 CmdArgs.push_back(
9436 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9437 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009438 }
9439
Xinliang David Li69306c02015-10-22 06:15:31 +00009440 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009441
Logan Chieneb9162f2014-06-26 14:23:45 +00009442 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009444}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009445
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009446// Try to find Exe from a Visual Studio distribution. This first tries to find
9447// an installed copy of Visual Studio and, failing that, looks in the PATH,
9448// making sure that whatever executable that's found is not a same-named exe
9449// from clang itself to prevent clang from falling back to itself.
9450static std::string FindVisualStudioExecutable(const ToolChain &TC,
9451 const char *Exe,
9452 const char *ClangProgramPath) {
9453 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9454 std::string visualStudioBinDir;
9455 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9456 visualStudioBinDir)) {
9457 SmallString<128> FilePath(visualStudioBinDir);
9458 llvm::sys::path::append(FilePath, Exe);
9459 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9460 return FilePath.str();
9461 }
9462
9463 return Exe;
9464}
9465
Douglas Katzman95354292015-06-23 20:42:09 +00009466void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9467 const InputInfo &Output,
9468 const InputInfoList &Inputs,
9469 const ArgList &Args,
9470 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009471 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009472 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009473
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009474 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9475 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009476 CmdArgs.push_back(
9477 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009478
Douglas Katzman78b37b02015-11-17 20:28:07 +00009479 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9480 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009481 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009482
Zachary Turner10d75b22014-10-22 20:40:43 +00009483 if (!llvm::sys::Process::GetEnv("LIB")) {
9484 // If the VC environment hasn't been configured (perhaps because the user
9485 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009486 // the environment variable is set however, assume the user knows what
9487 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009488 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009489 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009490 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9491 SmallString<128> LibDir(VisualStudioDir);
9492 llvm::sys::path::append(LibDir, "VC", "lib");
9493 switch (MSVC.getArch()) {
9494 case llvm::Triple::x86:
9495 // x86 just puts the libraries directly in lib
9496 break;
9497 case llvm::Triple::x86_64:
9498 llvm::sys::path::append(LibDir, "amd64");
9499 break;
9500 case llvm::Triple::arm:
9501 llvm::sys::path::append(LibDir, "arm");
9502 break;
9503 default:
9504 break;
9505 }
9506 CmdArgs.push_back(
9507 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009508
9509 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9510 std::string UniversalCRTLibPath;
9511 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9512 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9513 UniversalCRTLibPath.c_str()));
9514 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009515 }
9516
9517 std::string WindowsSdkLibPath;
9518 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9519 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9520 WindowsSdkLibPath.c_str()));
9521 }
9522
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009523 CmdArgs.push_back("-nologo");
9524
Reid Kleckner124955a2015-08-05 18:51:13 +00009525 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009526 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009528 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009529 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009530 if (DLL) {
9531 CmdArgs.push_back(Args.MakeArgString("-dll"));
9532
9533 SmallString<128> ImplibName(Output.getFilename());
9534 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009535 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009536 }
9537
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009538 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009539 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009540 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009541 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009542 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9543 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009544 // Make sure the dynamic runtime thunk is not optimized out at link time
9545 // to ensure proper SEH handling.
9546 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009547 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009548 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009549 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009550 for (const auto &Lib : {"asan", "asan_cxx"})
9551 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009552 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009553 }
9554
Hans Wennborg2e274592013-08-13 23:38:57 +00009555 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009556
Alexey Bataevc7e84352015-08-19 04:49:01 +00009557 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9558 options::OPT_fno_openmp, false)) {
9559 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9560 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9561 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9562 TC.getDriver().Dir + "/../lib"));
9563 switch (getOpenMPRuntime(getToolChain(), Args)) {
9564 case OMPRT_OMP:
9565 CmdArgs.push_back("-defaultlib:libomp.lib");
9566 break;
9567 case OMPRT_IOMP5:
9568 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9569 break;
9570 case OMPRT_GOMP:
9571 break;
9572 case OMPRT_Unknown:
9573 // Already diagnosed.
9574 break;
9575 }
9576 }
9577
Reid Kleckner337188f2014-09-16 19:22:00 +00009578 // Add filenames, libraries, and other linker inputs.
9579 for (const auto &Input : Inputs) {
9580 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009581 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009582 continue;
9583 }
9584
9585 const Arg &A = Input.getInputArg();
9586
9587 // Render -l options differently for the MSVC linker.
9588 if (A.getOption().matches(options::OPT_l)) {
9589 StringRef Lib = A.getValue();
9590 const char *LinkLibArg;
9591 if (Lib.endswith(".lib"))
9592 LinkLibArg = Args.MakeArgString(Lib);
9593 else
9594 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9595 CmdArgs.push_back(LinkLibArg);
9596 continue;
9597 }
9598
9599 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9600 // or -L. Render it, even if MSVC doesn't understand it.
9601 A.renderAsInput(Args, CmdArgs);
9602 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009603
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009604 TC.addProfileRTLibs(Args, CmdArgs);
9605
Zachary Turner719f58c2014-12-01 23:06:47 +00009606 // We need to special case some linker paths. In the case of lld, we need to
9607 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9608 // linker, we need to use a special search algorithm.
9609 llvm::SmallString<128> linkPath;
9610 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9611 if (Linker.equals_lower("lld"))
9612 Linker = "lld-link";
9613
9614 if (Linker.equals_lower("link")) {
9615 // If we're using the MSVC linker, it's not sufficient to just use link
9616 // from the program PATH, because other environments like GnuWin32 install
9617 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009618 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009619 C.getDriver().getClangProgramPath());
9620 } else {
9621 linkPath = Linker;
9622 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009623 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009624 }
9625
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009626 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009627 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009628}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009629
Douglas Katzman95354292015-06-23 20:42:09 +00009630void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9631 const InputInfo &Output,
9632 const InputInfoList &Inputs,
9633 const ArgList &Args,
9634 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009635 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9636}
9637
Douglas Katzman95354292015-06-23 20:42:09 +00009638std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009639 Compilation &C, const JobAction &JA, const InputInfo &Output,
9640 const InputInfoList &Inputs, const ArgList &Args,
9641 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009642 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009643 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009644 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009645 CmdArgs.push_back("/W0"); // No warnings.
9646
9647 // The goal is to be able to invoke this tool correctly based on
9648 // any flag accepted by clang-cl.
9649
9650 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009651 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009652
9653 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009654 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9655 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9656 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009657 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9658 if (A->getOption().getID() == options::OPT_O0) {
9659 CmdArgs.push_back("/Od");
9660 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009661 CmdArgs.push_back("/Og");
9662
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009663 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009664 if (OptLevel == "s" || OptLevel == "z")
9665 CmdArgs.push_back("/Os");
9666 else
9667 CmdArgs.push_back("/Ot");
9668
9669 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009670 }
9671 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009672 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9673 options::OPT_fno_omit_frame_pointer))
9674 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9675 ? "/Oy"
9676 : "/Oy-");
9677 if (!Args.hasArg(options::OPT_fwritable_strings))
9678 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009679
Nico Weber3f8dafb2015-03-12 19:37:10 +00009680 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009681 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9682
David Majnemerf6072342014-07-01 22:24:56 +00009683 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9684 /*default=*/false))
9685 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009686 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9687 options::OPT_fno_function_sections))
9688 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9689 ? "/Gy"
9690 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009691 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9692 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009693 CmdArgs.push_back(
9694 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009695 if (Args.hasArg(options::OPT_fsyntax_only))
9696 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009697 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9698 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009699 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009700
Nico Weber3f8dafb2015-03-12 19:37:10 +00009701 std::vector<std::string> Includes =
9702 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009703 for (const auto &Include : Includes)
9704 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009705
Hans Wennborg87cfa712013-09-19 20:32:16 +00009706 // Flags that can simply be passed through.
9707 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9708 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009709 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009710 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009711
9712 // The order of these flags is relevant, so pick the last one.
9713 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9714 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9715 A->render(Args, CmdArgs);
9716
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009717 // Pass through all unknown arguments so that the fallback command can see
9718 // them too.
9719 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9720
Hans Wennborg87cfa712013-09-19 20:32:16 +00009721 // Input filename.
9722 assert(Inputs.size() == 1);
9723 const InputInfo &II = Inputs[0];
9724 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9725 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9726 if (II.isFilename())
9727 CmdArgs.push_back(II.getFilename());
9728 else
9729 II.getInputArg().renderAsInput(Args, CmdArgs);
9730
9731 // Output filename.
9732 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009733 const char *Fo =
9734 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009735 CmdArgs.push_back(Fo);
9736
Hans Wennborg188382e2013-09-20 18:16:35 +00009737 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009738 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9739 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009740 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009741 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009742}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009743
Yaron Keren1c0070c2015-07-02 04:45:27 +00009744/// MinGW Tools
9745void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9746 const InputInfo &Output,
9747 const InputInfoList &Inputs,
9748 const ArgList &Args,
9749 const char *LinkingOutput) const {
9750 claimNoWarnArgs(Args);
9751 ArgStringList CmdArgs;
9752
9753 if (getToolChain().getArch() == llvm::Triple::x86) {
9754 CmdArgs.push_back("--32");
9755 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9756 CmdArgs.push_back("--64");
9757 }
9758
9759 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9760
9761 CmdArgs.push_back("-o");
9762 CmdArgs.push_back(Output.getFilename());
9763
9764 for (const auto &II : Inputs)
9765 CmdArgs.push_back(II.getFilename());
9766
9767 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009768 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009769
9770 if (Args.hasArg(options::OPT_gsplit_dwarf))
9771 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9772 SplitDebugName(Args, Inputs[0]));
9773}
9774
9775void MinGW::Linker::AddLibGCC(const ArgList &Args,
9776 ArgStringList &CmdArgs) const {
9777 if (Args.hasArg(options::OPT_mthreads))
9778 CmdArgs.push_back("-lmingwthrd");
9779 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009780
Yaron Kerenaa281332015-08-09 00:24:07 +00009781 // Make use of compiler-rt if --rtlib option is used
9782 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9783 if (RLT == ToolChain::RLT_Libgcc) {
9784 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9785 Args.hasArg(options::OPT_static);
9786 bool Shared = Args.hasArg(options::OPT_shared);
9787 bool CXX = getToolChain().getDriver().CCCIsCXX();
9788
9789 if (Static || (!CXX && !Shared)) {
9790 CmdArgs.push_back("-lgcc");
9791 CmdArgs.push_back("-lgcc_eh");
9792 } else {
9793 CmdArgs.push_back("-lgcc_s");
9794 CmdArgs.push_back("-lgcc");
9795 }
9796 } else {
9797 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9798 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009799
Yaron Keren1c0070c2015-07-02 04:45:27 +00009800 CmdArgs.push_back("-lmoldname");
9801 CmdArgs.push_back("-lmingwex");
9802 CmdArgs.push_back("-lmsvcrt");
9803}
9804
9805void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9806 const InputInfo &Output,
9807 const InputInfoList &Inputs,
9808 const ArgList &Args,
9809 const char *LinkingOutput) const {
9810 const ToolChain &TC = getToolChain();
9811 const Driver &D = TC.getDriver();
9812 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9813
9814 ArgStringList CmdArgs;
9815
9816 // Silence warning for "clang -g foo.o -o foo"
9817 Args.ClaimAllArgs(options::OPT_g_Group);
9818 // and "clang -emit-llvm foo.o -o foo"
9819 Args.ClaimAllArgs(options::OPT_emit_llvm);
9820 // and for "clang -w foo.o -o foo". Other warning options are already
9821 // handled somewhere else.
9822 Args.ClaimAllArgs(options::OPT_w);
9823
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009824 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9825 if (LinkerName.equals_lower("lld")) {
9826 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009827 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009828 } else if (!LinkerName.equals_lower("ld")) {
9829 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009830 }
9831
Yaron Keren1c0070c2015-07-02 04:45:27 +00009832 if (!D.SysRoot.empty())
9833 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9834
9835 if (Args.hasArg(options::OPT_s))
9836 CmdArgs.push_back("-s");
9837
9838 CmdArgs.push_back("-m");
9839 if (TC.getArch() == llvm::Triple::x86)
9840 CmdArgs.push_back("i386pe");
9841 if (TC.getArch() == llvm::Triple::x86_64)
9842 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009843 if (TC.getArch() == llvm::Triple::arm)
9844 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009845
9846 if (Args.hasArg(options::OPT_mwindows)) {
9847 CmdArgs.push_back("--subsystem");
9848 CmdArgs.push_back("windows");
9849 } else if (Args.hasArg(options::OPT_mconsole)) {
9850 CmdArgs.push_back("--subsystem");
9851 CmdArgs.push_back("console");
9852 }
9853
9854 if (Args.hasArg(options::OPT_static))
9855 CmdArgs.push_back("-Bstatic");
9856 else {
9857 if (Args.hasArg(options::OPT_mdll))
9858 CmdArgs.push_back("--dll");
9859 else if (Args.hasArg(options::OPT_shared))
9860 CmdArgs.push_back("--shared");
9861 CmdArgs.push_back("-Bdynamic");
9862 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9863 CmdArgs.push_back("-e");
9864 if (TC.getArch() == llvm::Triple::x86)
9865 CmdArgs.push_back("_DllMainCRTStartup@12");
9866 else
9867 CmdArgs.push_back("DllMainCRTStartup");
9868 CmdArgs.push_back("--enable-auto-image-base");
9869 }
9870 }
9871
9872 CmdArgs.push_back("-o");
9873 CmdArgs.push_back(Output.getFilename());
9874
9875 Args.AddAllArgs(CmdArgs, options::OPT_e);
9876 // FIXME: add -N, -n flags
9877 Args.AddLastArg(CmdArgs, options::OPT_r);
9878 Args.AddLastArg(CmdArgs, options::OPT_s);
9879 Args.AddLastArg(CmdArgs, options::OPT_t);
9880 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9881 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9882
Douglas Katzman78b37b02015-11-17 20:28:07 +00009883 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009884 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9885 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9886 } else {
9887 if (Args.hasArg(options::OPT_municode))
9888 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9889 else
9890 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9891 }
9892 if (Args.hasArg(options::OPT_pg))
9893 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9894 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9895 }
9896
9897 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009898 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009899 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9900
9901 // TODO: Add ASan stuff here
9902
9903 // TODO: Add profile stuff here
9904
Douglas Katzman78b37b02015-11-17 20:28:07 +00009905 if (D.CCCIsCXX() &&
9906 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009907 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9908 !Args.hasArg(options::OPT_static);
9909 if (OnlyLibstdcxxStatic)
9910 CmdArgs.push_back("-Bstatic");
9911 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9912 if (OnlyLibstdcxxStatic)
9913 CmdArgs.push_back("-Bdynamic");
9914 }
9915
9916 if (!Args.hasArg(options::OPT_nostdlib)) {
9917 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9918 if (Args.hasArg(options::OPT_static))
9919 CmdArgs.push_back("--start-group");
9920
9921 if (Args.hasArg(options::OPT_fstack_protector) ||
9922 Args.hasArg(options::OPT_fstack_protector_strong) ||
9923 Args.hasArg(options::OPT_fstack_protector_all)) {
9924 CmdArgs.push_back("-lssp_nonshared");
9925 CmdArgs.push_back("-lssp");
9926 }
9927 if (Args.hasArg(options::OPT_fopenmp))
9928 CmdArgs.push_back("-lgomp");
9929
9930 AddLibGCC(Args, CmdArgs);
9931
9932 if (Args.hasArg(options::OPT_pg))
9933 CmdArgs.push_back("-lgmon");
9934
Yaron Kerenadce68e2015-07-06 18:52:19 +00009935 if (Args.hasArg(options::OPT_pthread))
9936 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009937
9938 // add system libraries
9939 if (Args.hasArg(options::OPT_mwindows)) {
9940 CmdArgs.push_back("-lgdi32");
9941 CmdArgs.push_back("-lcomdlg32");
9942 }
9943 CmdArgs.push_back("-ladvapi32");
9944 CmdArgs.push_back("-lshell32");
9945 CmdArgs.push_back("-luser32");
9946 CmdArgs.push_back("-lkernel32");
9947
9948 if (Args.hasArg(options::OPT_static))
9949 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009950 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009951 AddLibGCC(Args, CmdArgs);
9952 }
9953
9954 if (!Args.hasArg(options::OPT_nostartfiles)) {
9955 // Add crtfastmath.o if available and fast math is enabled.
9956 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9957
9958 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9959 }
9960 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009961 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009962 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009963}
9964
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009965/// XCore Tools
9966// We pass assemble and link construction to the xcc tool.
9967
Douglas Katzman95354292015-06-23 20:42:09 +00009968void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9969 const InputInfo &Output,
9970 const InputInfoList &Inputs,
9971 const ArgList &Args,
9972 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009973 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009974 ArgStringList CmdArgs;
9975
9976 CmdArgs.push_back("-o");
9977 CmdArgs.push_back(Output.getFilename());
9978
9979 CmdArgs.push_back("-c");
9980
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009981 if (Args.hasArg(options::OPT_v))
9982 CmdArgs.push_back("-v");
9983
Robert Lytton894d25c2014-05-02 09:33:25 +00009984 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9985 if (!A->getOption().matches(options::OPT_g0))
9986 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009987
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009988 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9989 false))
9990 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009992 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009993
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009994 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009995 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009996
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009997 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009998 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009999}
10000
Douglas Katzman95354292015-06-23 20:42:09 +000010001void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10002 const InputInfo &Output,
10003 const InputInfoList &Inputs,
10004 const ArgList &Args,
10005 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010006 ArgStringList CmdArgs;
10007
10008 if (Output.isFilename()) {
10009 CmdArgs.push_back("-o");
10010 CmdArgs.push_back(Output.getFilename());
10011 } else {
10012 assert(Output.isNothing() && "Invalid output.");
10013 }
10014
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010015 if (Args.hasArg(options::OPT_v))
10016 CmdArgs.push_back("-v");
10017
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010018 // Pass -fexceptions through to the linker if it was present.
10019 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10020 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010021 CmdArgs.push_back("-fexceptions");
10022
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10024
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010025 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010026 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010027}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010028
Douglas Katzman95354292015-06-23 20:42:09 +000010029void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10030 const InputInfo &Output,
10031 const InputInfoList &Inputs,
10032 const ArgList &Args,
10033 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010034 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010035 const auto &TC =
10036 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10037 ArgStringList CmdArgs;
10038 const char *Exec;
10039
10040 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010041 default:
10042 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010043 case llvm::Triple::arm:
10044 case llvm::Triple::thumb:
10045 break;
10046 case llvm::Triple::x86:
10047 CmdArgs.push_back("--32");
10048 break;
10049 case llvm::Triple::x86_64:
10050 CmdArgs.push_back("--64");
10051 break;
10052 }
10053
10054 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10055
10056 CmdArgs.push_back("-o");
10057 CmdArgs.push_back(Output.getFilename());
10058
10059 for (const auto &Input : Inputs)
10060 CmdArgs.push_back(Input.getFilename());
10061
10062 const std::string Assembler = TC.GetProgramPath("as");
10063 Exec = Args.MakeArgString(Assembler);
10064
Justin Bognerd3371d82015-07-17 03:35:54 +000010065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010066}
10067
Douglas Katzman95354292015-06-23 20:42:09 +000010068void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10069 const InputInfo &Output,
10070 const InputInfoList &Inputs,
10071 const ArgList &Args,
10072 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010073 const auto &TC =
10074 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10075 const llvm::Triple &T = TC.getTriple();
10076 const Driver &D = TC.getDriver();
10077 SmallString<128> EntryPoint;
10078 ArgStringList CmdArgs;
10079 const char *Exec;
10080
10081 // Silence warning for "clang -g foo.o -o foo"
10082 Args.ClaimAllArgs(options::OPT_g_Group);
10083 // and "clang -emit-llvm foo.o -o foo"
10084 Args.ClaimAllArgs(options::OPT_emit_llvm);
10085 // and for "clang -w foo.o -o foo"
10086 Args.ClaimAllArgs(options::OPT_w);
10087 // Other warning options are already handled somewhere else.
10088
10089 if (!D.SysRoot.empty())
10090 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10091
10092 if (Args.hasArg(options::OPT_pie))
10093 CmdArgs.push_back("-pie");
10094 if (Args.hasArg(options::OPT_rdynamic))
10095 CmdArgs.push_back("-export-dynamic");
10096 if (Args.hasArg(options::OPT_s))
10097 CmdArgs.push_back("--strip-all");
10098
10099 CmdArgs.push_back("-m");
10100 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010101 default:
10102 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010103 case llvm::Triple::arm:
10104 case llvm::Triple::thumb:
10105 // FIXME: this is incorrect for WinCE
10106 CmdArgs.push_back("thumb2pe");
10107 break;
10108 case llvm::Triple::x86:
10109 CmdArgs.push_back("i386pe");
10110 EntryPoint.append("_");
10111 break;
10112 case llvm::Triple::x86_64:
10113 CmdArgs.push_back("i386pep");
10114 break;
10115 }
10116
10117 if (Args.hasArg(options::OPT_shared)) {
10118 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010119 default:
10120 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010121 case llvm::Triple::arm:
10122 case llvm::Triple::thumb:
10123 case llvm::Triple::x86_64:
10124 EntryPoint.append("_DllMainCRTStartup");
10125 break;
10126 case llvm::Triple::x86:
10127 EntryPoint.append("_DllMainCRTStartup@12");
10128 break;
10129 }
10130
10131 CmdArgs.push_back("-shared");
10132 CmdArgs.push_back("-Bdynamic");
10133
10134 CmdArgs.push_back("--enable-auto-image-base");
10135
10136 CmdArgs.push_back("--entry");
10137 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10138 } else {
10139 EntryPoint.append("mainCRTStartup");
10140
10141 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10142 : "-Bdynamic");
10143
Douglas Katzman78b37b02015-11-17 20:28:07 +000010144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010145 CmdArgs.push_back("--entry");
10146 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10147 }
10148
10149 // FIXME: handle subsystem
10150 }
10151
10152 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010153 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010154
10155 CmdArgs.push_back("-o");
10156 CmdArgs.push_back(Output.getFilename());
10157
10158 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10159 SmallString<261> ImpLib(Output.getFilename());
10160 llvm::sys::path::replace_extension(ImpLib, ".lib");
10161
10162 CmdArgs.push_back("--out-implib");
10163 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10164 }
10165
Douglas Katzman78b37b02015-11-17 20:28:07 +000010166 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010167 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10168 const char *CRTBegin;
10169
10170 CRTBegin =
10171 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10172 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10173 }
10174
10175 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010176 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010177 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10178
10179 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10180 !Args.hasArg(options::OPT_nodefaultlibs)) {
10181 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10182 !Args.hasArg(options::OPT_static);
10183 if (StaticCXX)
10184 CmdArgs.push_back("-Bstatic");
10185 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10186 if (StaticCXX)
10187 CmdArgs.push_back("-Bdynamic");
10188 }
10189
10190 if (!Args.hasArg(options::OPT_nostdlib)) {
10191 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10192 // TODO handle /MT[d] /MD[d]
10193 CmdArgs.push_back("-lmsvcrt");
10194 AddRunTimeLibs(TC, D, CmdArgs, Args);
10195 }
10196 }
10197
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010198 if (TC.getSanitizerArgs().needsAsanRt()) {
10199 // TODO handle /MT[d] /MD[d]
10200 if (Args.hasArg(options::OPT_shared)) {
10201 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10202 } else {
10203 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10204 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10205 // Make sure the dynamic runtime thunk is not optimized out at link time
10206 // to ensure proper SEH handling.
10207 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10208 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10209 ? "___asan_seh_interceptor"
10210 : "__asan_seh_interceptor"));
10211 }
10212 }
10213
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010214 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010215
Justin Bognerd3371d82015-07-17 03:35:54 +000010216 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010217}
Douglas Katzman84a75642015-06-19 14:55:19 +000010218
Douglas Katzman95354292015-06-23 20:42:09 +000010219void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10220 const InputInfo &Output,
10221 const InputInfoList &Inputs,
10222 const ArgList &Args,
10223 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010224 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010225 assert(Inputs.size() == 1);
10226 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010227 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10228 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010229
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010230 if (JA.getKind() == Action::PreprocessJobClass) {
10231 Args.ClaimAllArgs();
10232 CmdArgs.push_back("-E");
10233 } else {
10234 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10235 CmdArgs.push_back("-S");
10236 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10237 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010238 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010239 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010240
Douglas Katzmanf6071112015-08-03 14:34:22 +000010241 // Append all -I, -iquote, -isystem paths, defines/undefines,
10242 // 'f' flags, optimize flags, and warning options.
10243 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010244 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010245 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010246 options::OPT_f_Group, options::OPT_f_clang_Group,
10247 options::OPT_g_Group, options::OPT_M_Group,
10248 options::OPT_O_Group, options::OPT_W_Group});
10249
10250 // If we're producing a dependency file, and assembly is the final action,
10251 // then the name of the target in the dependency file should be the '.o'
10252 // file, not the '.s' file produced by this step. For example, instead of
10253 // /tmp/mumble.s: mumble.c .../someheader.h
10254 // the filename on the lefthand side should be "mumble.o"
10255 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10256 C.getActions().size() == 1 &&
10257 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10258 Arg *A = Args.getLastArg(options::OPT_o);
10259 if (A) {
10260 CmdArgs.push_back("-MT");
10261 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10262 }
10263 }
10264
Douglas Katzman84a75642015-06-19 14:55:19 +000010265 CmdArgs.push_back(II.getFilename());
10266 CmdArgs.push_back("-o");
10267 CmdArgs.push_back(Output.getFilename());
10268
10269 std::string Exec =
10270 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010271 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10272 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010273}
10274
Douglas Katzman95354292015-06-23 20:42:09 +000010275void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10276 const InputInfo &Output,
10277 const InputInfoList &Inputs,
10278 const ArgList &Args,
10279 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010280 ArgStringList CmdArgs;
10281
10282 assert(Inputs.size() == 1);
10283 const InputInfo &II = Inputs[0];
10284 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10285 assert(Output.getType() == types::TY_Object);
10286
10287 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010288 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010289 CmdArgs.push_back("-noSPrefixing");
10290 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010291 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10292 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10293 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010294 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010295 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010296 }
10297 CmdArgs.push_back("-elf"); // Output format.
10298 CmdArgs.push_back(II.getFilename());
10299 CmdArgs.push_back(
10300 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10301
10302 std::string Exec =
10303 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010304 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10305 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010306}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010307
10308void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10309 const InputInfo &Output,
10310 const InputInfoList &Inputs,
10311 const ArgList &Args,
10312 const char *LinkingOutput) const {
10313 const auto &TC =
10314 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10315 const llvm::Triple &T = TC.getTriple();
10316 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010317 bool UseStartfiles =
10318 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010319 bool UseDefaultLibs =
10320 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010321
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010322 if (T.getArch() == llvm::Triple::sparc)
10323 CmdArgs.push_back("-EB");
10324 else // SHAVE assumes little-endian, and sparcel is expressly so.
10325 CmdArgs.push_back("-EL");
10326
10327 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10328 // but we never pass through a --sysroot option and various other bits.
10329 // For example, there are no sanitizers (yet) nor gold linker.
10330
10331 // Eat some arguments that may be present but have no effect.
10332 Args.ClaimAllArgs(options::OPT_g_Group);
10333 Args.ClaimAllArgs(options::OPT_w);
10334 Args.ClaimAllArgs(options::OPT_static_libgcc);
10335
10336 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10337 CmdArgs.push_back("-s");
10338
10339 CmdArgs.push_back("-o");
10340 CmdArgs.push_back(Output.getFilename());
10341
10342 if (UseStartfiles) {
10343 // If you want startfiles, it means you want the builtin crti and crtbegin,
10344 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010345 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10346 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010347 }
10348
10349 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10350 options::OPT_e, options::OPT_s, options::OPT_t,
10351 options::OPT_Z_Flag, options::OPT_r});
10352
Douglas Katzman674a3122015-11-18 16:24:46 +000010353 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010354
10355 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10356
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010357 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010358 if (C.getDriver().CCCIsCXX())
10359 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010360 if (T.getOS() == llvm::Triple::RTEMS) {
10361 CmdArgs.push_back("--start-group");
10362 CmdArgs.push_back("-lc");
10363 // You must provide your own "-L" option to enable finding these.
10364 CmdArgs.push_back("-lrtemscpu");
10365 CmdArgs.push_back("-lrtemsbsp");
10366 CmdArgs.push_back("--end-group");
10367 } else {
10368 CmdArgs.push_back("-lc");
10369 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010370 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010371 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010372 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010373 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10374 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010375 }
10376
10377 std::string Exec =
10378 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10379 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10380 CmdArgs, Inputs));
10381}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010382
10383void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10384 const InputInfo &Output,
10385 const InputInfoList &Inputs,
10386 const ArgList &Args,
10387 const char *LinkingOutput) const {
10388 claimNoWarnArgs(Args);
10389 ArgStringList CmdArgs;
10390
10391 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10392
10393 CmdArgs.push_back("-o");
10394 CmdArgs.push_back(Output.getFilename());
10395
10396 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10397 const InputInfo &Input = Inputs[0];
10398 assert(Input.isFilename() && "Invalid input.");
10399 CmdArgs.push_back(Input.getFilename());
10400
10401 const char *Exec =
10402 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10403 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10404}
10405
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010406static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10407 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10408 if (SanArgs.needsUbsanRt()) {
10409 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10410 }
10411 if (SanArgs.needsAsanRt()) {
10412 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10413 }
10414}
10415
10416static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10417 const JobAction &JA, const InputInfo &Output,
10418 const InputInfoList &Inputs,
10419 const ArgList &Args,
10420 const char *LinkingOutput) {
10421 const toolchains::FreeBSD &ToolChain =
10422 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10423 const Driver &D = ToolChain.getDriver();
10424 ArgStringList CmdArgs;
10425
10426 // Silence warning for "clang -g foo.o -o foo"
10427 Args.ClaimAllArgs(options::OPT_g_Group);
10428 // and "clang -emit-llvm foo.o -o foo"
10429 Args.ClaimAllArgs(options::OPT_emit_llvm);
10430 // and for "clang -w foo.o -o foo". Other warning options are already
10431 // handled somewhere else.
10432 Args.ClaimAllArgs(options::OPT_w);
10433
10434 if (!D.SysRoot.empty())
10435 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10436
10437 if (Args.hasArg(options::OPT_pie))
10438 CmdArgs.push_back("-pie");
10439
10440 if (Args.hasArg(options::OPT_rdynamic))
10441 CmdArgs.push_back("-export-dynamic");
10442 if (Args.hasArg(options::OPT_shared))
10443 CmdArgs.push_back("--oformat=so");
10444
10445 if (Output.isFilename()) {
10446 CmdArgs.push_back("-o");
10447 CmdArgs.push_back(Output.getFilename());
10448 } else {
10449 assert(Output.isNothing() && "Invalid output.");
10450 }
10451
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010452 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10453
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010454 Args.AddAllArgs(CmdArgs, options::OPT_L);
10455 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10456 Args.AddAllArgs(CmdArgs, options::OPT_e);
10457 Args.AddAllArgs(CmdArgs, options::OPT_s);
10458 Args.AddAllArgs(CmdArgs, options::OPT_t);
10459 Args.AddAllArgs(CmdArgs, options::OPT_r);
10460
10461 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10462 CmdArgs.push_back("--no-demangle");
10463
10464 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10465
10466 if (Args.hasArg(options::OPT_pthread)) {
10467 CmdArgs.push_back("-lpthread");
10468 }
10469
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010470 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10471
10472 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10473}
10474
10475static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10476 const JobAction &JA, const InputInfo &Output,
10477 const InputInfoList &Inputs,
10478 const ArgList &Args,
10479 const char *LinkingOutput) {
10480 const toolchains::FreeBSD &ToolChain =
10481 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10482 const Driver &D = ToolChain.getDriver();
10483 ArgStringList CmdArgs;
10484
10485 // Silence warning for "clang -g foo.o -o foo"
10486 Args.ClaimAllArgs(options::OPT_g_Group);
10487 // and "clang -emit-llvm foo.o -o foo"
10488 Args.ClaimAllArgs(options::OPT_emit_llvm);
10489 // and for "clang -w foo.o -o foo". Other warning options are already
10490 // handled somewhere else.
10491 Args.ClaimAllArgs(options::OPT_w);
10492
10493 if (!D.SysRoot.empty())
10494 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10495
10496 if (Args.hasArg(options::OPT_pie))
10497 CmdArgs.push_back("-pie");
10498
10499 if (Args.hasArg(options::OPT_static)) {
10500 CmdArgs.push_back("-Bstatic");
10501 } else {
10502 if (Args.hasArg(options::OPT_rdynamic))
10503 CmdArgs.push_back("-export-dynamic");
10504 CmdArgs.push_back("--eh-frame-hdr");
10505 if (Args.hasArg(options::OPT_shared)) {
10506 CmdArgs.push_back("-Bshareable");
10507 } else {
10508 CmdArgs.push_back("-dynamic-linker");
10509 CmdArgs.push_back("/libexec/ld-elf.so.1");
10510 }
10511 CmdArgs.push_back("--enable-new-dtags");
10512 }
10513
10514 if (Output.isFilename()) {
10515 CmdArgs.push_back("-o");
10516 CmdArgs.push_back(Output.getFilename());
10517 } else {
10518 assert(Output.isNothing() && "Invalid output.");
10519 }
10520
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010521 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10522
Douglas Katzman78b37b02015-11-17 20:28:07 +000010523 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010524 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010525 if (!Args.hasArg(options::OPT_shared)) {
10526 if (Args.hasArg(options::OPT_pg))
10527 crt1 = "gcrt1.o";
10528 else if (Args.hasArg(options::OPT_pie))
10529 crt1 = "Scrt1.o";
10530 else
10531 crt1 = "crt1.o";
10532 }
10533 if (crt1)
10534 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10535
10536 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10537
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010538 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010539 if (Args.hasArg(options::OPT_static))
10540 crtbegin = "crtbeginT.o";
10541 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10542 crtbegin = "crtbeginS.o";
10543 else
10544 crtbegin = "crtbegin.o";
10545
10546 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10547 }
10548
10549 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010550 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010551 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10552 Args.AddAllArgs(CmdArgs, options::OPT_e);
10553 Args.AddAllArgs(CmdArgs, options::OPT_s);
10554 Args.AddAllArgs(CmdArgs, options::OPT_t);
10555 Args.AddAllArgs(CmdArgs, options::OPT_r);
10556
10557 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10558 CmdArgs.push_back("--no-demangle");
10559
10560 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10561
Douglas Katzman78b37b02015-11-17 20:28:07 +000010562 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010563 // For PS4, we always want to pass libm, libstdc++ and libkernel
10564 // libraries for both C and C++ compilations.
10565 CmdArgs.push_back("-lkernel");
10566 if (D.CCCIsCXX()) {
10567 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10568 if (Args.hasArg(options::OPT_pg))
10569 CmdArgs.push_back("-lm_p");
10570 else
10571 CmdArgs.push_back("-lm");
10572 }
10573 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10574 // the default system libraries. Just mimic this for now.
10575 if (Args.hasArg(options::OPT_pg))
10576 CmdArgs.push_back("-lgcc_p");
10577 else
10578 CmdArgs.push_back("-lcompiler_rt");
10579 if (Args.hasArg(options::OPT_static)) {
10580 CmdArgs.push_back("-lstdc++");
10581 } else if (Args.hasArg(options::OPT_pg)) {
10582 CmdArgs.push_back("-lgcc_eh_p");
10583 } else {
10584 CmdArgs.push_back("--as-needed");
10585 CmdArgs.push_back("-lstdc++");
10586 CmdArgs.push_back("--no-as-needed");
10587 }
10588
10589 if (Args.hasArg(options::OPT_pthread)) {
10590 if (Args.hasArg(options::OPT_pg))
10591 CmdArgs.push_back("-lpthread_p");
10592 else
10593 CmdArgs.push_back("-lpthread");
10594 }
10595
10596 if (Args.hasArg(options::OPT_pg)) {
10597 if (Args.hasArg(options::OPT_shared))
10598 CmdArgs.push_back("-lc");
10599 else {
10600 if (Args.hasArg(options::OPT_static)) {
10601 CmdArgs.push_back("--start-group");
10602 CmdArgs.push_back("-lc_p");
10603 CmdArgs.push_back("-lpthread_p");
10604 CmdArgs.push_back("--end-group");
10605 } else {
10606 CmdArgs.push_back("-lc_p");
10607 }
10608 }
10609 CmdArgs.push_back("-lgcc_p");
10610 } else {
10611 if (Args.hasArg(options::OPT_static)) {
10612 CmdArgs.push_back("--start-group");
10613 CmdArgs.push_back("-lc");
10614 CmdArgs.push_back("-lpthread");
10615 CmdArgs.push_back("--end-group");
10616 } else {
10617 CmdArgs.push_back("-lc");
10618 }
10619 CmdArgs.push_back("-lcompiler_rt");
10620 }
10621
10622 if (Args.hasArg(options::OPT_static)) {
10623 CmdArgs.push_back("-lstdc++");
10624 } else if (Args.hasArg(options::OPT_pg)) {
10625 CmdArgs.push_back("-lgcc_eh_p");
10626 } else {
10627 CmdArgs.push_back("--as-needed");
10628 CmdArgs.push_back("-lstdc++");
10629 CmdArgs.push_back("--no-as-needed");
10630 }
10631 }
10632
Douglas Katzman78b37b02015-11-17 20:28:07 +000010633 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010634 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10635 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10636 else
10637 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10638 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10639 }
10640
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010641 const char *Exec =
10642#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010643 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010644#else
10645 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10646#endif
10647
10648 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10649}
10650
10651void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10652 const InputInfo &Output,
10653 const InputInfoList &Inputs,
10654 const ArgList &Args,
10655 const char *LinkingOutput) const {
10656 const toolchains::FreeBSD &ToolChain =
10657 static_cast<const toolchains::FreeBSD &>(getToolChain());
10658 const Driver &D = ToolChain.getDriver();
10659 bool PS4Linker;
10660 StringRef LinkerOptName;
10661 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10662 LinkerOptName = A->getValue();
10663 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10664 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10665 }
10666
10667 if (LinkerOptName == "gold")
10668 PS4Linker = false;
10669 else if (LinkerOptName == "ps4")
10670 PS4Linker = true;
10671 else
10672 PS4Linker = !Args.hasArg(options::OPT_shared);
10673
10674 if (PS4Linker)
10675 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10676 else
10677 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10678}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010679
10680void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10681 const InputInfo &Output,
10682 const InputInfoList &Inputs,
10683 const ArgList &Args,
10684 const char *LinkingOutput) const {
10685 const auto &TC =
10686 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010687 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010688
10689 std::vector<std::string> gpu_archs =
10690 Args.getAllArgValues(options::OPT_march_EQ);
10691 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10692 const std::string& gpu_arch = gpu_archs[0];
10693
10694
10695 ArgStringList CmdArgs;
10696 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
10697
Justin Lebar2836dcd2016-01-19 19:52:21 +000010698 // Map the -O we received to -O{0,1,2,3}.
10699 //
10700 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,
10701 // so it may correspond more closely to the spirit of clang -O2.
10702 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10703 // -O3 seems like the least-bad option when -Osomething is specified to
10704 // clang but it isn't handled below.
10705 StringRef OOpt = "3";
10706 if (A->getOption().matches(options::OPT_O4) ||
10707 A->getOption().matches(options::OPT_Ofast))
10708 OOpt = "3";
10709 else if (A->getOption().matches(options::OPT_O0))
10710 OOpt = "0";
10711 else if (A->getOption().matches(options::OPT_O)) {
10712 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10713 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10714 .Case("1", "1")
10715 .Case("2", "2")
10716 .Case("3", "3")
10717 .Case("s", "2")
10718 .Case("z", "2")
10719 .Default("2");
10720 }
10721 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10722 } else {
10723 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10724 // to no optimizations, but ptxas's default is -O3.
10725 CmdArgs.push_back("-O0");
10726 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010727
10728 // Don't bother passing -g to ptxas: It's enabled by default at -O0, and
10729 // not supported at other optimization levels.
10730
10731 CmdArgs.push_back("--gpu-name");
10732 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10733 CmdArgs.push_back("--output-file");
10734 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10735 for (const auto& II : Inputs)
10736 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10737
10738 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10739 CmdArgs.push_back(Args.MakeArgString(A));
10740
10741 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10742 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10743}
10744
10745// All inputs to this linker must be from CudaDeviceActions, as we need to look
10746// at the Inputs' Actions in order to figure out which GPU architecture they
10747// correspond to.
10748void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10749 const InputInfo &Output,
10750 const InputInfoList &Inputs,
10751 const ArgList &Args,
10752 const char *LinkingOutput) const {
10753 const auto &TC =
10754 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010755 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010756
10757 ArgStringList CmdArgs;
10758 CmdArgs.push_back("--cuda");
10759 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10760 CmdArgs.push_back(Args.MakeArgString("--create"));
10761 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10762
10763 for (const auto& II : Inputs) {
10764 auto* A = cast<const CudaDeviceAction>(II.getAction());
10765 // We need to pass an Arch of the form "sm_XX" for cubin files and
10766 // "compute_XX" for ptx.
10767 const char *Arch = (II.getType() == types::TY_PP_Asm)
10768 ? A->getComputeArchName()
10769 : A->getGpuArchName();
10770 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10771 Arch + ",file=" + II.getFilename()));
10772 }
10773
10774 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10775 CmdArgs.push_back(Args.MakeArgString(A));
10776
10777 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10779}