blob: 5852ac1b2e2610133b98e882e31c606b66566098 [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")
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +000099 .Case("leon2", "-Av8")
100 .Case("at697e", "-Av8")
101 .Case("at697f", "-Av8")
102 .Case("leon3", "-Av8")
103 .Case("ut699", "-Av8")
104 .Case("gr712rc", "-Av8")
105 .Case("leon4", "-Av8")
106 .Case("gr740", "-Av8")
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +0000107 .Default("-Av8");
108 }
109}
110
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000111/// CheckPreprocessingOptions - Perform some validation of preprocessing
112/// arguments that is shared with gcc.
113static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000114 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
115 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
116 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000117 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000118 << A->getBaseArg().getAsString(Args)
119 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
120 }
121 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000122}
123
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000124/// CheckCodeGenerationOptions - Perform some validation of code generation
125/// arguments that is shared with gcc.
126static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
127 // In gcc, only ARM checks this, but it seems reasonable to check universally.
128 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000129 if (const Arg *A =
130 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
131 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
132 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000133}
134
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000135// Add backslashes to escape spaces and other backslashes.
136// This is used for the space-separated argument list specified with
137// the -dwarf-debug-flags option.
138static void EscapeSpacesAndBackslashes(const char *Arg,
139 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000140 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000141 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000142 default:
143 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000144 case ' ':
145 case '\\':
146 Res.push_back('\\');
147 break;
148 }
149 Res.push_back(*Arg);
150 }
151}
152
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000153// Quote target names for inclusion in GNU Make dependency files.
154// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000155static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000156 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
157 switch (Target[i]) {
158 case ' ':
159 case '\t':
160 // Escape the preceding backslashes
161 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
162 Res.push_back('\\');
163
164 // Escape the space/tab
165 Res.push_back('\\');
166 break;
167 case '$':
168 Res.push_back('$');
169 break;
170 case '#':
171 Res.push_back('\\');
172 break;
173 default:
174 break;
175 }
176
177 Res.push_back(Target[i]);
178 }
179}
180
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000181static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
182 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000183 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 bool CombinedArg = false;
185
Bill Wendling281ca292012-03-12 21:22:35 +0000186 if (!DirList)
187 return; // Nothing to do.
188
Chad Rosier616e8a52012-10-30 21:42:09 +0000189 StringRef Name(ArgName);
190 if (Name.equals("-I") || Name.equals("-L"))
191 CombinedArg = true;
192
Bill Wendling281ca292012-03-12 21:22:35 +0000193 StringRef Dirs(DirList);
194 if (Dirs.empty()) // Empty string should not add '.'.
195 return;
196
197 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000198 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000199 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(".");
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000207 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000208 CmdArgs.push_back(
209 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000210 } else {
211 CmdArgs.push_back(ArgName);
212 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
213 }
Bill Wendling281ca292012-03-12 21:22:35 +0000214 }
Nico Weber89355782012-03-19 15:00:03 +0000215 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000216 }
217
218 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000219 if (CombinedArg) {
220 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
221 } else {
222 CmdArgs.push_back(ArgName);
223 CmdArgs.push_back(".");
224 }
Bill Wendling281ca292012-03-12 21:22:35 +0000225 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000226 if (CombinedArg) {
227 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
228 } else {
229 CmdArgs.push_back(ArgName);
230 CmdArgs.push_back(Args.MakeArgString(Dirs));
231 }
Bill Wendling281ca292012-03-12 21:22:35 +0000232 }
233}
234
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000235static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
236 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 const Driver &D = TC.getDriver();
238
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000239 // Add extra linker input arguments which are not treated as inputs
240 // (constructed via -Xarch_).
241 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
242
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000243 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000244 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000245 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000246 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000247
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000248 // Add filenames immediately.
249 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000250 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000251 continue;
252 }
253
254 // Otherwise, this is a linker input argument.
255 const Arg &A = II.getInputArg();
256
257 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000258 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000259 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000260 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000261 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000262 else if (A.getOption().matches(options::OPT_z)) {
263 // Pass -z prefix for gcc linker compatibility.
264 A.claim();
265 A.render(Args, CmdArgs);
266 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000267 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000268 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000269 }
Bill Wendling281ca292012-03-12 21:22:35 +0000270
271 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000272 // and only supported on native toolchains.
273 if (!TC.isCrossCompiling())
274 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000275}
276
John McCall31168b02011-06-15 23:02:42 +0000277/// \brief Determine whether Objective-C automated reference counting is
278/// enabled.
279static bool isObjCAutoRefCount(const ArgList &Args) {
280 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
281}
282
Ted Kremeneke65b0862012-03-06 20:05:56 +0000283/// \brief Determine whether we are linking the ObjC runtime.
284static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000285 if (isObjCAutoRefCount(Args)) {
286 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000287 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000288 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000289 return Args.hasArg(options::OPT_fobjc_link_runtime);
290}
291
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000292static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000293 // Don't forward inputs from the original command line. They are added from
294 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000295 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000296 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000297}
298
Samuel Antao6ad11702016-07-27 22:46:31 +0000299/// Apply \a Work on the current tool chain \a RegularToolChain and any other
300/// offloading tool chain that is associated with the current action \a JA.
301static void
302forAllAssociatedToolChains(Compilation &C, const JobAction &JA,
303 const ToolChain &RegularToolChain,
304 llvm::function_ref<void(const ToolChain &)> Work) {
305 // Apply Work on the current/regular tool chain.
306 Work(RegularToolChain);
Samuel Antaod06239d2016-07-15 23:13:27 +0000307
Samuel Antao6ad11702016-07-27 22:46:31 +0000308 // Apply Work on all the offloading tool chains associated with the current
309 // action.
Samuel Antaod06239d2016-07-15 23:13:27 +0000310 if (JA.isHostOffloading(Action::OFK_Cuda))
Samuel Antao6ad11702016-07-27 22:46:31 +0000311 Work(*C.getSingleOffloadToolChain<Action::OFK_Cuda>());
Samuel Antao102c1822016-07-28 22:42:42 +0000312 else if (JA.isDeviceOffloading(Action::OFK_Cuda))
313 Work(*C.getSingleOffloadToolChain<Action::OFK_Host>());
Samuel Antaod06239d2016-07-15 23:13:27 +0000314
Samuel Antao6ad11702016-07-27 22:46:31 +0000315 //
316 // TODO: Add support for other offloading programming models here.
317 //
Samuel Antaod06239d2016-07-15 23:13:27 +0000318}
319
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000320void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
321 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322 ArgStringList &CmdArgs,
323 const InputInfo &Output,
Samuel Antaod06239d2016-07-15 23:13:27 +0000324 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000325 Arg *A;
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000326 const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000327
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000328 CheckPreprocessingOptions(D, Args);
329
330 Args.AddLastArg(CmdArgs, options::OPT_C);
331 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000332
333 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000334 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000335 (A = Args.getLastArg(options::OPT_MD)) ||
336 (A = Args.getLastArg(options::OPT_MMD))) {
337 // Determine the output location.
338 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000339 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000340 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000341 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000342 } else if (Output.getType() == types::TY_Dependencies) {
343 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000344 } else if (A->getOption().matches(options::OPT_M) ||
345 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 DepFile = "-";
347 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000348 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000349 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 }
351 CmdArgs.push_back("-dependency-file");
352 CmdArgs.push_back(DepFile);
353
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000354 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
356 const char *DepTarget;
357
358 // If user provided -o, that is the dependency target, except
359 // when we are only generating a dependency file.
360 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
361 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000362 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 } else {
364 // Otherwise derive from the base input.
365 //
366 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000367 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000368 llvm::sys::path::replace_extension(P, "o");
369 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000370 }
371
372 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000373 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000374 QuoteTarget(DepTarget, Quoted);
375 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000376 }
377
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000378 if (A->getOption().matches(options::OPT_M) ||
379 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000381 if ((isa<PrecompileJobAction>(JA) &&
382 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
383 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000384 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000385 }
386
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000387 if (Args.hasArg(options::OPT_MG)) {
388 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000389 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000390 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000391 CmdArgs.push_back("-MG");
392 }
393
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000395 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000396
397 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000398 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000399 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000400
Daniel Dunbara442fd52010-06-11 22:00:13 +0000401 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000402 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000403 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000404 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000405 CmdArgs.push_back(Args.MakeArgString(Quoted));
406
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000407 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000408 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000409 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000410 }
411 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000412
Justin Lebar9421ba62016-08-15 20:38:52 +0000413 // Add offload include arguments specific for CUDA. This must happen before
414 // we -I or -include anything else, because we must pick up the CUDA headers
415 // from the particular CUDA installation, rather than from e.g.
416 // /usr/local/include.
417 if (JA.isOffloading(Action::OFK_Cuda))
418 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
419
Douglas Gregor111af7d2009-04-18 00:34:01 +0000420 // Add -i* options, and automatically translate to
421 // -include-pch/-include-pth for transparent PCH support. It's
422 // wonky, but we include looking for .gch so we can support seamless
423 // replacement into a build system already set up to be generating
424 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000425 int YcIndex = -1, YuIndex = -1;
426 {
427 int AI = -1;
428 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
429 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
430 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
431 // Walk the whole i_Group and skip non "-include" flags so that the index
432 // here matches the index in the next loop below.
433 ++AI;
434 if (!A->getOption().matches(options::OPT_include))
435 continue;
436 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
437 YcIndex = AI;
438 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
439 YuIndex = AI;
440 }
441 }
442 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
443 Driver::InputList Inputs;
444 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
445 assert(Inputs.size() == 1 && "Need one input when building pch");
446 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
447 Inputs[0].second->getValue()));
448 }
449
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000450 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000451 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000452 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000453 ++AI;
454
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000455 if (getToolChain().getDriver().IsCLMode() &&
456 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000457 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000458 // include is compiled into foo.h, and everything after goes into
459 // the .obj file. /Yufoo.h means that all includes prior to and including
460 // foo.h are completely skipped and replaced with a use of the pch file
461 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
462 // just mean that the last one wins.) If /Yc and /Yu are both present
463 // and refer to the same file, /Yc wins.
464 // Note that OPT__SLASH_FI gets mapped to OPT_include.
465 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
466 // cl.exe seems to support both flags with different values, but that
467 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000468 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000469 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
470 if (PchIndex != -1) {
471 if (isa<PrecompileJobAction>(JA)) {
472 // When building the pch, skip all includes after the pch.
473 assert(YcIndex != -1 && PchIndex == YcIndex);
474 if (AI >= YcIndex)
475 continue;
476 } else {
477 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000478 if (AI < PchIndex) {
479 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000480 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000481 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000482 if (AI == PchIndex) {
483 A->claim();
484 CmdArgs.push_back("-include-pch");
485 CmdArgs.push_back(
486 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
487 continue;
488 }
489 }
490 }
491 } else if (A->getOption().matches(options::OPT_include)) {
492 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000493 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
494 RenderedImplicitInclude = true;
495
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000496 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000497 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000498
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000499 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000500 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000501 SmallString<128> P(A->getValue());
502 // We want the files to have a name like foo.h.pch. Add a dummy extension
503 // so that replace_extension does the right thing.
504 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000505 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000506 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000507 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000508 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000509 }
510
Douglas Gregor111af7d2009-04-18 00:34:01 +0000511 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000512 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000513 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000514 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000515 }
516
Douglas Gregor111af7d2009-04-18 00:34:01 +0000517 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000518 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000519 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000520 FoundPCH = UsePCH;
521 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000522 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000523 }
524
525 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000526 if (IsFirstImplicitInclude) {
527 A->claim();
528 if (UsePCH)
529 CmdArgs.push_back("-include-pch");
530 else
531 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000532 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000533 continue;
534 } else {
535 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000536 D.Diag(diag::warn_drv_pch_not_first_include) << P
537 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000538 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000539 }
Saleem Abdulrasool88879e62016-06-17 17:23:16 +0000540 } else if (A->getOption().matches(options::OPT_isystem_after)) {
541 // Handling of paths which must come late. These entries are handled by
542 // the toolchain itself after the resource dir is inserted in the right
543 // search order.
544 // Do not claim the argument so that the use of the argument does not
545 // silently go unnoticed on toolchains which do not honour the option.
546 continue;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000547 }
548
549 // Not translated, render as usual.
550 A->claim();
551 A->render(Args, CmdArgs);
552 }
553
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000554 Args.AddAllArgs(CmdArgs,
555 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
556 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000557
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000558 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000559
560 // FIXME: There is a very unfortunate problem here, some troubled
561 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
562 // really support that we would have to parse and then translate
563 // those options. :(
564 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
565 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000566
567 // -I- is a deprecated GCC feature, reject it.
568 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000569 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000570
571 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
572 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000573 StringRef sysroot = C.getSysRoot();
574 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000575 if (!Args.hasArg(options::OPT_isysroot)) {
576 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000577 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000578 }
579 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000580
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000581 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000582 // FIXME: We should probably sink the logic for handling these from the
583 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000584 // CPATH - included following the user specified includes (but prior to
585 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000586 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000587 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000588 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000589 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000590 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000591 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000592 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000593 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000594 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000595
Samuel Antaod06239d2016-07-15 23:13:27 +0000596 // While adding the include arguments, we also attempt to retrieve the
597 // arguments of related offloading toolchains or arguments that are specific
598 // of an offloading programming model.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000599
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000600 // Add C++ include arguments, if needed.
Samuel Antao6ad11702016-07-27 22:46:31 +0000601 if (types::isCXX(Inputs[0].getType()))
602 forAllAssociatedToolChains(C, JA, getToolChain(),
603 [&Args, &CmdArgs](const ToolChain &TC) {
604 TC.AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
605 });
Chandler Carrutha796f532011-11-05 20:17:13 +0000606
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000607 // Add system include arguments for all targets but IAMCU.
Samuel Antao6ad11702016-07-27 22:46:31 +0000608 if (!IsIAMCU)
609 forAllAssociatedToolChains(C, JA, getToolChain(),
610 [&Args, &CmdArgs](const ToolChain &TC) {
611 TC.AddClangSystemIncludeArgs(Args, CmdArgs);
612 });
613 else {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +0000614 // For IAMCU add special include arguments.
615 getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs);
616 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000617}
618
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000619// FIXME: Move to target hook.
620static bool isSignedCharDefault(const llvm::Triple &Triple) {
621 switch (Triple.getArch()) {
622 default:
623 return true;
624
Tim Northover9bb857a2013-01-31 12:13:10 +0000625 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000626 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000627 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000628 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000629 case llvm::Triple::thumb:
630 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000631 if (Triple.isOSDarwin() || Triple.isOSWindows())
632 return true;
633 return false;
634
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000635 case llvm::Triple::ppc:
636 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000637 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000638 return true;
639 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000640
David Majnemerdcecd932015-05-23 19:23:55 +0000641 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000642 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000643 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000644 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000645 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000646 }
647}
648
Robert Lytton0e076492013-08-13 09:43:10 +0000649static bool isNoCommonDefault(const llvm::Triple &Triple) {
650 switch (Triple.getArch()) {
651 default:
652 return false;
653
654 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000655 case llvm::Triple::wasm32:
656 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000657 return true;
658 }
659}
660
Renato Goline17c5802015-07-27 23:44:42 +0000661// ARM tools start.
662
663// Get SubArch (vN).
664static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
665 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000667}
668
669// True if M-profile.
670static bool isARMMProfile(const llvm::Triple &Triple) {
671 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000672 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000673 return Profile == llvm::ARM::PK_M;
674}
675
676// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000677static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
678 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000679 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
680 CPU = A->getValue();
681 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
682 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000683 if (!FromAs)
684 return;
685
686 for (const Arg *A :
687 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
688 StringRef Value = A->getValue();
689 if (Value.startswith("-mcpu="))
690 CPU = Value.substr(6);
691 if (Value.startswith("-march="))
692 Arch = Value.substr(7);
693 }
Renato Goline17c5802015-07-27 23:44:42 +0000694}
695
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000696// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000697// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000698static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000699 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000700 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000701 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
702 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000703 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
704}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000705
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000706// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000707static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000708 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000709 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000710 unsigned FPUID = llvm::ARM::parseFPU(FPU);
711 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
713}
714
Bradley Smithbbf5a002015-11-18 16:33:48 +0000715// Decode ARM features from string like +[no]featureA+[no]featureB+...
716static bool DecodeARMFeatures(const Driver &D, StringRef text,
717 std::vector<const char *> &Features) {
718 SmallVector<StringRef, 8> Split;
719 text.split(Split, StringRef("+"), -1, false);
720
721 for (StringRef Feature : Split) {
722 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
723 if (FeatureName)
724 Features.push_back(FeatureName);
725 else
726 return false;
727 }
728 return true;
729}
730
Renato Golin7c542b42015-07-27 23:44:45 +0000731// Check if -march is valid by checking if it can be canonicalised and parsed.
732// getARMArch is used here instead of just checking the -march value in order
733// to handle -march=native correctly.
734static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000735 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000736 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000737 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000738 std::pair<StringRef, StringRef> Split = ArchName.split("+");
739
Renato Goline17c5802015-07-27 23:44:42 +0000740 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000741 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
742 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000743 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000744}
745
Renato Golin7c542b42015-07-27 23:44:45 +0000746// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
747static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
748 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000749 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000750 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000751 std::pair<StringRef, StringRef> Split = CPUName.split("+");
752
Renato Goline17c5802015-07-27 23:44:42 +0000753 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000754 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
755 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000756 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000757}
758
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000759static bool useAAPCSForMachO(const llvm::Triple &T) {
760 // The backend is hardwired to assume AAPCS for M-class processors, ensure
761 // the frontend matches that.
762 return T.getEnvironment() == llvm::Triple::EABI ||
763 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
764}
765
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000766// Select the float ABI as determined by -msoft-float, -mhard-float, and
767// -mfloat-abi=.
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000768arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000769 const Driver &D = TC.getDriver();
Vedant Kumar18286cf2016-07-27 23:02:20 +0000770 const llvm::Triple &Triple = TC.getEffectiveTriple();
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000771 auto SubArch = getARMSubArchVersionNumber(Triple);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000772 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000773 if (Arg *A =
774 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
775 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000776 if (A->getOption().matches(options::OPT_msoft_float)) {
777 ABI = FloatABI::Soft;
778 } else if (A->getOption().matches(options::OPT_mhard_float)) {
779 ABI = FloatABI::Hard;
780 } else {
781 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
782 .Case("soft", FloatABI::Soft)
783 .Case("softfp", FloatABI::SoftFP)
784 .Case("hard", FloatABI::Hard)
785 .Default(FloatABI::Invalid);
786 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000787 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000788 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000789 }
790 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000791
792 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
793 // "apcs-gnu".
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000794 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
795 ABI == FloatABI::Hard) {
796 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
797 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000799 }
800
801 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000802 if (ABI == FloatABI::Invalid) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000803 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000804 case llvm::Triple::Darwin:
805 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000806 case llvm::Triple::IOS:
807 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000808 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000809 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000810 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000811 break;
812 }
Tim Northover756447a2015-10-30 16:30:36 +0000813 case llvm::Triple::WatchOS:
814 ABI = FloatABI::Hard;
815 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000816
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000817 // FIXME: this is invalid for WindowsCE
818 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000819 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000820 break;
821
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000822 case llvm::Triple::FreeBSD:
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000823 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000824 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000825 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000826 break;
827 default:
828 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000829 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000830 break;
831 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000832 break;
833
Daniel Dunbar78485922009-09-10 23:00:09 +0000834 default:
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000835 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000836 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +0000837 case llvm::Triple::MuslEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000838 case llvm::Triple::EABIHF:
839 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000840 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000841 case llvm::Triple::GNUEABI:
Rafael Espindola0fa66802016-06-24 21:35:06 +0000842 case llvm::Triple::MuslEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000843 case llvm::Triple::EABI:
844 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000845 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000846 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000847 case llvm::Triple::Android:
848 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000849 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000850 default:
851 // Assume "soft", but warn the user we are guessing.
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000852 if (Triple.isOSBinFormatMachO() &&
853 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
Tim Northover99694fe2016-04-13 17:08:51 +0000854 ABI = FloatABI::Hard;
855 else
856 ABI = FloatABI::Soft;
857
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000858 if (Triple.getOS() != llvm::Triple::UnknownOS ||
859 !Triple.isOSBinFormatMachO())
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000860 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000861 break;
862 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000863 }
864 }
865
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000866 assert(ABI != FloatABI::Invalid && "must select an ABI");
867 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000868}
869
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000870static void getARMTargetFeatures(const ToolChain &TC,
871 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000872 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000873 std::vector<const char *> &Features,
874 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000875 const Driver &D = TC.getDriver();
876
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000877 bool KernelOrKext =
878 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000879 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000880 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
881 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
882
Nico Weber6e0ebae2015-04-29 21:16:40 +0000883 if (!ForAS) {
884 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
885 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
886 // stripped out by the ARM target. We should probably pass this a new
887 // -target-option, which is handled by the -cc1/-cc1as invocation.
888 //
889 // FIXME2: For consistency, it would be ideal if we set up the target
890 // machine state the same when using the frontend or the assembler. We don't
891 // currently do that for the assembler, we pass the options directly to the
892 // backend and never even instantiate the frontend TargetInfo. If we did,
893 // and used its handleTargetFeatures hook, then we could ensure the
894 // assembler and the frontend behave the same.
895
896 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000897 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000898 Features.push_back("+soft-float");
899
900 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000901 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000902 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000903 } else {
904 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
905 // to the assembler correctly.
906 for (const Arg *A :
907 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
908 StringRef Value = A->getValue();
909 if (Value.startswith("-mfpu=")) {
910 WaFPU = A;
911 } else if (Value.startswith("-mcpu=")) {
912 WaCPU = A;
913 } else if (Value.startswith("-mhwdiv=")) {
914 WaHDiv = A;
915 } else if (Value.startswith("-march=")) {
916 WaArch = A;
917 }
918 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000919 }
920
Renato Golin7c542b42015-07-27 23:44:45 +0000921 // Check -march. ClangAs gives preference to -Wa,-march=.
922 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000923 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000924 if (WaArch) {
925 if (ArchArg)
926 D.Diag(clang::diag::warn_drv_unused_argument)
927 << ArchArg->getAsString(Args);
928 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000929 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000930 // FIXME: Set Arch.
931 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
932 } else if (ArchArg) {
933 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000934 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000935 }
936
Renato Golin7c542b42015-07-27 23:44:45 +0000937 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
938 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000939 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000940 if (WaCPU) {
941 if (CPUArg)
942 D.Diag(clang::diag::warn_drv_unused_argument)
943 << CPUArg->getAsString(Args);
944 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000945 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000946 } else if (CPUArg) {
947 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000948 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000949 }
John Brawna95c1a82015-05-08 12:52:18 +0000950
Renato Golin23459c62015-07-30 16:40:17 +0000951 // Add CPU features for generic CPUs
952 if (CPUName == "native") {
953 llvm::StringMap<bool> HostFeatures;
954 if (llvm::sys::getHostCPUFeatures(HostFeatures))
955 for (auto &F : HostFeatures)
956 Features.push_back(
957 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
958 }
959
960 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
961 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
962 if (WaFPU) {
963 if (FPUArg)
964 D.Diag(clang::diag::warn_drv_unused_argument)
965 << FPUArg->getAsString(Args);
966 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
967 Features);
968 } else if (FPUArg) {
969 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
970 }
971
972 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
973 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
974 if (WaHDiv) {
975 if (HDivArg)
976 D.Diag(clang::diag::warn_drv_unused_argument)
977 << HDivArg->getAsString(Args);
978 getARMHWDivFeatures(D, WaHDiv, Args,
979 StringRef(WaHDiv->getValue()).substr(8), Features);
980 } else if (HDivArg)
981 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
982
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000983 // Setting -msoft-float effectively disables NEON because of the GCC
984 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000985 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000986 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000987 // Also need to explicitly disable features which imply NEON.
988 Features.push_back("-crypto");
989 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000990
Eric Christopher269c2a22015-04-04 03:34:43 +0000991 // En/disable crc code generation.
992 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000993 if (A->getOption().matches(options::OPT_mcrc))
994 Features.push_back("+crc");
995 else
996 Features.push_back("-crc");
997 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000998
Akira Hatanakac2694822015-07-07 08:28:42 +0000999 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
1000 // neither options are specified, see if we are compiling for kernel/kext and
1001 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +00001002 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
1003 options::OPT_mno_long_calls)) {
1004 if (A->getOption().matches(options::OPT_mlong_calls))
1005 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +00001006 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
1007 !Triple.isWatchOS()) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001008 Features.push_back("+long-calls");
Akira Hatanaka3fb33a52015-07-07 06:42:05 +00001009 }
Akira Hatanaka580efb22015-07-16 00:43:00 +00001010
Akira Hatanaka7651dd82015-07-28 22:26:45 +00001011 // Kernel code has more strict alignment requirements.
1012 if (KernelOrKext)
1013 Features.push_back("+strict-align");
1014 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
1015 options::OPT_munaligned_access)) {
1016 if (A->getOption().matches(options::OPT_munaligned_access)) {
1017 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
1018 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
1019 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +00001020 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
1021 // access either.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001022 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
Bradley Smithf4affc12016-03-03 13:52:22 +00001023 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +00001024 } else
1025 Features.push_back("+strict-align");
1026 } else {
1027 // Assume pre-ARMv6 doesn't support unaligned accesses.
1028 //
1029 // ARMv6 may or may not support unaligned accesses depending on the
1030 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
1031 // Darwin and NetBSD targets support unaligned accesses, and others don't.
1032 //
1033 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
1034 // which raises an alignment fault on unaligned accesses. Linux
1035 // defaults this bit to 0 and handles it as a system-wide (not
1036 // per-process) setting. It is therefore safe to assume that ARMv7+
1037 // Linux targets support unaligned accesses. The same goes for NaCl.
1038 //
1039 // The above behavior is consistent with GCC.
1040 int VersionNum = getARMSubArchVersionNumber(Triple);
1041 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +00001042 if (VersionNum < 6 ||
1043 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +00001044 Features.push_back("+strict-align");
1045 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1046 if (VersionNum < 7)
1047 Features.push_back("+strict-align");
1048 } else
1049 Features.push_back("+strict-align");
1050 }
1051
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001052 // llvm does not support reserving registers in general. There is support
1053 // for reserving r9 on ARM though (defined as a platform-specific register
1054 // in ARM EABI).
1055 if (Args.hasArg(options::OPT_ffixed_r9))
1056 Features.push_back("+reserve-r9");
1057
Dimitry Andric08107392016-01-06 07:42:18 +00001058 // The kext linker doesn't know how to deal with movw/movt.
1059 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001060 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001061}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001062
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001063void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1064 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001065 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001066 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001067 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001068 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001069 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001070 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001071 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001072 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001073 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001074 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001075 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001076 } else {
1077 ABIName = "apcs-gnu";
1078 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001079 } else if (Triple.isOSWindows()) {
1080 // FIXME: this is invalid for WindowsCE
1081 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001082 } else {
1083 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001085 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001086 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001087 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00001088 case llvm::Triple::MuslEABI:
1089 case llvm::Triple::MuslEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001090 ABIName = "aapcs-linux";
1091 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001092 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001093 case llvm::Triple::EABI:
1094 ABIName = "aapcs";
1095 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001096 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001097 if (Triple.getOS() == llvm::Triple::NetBSD)
1098 ABIName = "apcs-gnu";
1099 else
1100 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001101 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001102 }
1103 }
1104 CmdArgs.push_back("-target-abi");
1105 CmdArgs.push_back(ABIName);
1106
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001107 // Determine floating point ABI from the options & target defaults.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001108 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001109 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001110 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001111 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001112 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001113 CmdArgs.push_back("-mfloat-abi");
1114 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001115 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001116 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001117 CmdArgs.push_back("-mfloat-abi");
1118 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001119 } else {
1120 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001121 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001122 CmdArgs.push_back("-mfloat-abi");
1123 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001124 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001125
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001126 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001127 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1128 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001129 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001130 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001131 CmdArgs.push_back("-arm-global-merge=false");
1132 else
1133 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001134 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001135
Bob Wilson9c8af452013-04-11 18:53:25 +00001136 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001137 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001138 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001139}
Renato Goline17c5802015-07-27 23:44:42 +00001140// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001141
Tim Northover573cbee2014-05-24 12:52:07 +00001142/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1143/// targeting.
1144static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001145 Arg *A;
1146 std::string CPU;
1147 // If we have -mtune or -mcpu, use that.
1148 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001149 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001150 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001151 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001152 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001153 }
1154
Kevin Qin110db6f2014-07-18 07:03:22 +00001155 // Handle CPU name is 'native'.
1156 if (CPU == "native")
1157 return llvm::sys::getHostCPUName();
1158 else if (CPU.size())
1159 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001160
James Molloy9b1586b2014-04-17 12:51:17 +00001161 // Make sure we pick "cyclone" if -arch is used.
1162 // FIXME: Should this be picked by checking the target triple instead?
1163 if (Args.getLastArg(options::OPT_arch))
1164 return "cyclone";
1165
1166 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001167}
1168
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001169void Clang::AddAArch64TargetArgs(const ArgList &Args,
Tim Northover573cbee2014-05-24 12:52:07 +00001170 ArgStringList &CmdArgs) const {
Vedant Kumar18286cf2016-07-27 23:02:20 +00001171 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001172
Tim Northovera2ee4332014-03-29 15:09:45 +00001173 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1174 Args.hasArg(options::OPT_mkernel) ||
1175 Args.hasArg(options::OPT_fapple_kext))
1176 CmdArgs.push_back("-disable-red-zone");
1177
1178 if (!Args.hasFlag(options::OPT_mimplicit_float,
1179 options::OPT_mno_implicit_float, true))
1180 CmdArgs.push_back("-no-implicit-float");
1181
Craig Topper92fc2df2014-05-17 16:56:41 +00001182 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001183 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1184 ABIName = A->getValue();
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001185 else if (Triple.isOSDarwin())
Tim Northovera2ee4332014-03-29 15:09:45 +00001186 ABIName = "darwinpcs";
1187 else
1188 ABIName = "aapcs";
1189
1190 CmdArgs.push_back("-target-abi");
1191 CmdArgs.push_back(ABIName);
1192
Bradley Smith9ff64332014-10-13 10:16:06 +00001193 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1194 options::OPT_mno_fix_cortex_a53_835769)) {
1195 CmdArgs.push_back("-backend-option");
1196 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1197 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1198 else
1199 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001200 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001201 // Enabled A53 errata (835769) workaround by default on android
1202 CmdArgs.push_back("-backend-option");
1203 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001204 }
1205
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001206 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001207 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1208 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001209 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001210 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001211 CmdArgs.push_back("-aarch64-global-merge=false");
1212 else
1213 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001214 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001215}
1216
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001217// Get CPU and ABI names. They are not independent
1218// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001219void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1220 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001221 const char *DefMips32CPU = "mips32r2";
1222 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001223
Daniel Sanders2bf13662014-07-10 14:40:57 +00001224 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1225 // default for mips64(el)?-img-linux-gnu.
1226 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1227 Triple.getEnvironment() == llvm::Triple::GNU) {
1228 DefMips32CPU = "mips32r6";
1229 DefMips64CPU = "mips64r6";
1230 }
Renato Golin7c542b42015-07-27 23:44:45 +00001231
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001232 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Petar Jovanovic009494f2016-05-17 10:46:10 +00001233 if (Triple.isAndroid()) {
1234 DefMips32CPU = "mips32";
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001235 DefMips64CPU = "mips64r6";
Petar Jovanovic009494f2016-05-17 10:46:10 +00001236 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00001237
Brad Smithba26f582015-01-06 02:53:17 +00001238 // MIPS3 is the default for mips64*-unknown-openbsd.
1239 if (Triple.getOS() == llvm::Triple::OpenBSD)
1240 DefMips64CPU = "mips3";
1241
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001242 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001243 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001244
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001245 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001246 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001247 // Convert a GNU style Mips ABI name to the name
1248 // accepted by LLVM Mips backend.
1249 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001250 .Case("32", "o32")
1251 .Case("64", "n64")
1252 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001253 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001254
1255 // Setup default CPU and ABI names.
1256 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001257 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001258 default:
1259 llvm_unreachable("Unexpected triple arch name");
1260 case llvm::Triple::mips:
1261 case llvm::Triple::mipsel:
1262 CPUName = DefMips32CPU;
1263 break;
1264 case llvm::Triple::mips64:
1265 case llvm::Triple::mips64el:
1266 CPUName = DefMips64CPU;
1267 break;
1268 }
1269 }
1270
Daniel Sanders0ca86fe2016-06-06 12:02:21 +00001271 if (ABIName.empty() &&
1272 (Triple.getVendor() == llvm::Triple::MipsTechnologies ||
1273 Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) {
1274 ABIName = llvm::StringSwitch<const char *>(CPUName)
1275 .Case("mips1", "o32")
1276 .Case("mips2", "o32")
1277 .Case("mips3", "n64")
1278 .Case("mips4", "n64")
1279 .Case("mips5", "n64")
1280 .Case("mips32", "o32")
1281 .Case("mips32r2", "o32")
1282 .Case("mips32r3", "o32")
1283 .Case("mips32r5", "o32")
1284 .Case("mips32r6", "o32")
1285 .Case("mips64", "n64")
1286 .Case("mips64r2", "n64")
1287 .Case("mips64r3", "n64")
1288 .Case("mips64r5", "n64")
1289 .Case("mips64r6", "n64")
1290 .Case("octeon", "n64")
1291 .Case("p5600", "o32")
1292 .Default("");
1293 }
1294
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001295 if (ABIName.empty()) {
1296 // Deduce ABI name from the target triple.
1297 if (Triple.getArch() == llvm::Triple::mips ||
1298 Triple.getArch() == llvm::Triple::mipsel)
1299 ABIName = "o32";
1300 else
1301 ABIName = "n64";
1302 }
1303
1304 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001305 // Deduce CPU name from ABI name.
1306 CPUName = llvm::StringSwitch<const char *>(ABIName)
Daniel Sanders07c86542016-05-27 14:30:23 +00001307 .Case("o32", DefMips32CPU)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001308 .Cases("n32", "n64", DefMips64CPU)
1309 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001310 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001311
1312 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001313}
1314
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001315std::string mips::getMipsABILibSuffix(const ArgList &Args,
1316 const llvm::Triple &Triple) {
1317 StringRef CPUName, ABIName;
1318 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1319 return llvm::StringSwitch<std::string>(ABIName)
1320 .Case("o32", "")
1321 .Case("n32", "32")
1322 .Case("n64", "64");
1323}
1324
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001325// Convert ABI name to the GNU tools acceptable variant.
1326static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1327 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001328 .Case("o32", "32")
1329 .Case("n64", "64")
1330 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001331}
1332
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001333// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1334// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001335static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1336 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001337 if (Arg *A =
1338 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1339 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001340 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001341 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001342 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001343 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001344 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001345 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1346 .Case("soft", mips::FloatABI::Soft)
1347 .Case("hard", mips::FloatABI::Hard)
1348 .Default(mips::FloatABI::Invalid);
1349 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001350 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001351 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001352 }
1353 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001354 }
1355
1356 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001357 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001358 // Assume "hard", because it's a default value used by gcc.
1359 // When we start to recognize specific target MIPS processors,
1360 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001361 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001362 }
1363
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001364 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1365 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001366}
1367
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001368static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001369 std::vector<const char *> &Features,
1370 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001371 StringRef FeatureName) {
1372 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001373 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001374 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001375 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001376 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001377 }
1378}
1379
Daniel Sanders379d44b2014-07-16 11:52:23 +00001380static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1381 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001382 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001383 StringRef CPUName;
1384 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001385 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001386 ABIName = getGnuCompatibleMipsABIName(ABIName);
1387
Daniel Sandersfeb61302014-08-08 15:47:17 +00001388 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1389 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1392 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001393 // FIXME: Note, this is a hack. We need to pass the selected float
1394 // mode to the MipsTargetInfoBase to define appropriate macros there.
1395 // Now it is the only method.
1396 Features.push_back("+soft-float");
1397 }
1398
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001399 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001400 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001401 if (Val == "2008") {
1402 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1403 Features.push_back("+nan2008");
1404 else {
1405 Features.push_back("-nan2008");
1406 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1407 }
1408 } else if (Val == "legacy") {
1409 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1410 Features.push_back("-nan2008");
1411 else {
1412 Features.push_back("+nan2008");
1413 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1414 }
1415 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001416 D.Diag(diag::err_drv_unsupported_option_argument)
1417 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001418 }
1419
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001420 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1421 options::OPT_mdouble_float, "single-float");
1422 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1423 "mips16");
1424 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1425 options::OPT_mno_micromips, "micromips");
1426 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1427 "dsp");
1428 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1429 "dspr2");
1430 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1431 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001432
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001433 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32
1434 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and
1435 // nooddspreg.
Daniel Sanders379d44b2014-07-16 11:52:23 +00001436 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1437 options::OPT_mfp64)) {
1438 if (A->getOption().matches(options::OPT_mfp32))
1439 Features.push_back(Args.MakeArgString("-fp64"));
1440 else if (A->getOption().matches(options::OPT_mfpxx)) {
1441 Features.push_back(Args.MakeArgString("+fpxx"));
1442 Features.push_back(Args.MakeArgString("+nooddspreg"));
1443 } else
1444 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001445 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001446 Features.push_back(Args.MakeArgString("+fpxx"));
1447 Features.push_back(Args.MakeArgString("+nooddspreg"));
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001448 } else if (mips::isFP64ADefault(Triple, CPUName)) {
1449 Features.push_back(Args.MakeArgString("+fp64"));
1450 Features.push_back(Args.MakeArgString("+nooddspreg"));
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001451 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001452
Daniel Sanders28e5d392014-07-10 10:39:51 +00001453 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1454 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001455}
1456
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001457void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001458 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001459 const Driver &D = getToolChain().getDriver();
1460 StringRef CPUName;
1461 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001462 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001463 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001464
1465 CmdArgs.push_back("-target-abi");
1466 CmdArgs.push_back(ABIName.data());
1467
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001468 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1469 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001470 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001471 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001472 CmdArgs.push_back("-mfloat-abi");
1473 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001474 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001475 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001476 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001477 CmdArgs.push_back("-mfloat-abi");
1478 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001479 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001480
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001481 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1482 if (A->getOption().matches(options::OPT_mxgot)) {
1483 CmdArgs.push_back("-mllvm");
1484 CmdArgs.push_back("-mxgot");
1485 }
1486 }
1487
Simon Atanasyanc580b322013-05-11 06:33:44 +00001488 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1489 options::OPT_mno_ldc1_sdc1)) {
1490 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1491 CmdArgs.push_back("-mllvm");
1492 CmdArgs.push_back("-mno-ldc1-sdc1");
1493 }
1494 }
1495
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001496 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1497 options::OPT_mno_check_zero_division)) {
1498 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1499 CmdArgs.push_back("-mllvm");
1500 CmdArgs.push_back("-mno-check-zero-division");
1501 }
1502 }
1503
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001504 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001505 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001506 CmdArgs.push_back("-mllvm");
1507 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1508 A->claim();
1509 }
Simon Dardisd0e83ba2016-05-27 15:13:31 +00001510
1511 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
1512 StringRef Val = StringRef(A->getValue());
1513 if (mips::hasCompactBranches(CPUName)) {
1514 if (Val == "never" || Val == "always" || Val == "optimal") {
1515 CmdArgs.push_back("-mllvm");
1516 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val));
1517 } else
1518 D.Diag(diag::err_drv_unsupported_option_argument)
1519 << A->getOption().getName() << Val;
1520 } else
1521 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
1522 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001523}
1524
Hal Finkel8eb59282012-06-11 22:35:19 +00001525/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1526static std::string getPPCTargetCPU(const ArgList &Args) {
1527 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001528 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001529
1530 if (CPUName == "native") {
1531 std::string CPU = llvm::sys::getHostCPUName();
1532 if (!CPU.empty() && CPU != "generic")
1533 return CPU;
1534 else
1535 return "";
1536 }
1537
1538 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 .Case("common", "generic")
1540 .Case("440", "440")
1541 .Case("440fp", "440")
1542 .Case("450", "450")
1543 .Case("601", "601")
1544 .Case("602", "602")
1545 .Case("603", "603")
1546 .Case("603e", "603e")
1547 .Case("603ev", "603ev")
1548 .Case("604", "604")
1549 .Case("604e", "604e")
1550 .Case("620", "620")
1551 .Case("630", "pwr3")
1552 .Case("G3", "g3")
1553 .Case("7400", "7400")
1554 .Case("G4", "g4")
1555 .Case("7450", "7450")
1556 .Case("G4+", "g4+")
1557 .Case("750", "750")
1558 .Case("970", "970")
1559 .Case("G5", "g5")
1560 .Case("a2", "a2")
1561 .Case("a2q", "a2q")
1562 .Case("e500mc", "e500mc")
1563 .Case("e5500", "e5500")
1564 .Case("power3", "pwr3")
1565 .Case("power4", "pwr4")
1566 .Case("power5", "pwr5")
1567 .Case("power5x", "pwr5x")
1568 .Case("power6", "pwr6")
1569 .Case("power6x", "pwr6x")
1570 .Case("power7", "pwr7")
1571 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001572 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001573 .Case("pwr3", "pwr3")
1574 .Case("pwr4", "pwr4")
1575 .Case("pwr5", "pwr5")
1576 .Case("pwr5x", "pwr5x")
1577 .Case("pwr6", "pwr6")
1578 .Case("pwr6x", "pwr6x")
1579 .Case("pwr7", "pwr7")
1580 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001581 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001582 .Case("powerpc", "ppc")
1583 .Case("powerpc64", "ppc64")
1584 .Case("powerpc64le", "ppc64le")
1585 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001586 }
1587
1588 return "";
1589}
1590
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001591static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1592 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001593 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001594 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001595
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001596 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1597 if (FloatABI == ppc::FloatABI::Soft &&
1598 !(Triple.getArch() == llvm::Triple::ppc64 ||
1599 Triple.getArch() == llvm::Triple::ppc64le))
1600 Features.push_back("+soft-float");
1601 else if (FloatABI == ppc::FloatABI::Soft &&
1602 (Triple.getArch() == llvm::Triple::ppc64 ||
1603 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001604 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001605 << "soft float is not supported for ppc64";
1606
Eric Christopher643bb6a2013-10-16 20:40:08 +00001607 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001608 AddTargetFeature(Args, Features, options::OPT_faltivec,
1609 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001610}
1611
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001612ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1613 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1614 if (Arg *A =
1615 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1616 options::OPT_mfloat_abi_EQ)) {
1617 if (A->getOption().matches(options::OPT_msoft_float))
1618 ABI = ppc::FloatABI::Soft;
1619 else if (A->getOption().matches(options::OPT_mhard_float))
1620 ABI = ppc::FloatABI::Hard;
1621 else {
1622 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1623 .Case("soft", ppc::FloatABI::Soft)
1624 .Case("hard", ppc::FloatABI::Hard)
1625 .Default(ppc::FloatABI::Invalid);
1626 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1627 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1628 ABI = ppc::FloatABI::Hard;
1629 }
1630 }
1631 }
1632
1633 // If unspecified, choose the default based on the platform.
1634 if (ABI == ppc::FloatABI::Invalid) {
1635 ABI = ppc::FloatABI::Hard;
1636 }
1637
1638 return ABI;
1639}
1640
Ulrich Weigand8afad612014-07-28 13:17:52 +00001641void Clang::AddPPCTargetArgs(const ArgList &Args,
1642 ArgStringList &CmdArgs) const {
1643 // Select the ABI to use.
1644 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001645 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001646 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001647 case llvm::Triple::ppc64: {
1648 // When targeting a processor that supports QPX, or if QPX is
1649 // specifically enabled, default to using the ABI that supports QPX (so
1650 // long as it is not specifically disabled).
1651 bool HasQPX = false;
1652 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1653 HasQPX = A->getValue() == StringRef("a2q");
1654 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1655 if (HasQPX) {
1656 ABIName = "elfv1-qpx";
1657 break;
1658 }
1659
Ulrich Weigand8afad612014-07-28 13:17:52 +00001660 ABIName = "elfv1";
1661 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001662 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001663 case llvm::Triple::ppc64le:
1664 ABIName = "elfv2";
1665 break;
1666 default:
1667 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001668 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001669
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001670 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1671 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1672 // the option if given as we don't have backend support for any targets
1673 // that don't use the altivec abi.
1674 if (StringRef(A->getValue()) != "altivec")
1675 ABIName = A->getValue();
1676
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001677 ppc::FloatABI FloatABI =
1678 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1679
1680 if (FloatABI == ppc::FloatABI::Soft) {
1681 // Floating point operations and argument passing are soft.
1682 CmdArgs.push_back("-msoft-float");
1683 CmdArgs.push_back("-mfloat-abi");
1684 CmdArgs.push_back("soft");
1685 } else {
1686 // Floating point operations and argument passing are hard.
1687 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1688 CmdArgs.push_back("-mfloat-abi");
1689 CmdArgs.push_back("hard");
1690 }
1691
Ulrich Weigand8afad612014-07-28 13:17:52 +00001692 if (ABIName) {
1693 CmdArgs.push_back("-target-abi");
1694 CmdArgs.push_back(ABIName);
1695 }
1696}
1697
1698bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1699 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1700 return A && (A->getValue() == StringRef(Value));
1701}
1702
Tom Stellard6674c702013-04-01 20:56:53 +00001703/// Get the (LLVM) name of the R600 gpu we are targeting.
1704static std::string getR600TargetGPU(const ArgList &Args) {
1705 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001706 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001707 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001708 .Cases("rv630", "rv635", "r600")
1709 .Cases("rv610", "rv620", "rs780", "rs880")
1710 .Case("rv740", "rv770")
1711 .Case("palm", "cedar")
1712 .Cases("sumo", "sumo2", "sumo")
1713 .Case("hemlock", "cypress")
1714 .Case("aruba", "cayman")
1715 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001716 }
1717 return "";
1718}
1719
Jacques Pienaard964cc22016-03-28 21:02:54 +00001720static std::string getLanaiTargetCPU(const ArgList &Args) {
1721 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1722 return A->getValue();
1723 }
1724 return "";
1725}
1726
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001727sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1728 const ArgList &Args) {
1729 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1730 if (Arg *A =
1731 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1732 options::OPT_mfloat_abi_EQ)) {
1733 if (A->getOption().matches(options::OPT_msoft_float))
1734 ABI = sparc::FloatABI::Soft;
1735 else if (A->getOption().matches(options::OPT_mhard_float))
1736 ABI = sparc::FloatABI::Hard;
1737 else {
1738 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1739 .Case("soft", sparc::FloatABI::Soft)
1740 .Case("hard", sparc::FloatABI::Hard)
1741 .Default(sparc::FloatABI::Invalid);
1742 if (ABI == sparc::FloatABI::Invalid &&
1743 !StringRef(A->getValue()).empty()) {
1744 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1745 ABI = sparc::FloatABI::Hard;
1746 }
1747 }
1748 }
1749
1750 // If unspecified, choose the default based on the platform.
1751 // Only the hard-float ABI on Sparc is standardized, and it is the
1752 // default. GCC also supports a nonstandard soft-float ABI mode, also
1753 // implemented in LLVM. However as this is not standard we set the default
1754 // to be hard-float.
1755 if (ABI == sparc::FloatABI::Invalid) {
1756 ABI = sparc::FloatABI::Hard;
1757 }
1758
1759 return ABI;
1760}
1761
1762static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1763 std::vector<const char *> &Features) {
1764 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1765 if (FloatABI == sparc::FloatABI::Soft)
1766 Features.push_back("+soft-float");
1767}
1768
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001769void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001770 ArgStringList &CmdArgs) const {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001771 sparc::FloatABI FloatABI =
1772 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001773
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001774 if (FloatABI == sparc::FloatABI::Soft) {
1775 // Floating point operations and argument passing are soft.
1776 CmdArgs.push_back("-msoft-float");
1777 CmdArgs.push_back("-mfloat-abi");
1778 CmdArgs.push_back("soft");
1779 } else {
1780 // Floating point operations and argument passing are hard.
1781 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1782 CmdArgs.push_back("-mfloat-abi");
1783 CmdArgs.push_back("hard");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001784 }
1785}
1786
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001787void Clang::AddSystemZTargetArgs(const ArgList &Args,
1788 ArgStringList &CmdArgs) const {
1789 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1790 CmdArgs.push_back("-mbackchain");
1791}
1792
Richard Sandiford4652d892013-07-19 16:51:51 +00001793static const char *getSystemZTargetCPU(const ArgList &Args) {
1794 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1795 return A->getValue();
1796 return "z10";
1797}
1798
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001799static void getSystemZTargetFeatures(const ArgList &Args,
1800 std::vector<const char *> &Features) {
1801 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001802 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001803 if (A->getOption().matches(options::OPT_mhtm))
1804 Features.push_back("+transactional-execution");
1805 else
1806 Features.push_back("-transactional-execution");
1807 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001808 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001809 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001810 if (A->getOption().matches(options::OPT_mvx))
1811 Features.push_back("+vector");
1812 else
1813 Features.push_back("-vector");
1814 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001815}
1816
Chandler Carruth953fb082013-01-13 11:46:33 +00001817static const char *getX86TargetCPU(const ArgList &Args,
1818 const llvm::Triple &Triple) {
1819 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001820 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001821 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001822 return "core-avx2";
1823
Chandler Carruth953fb082013-01-13 11:46:33 +00001824 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001825 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001826
1827 // FIXME: Reject attempts to use -march=native unless the target matches
1828 // the host.
1829 //
1830 // FIXME: We should also incorporate the detected target features for use
1831 // with -native.
1832 std::string CPU = llvm::sys::getHostCPUName();
1833 if (!CPU.empty() && CPU != "generic")
1834 return Args.MakeArgString(CPU);
1835 }
1836
Reid Kleckner3123eff2015-06-30 16:32:04 +00001837 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1838 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1839 StringRef Arch = A->getValue();
1840 const char *CPU;
1841 if (Triple.getArch() == llvm::Triple::x86) {
1842 CPU = llvm::StringSwitch<const char *>(Arch)
1843 .Case("IA32", "i386")
1844 .Case("SSE", "pentium3")
1845 .Case("SSE2", "pentium4")
1846 .Case("AVX", "sandybridge")
1847 .Case("AVX2", "haswell")
1848 .Default(nullptr);
1849 } else {
1850 CPU = llvm::StringSwitch<const char *>(Arch)
1851 .Case("AVX", "sandybridge")
1852 .Case("AVX2", "haswell")
1853 .Default(nullptr);
1854 }
1855 if (CPU)
1856 return CPU;
1857 }
1858
Chandler Carruth953fb082013-01-13 11:46:33 +00001859 // Select the default CPU if none was given (or detection failed).
1860
1861 if (Triple.getArch() != llvm::Triple::x86_64 &&
1862 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001863 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001864
1865 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1866
1867 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001868 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001869 if (Triple.getArchName() == "x86_64h")
1870 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001871 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001872 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001873
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001874 // Set up default CPU name for PS4 compilers.
1875 if (Triple.isPS4CPU())
1876 return "btver2";
1877
Alexey Bataev286d1b92014-01-31 04:07:13 +00001878 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001879 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001880 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001881
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001882 // Everything else goes to x86-64 in 64-bit mode.
1883 if (Is64Bit)
1884 return "x86-64";
1885
1886 switch (Triple.getOS()) {
1887 case llvm::Triple::FreeBSD:
1888 case llvm::Triple::NetBSD:
1889 case llvm::Triple::OpenBSD:
1890 return "i486";
1891 case llvm::Triple::Haiku:
1892 return "i586";
1893 case llvm::Triple::Bitrig:
1894 return "i686";
1895 default:
1896 // Fallback to p4.
1897 return "pentium4";
1898 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001899}
1900
Dan Gohmanc2853072015-09-03 22:51:53 +00001901/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1902static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1903 // If we have -mcpu=, use that.
1904 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1905 StringRef CPU = A->getValue();
1906
1907#ifdef __wasm__
1908 // Handle "native" by examining the host. "native" isn't meaningful when
1909 // cross compiling, so only support this when the host is also WebAssembly.
1910 if (CPU == "native")
1911 return llvm::sys::getHostCPUName();
1912#endif
1913
1914 return CPU;
1915 }
1916
1917 return "generic";
1918}
1919
Renato Golin7c542b42015-07-27 23:44:45 +00001920static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1921 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001922 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001923 default:
1924 return "";
1925
Amara Emerson703da2e2013-10-31 09:32:33 +00001926 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001927 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001928 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001929
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001930 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001931 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001932 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001933 case llvm::Triple::thumbeb: {
1934 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001935 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001936 return arm::getARMTargetCPU(MCPU, MArch, T);
1937 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001938 case llvm::Triple::mips:
1939 case llvm::Triple::mipsel:
1940 case llvm::Triple::mips64:
1941 case llvm::Triple::mips64el: {
1942 StringRef CPUName;
1943 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001944 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001945 return CPUName;
1946 }
1947
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001948 case llvm::Triple::nvptx:
1949 case llvm::Triple::nvptx64:
1950 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1951 return A->getValue();
1952 return "";
1953
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001954 case llvm::Triple::ppc:
1955 case llvm::Triple::ppc64:
1956 case llvm::Triple::ppc64le: {
1957 std::string TargetCPUName = getPPCTargetCPU(Args);
1958 // LLVM may default to generating code for the native CPU,
1959 // but, like gcc, we default to a more generic option for
1960 // each architecture. (except on Darwin)
1961 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1962 if (T.getArch() == llvm::Triple::ppc64)
1963 TargetCPUName = "ppc64";
1964 else if (T.getArch() == llvm::Triple::ppc64le)
1965 TargetCPUName = "ppc64le";
1966 else
1967 TargetCPUName = "ppc";
1968 }
1969 return TargetCPUName;
1970 }
1971
1972 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001973 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001974 case llvm::Triple::sparcv9:
1975 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001976 return A->getValue();
1977 return "";
1978
1979 case llvm::Triple::x86:
1980 case llvm::Triple::x86_64:
1981 return getX86TargetCPU(Args, T);
1982
1983 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001984 return "hexagon" +
1985 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001986
Jacques Pienaard964cc22016-03-28 21:02:54 +00001987 case llvm::Triple::lanai:
1988 return getLanaiTargetCPU(Args);
1989
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001990 case llvm::Triple::systemz:
1991 return getSystemZTargetCPU(Args);
1992
1993 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001994 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001995 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001996
1997 case llvm::Triple::wasm32:
1998 case llvm::Triple::wasm64:
1999 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002000 }
2001}
2002
Alp Tokerce365ca2013-12-02 12:43:03 +00002003static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00002004 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00002005 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
2006 // as gold requires -plugin to come before any -plugin-opt that -Wl might
2007 // forward.
2008 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002009 std::string Plugin =
2010 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00002011 CmdArgs.push_back(Args.MakeArgString(Plugin));
2012
2013 // Try to pass driver level flags relevant to LTO code generation down to
2014 // the plugin.
2015
2016 // Handle flags for selecting CPU variants.
2017 std::string CPU = getCPUName(Args, ToolChain.getTriple());
2018 if (!CPU.empty())
2019 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00002020
James Molloyf97fdae2015-12-21 10:44:36 +00002021 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
2022 StringRef OOpt;
2023 if (A->getOption().matches(options::OPT_O4) ||
2024 A->getOption().matches(options::OPT_Ofast))
2025 OOpt = "3";
2026 else if (A->getOption().matches(options::OPT_O))
2027 OOpt = A->getValue();
2028 else if (A->getOption().matches(options::OPT_O0))
2029 OOpt = "0";
2030 if (!OOpt.empty())
2031 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
2032 }
2033
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00002034 if (IsThinLTO)
2035 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00002036
2037 // If an explicit debugger tuning argument appeared, pass it along.
2038 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
2039 options::OPT_ggdbN_Group)) {
2040 if (A->getOption().matches(options::OPT_glldb))
2041 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
2042 else if (A->getOption().matches(options::OPT_gsce))
2043 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
2044 else
2045 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
2046 }
Alp Tokerce365ca2013-12-02 12:43:03 +00002047}
2048
Sanjay Patel2987c292015-06-11 14:53:41 +00002049/// This is a helper function for validating the optional refinement step
2050/// parameter in reciprocal argument strings. Return false if there is an error
2051/// parsing the refinement step. Otherwise, return true and set the Position
2052/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00002053static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00002055 const char RefinementStepToken = ':';
2056 Position = In.find(RefinementStepToken);
2057 if (Position != StringRef::npos) {
2058 StringRef Option = A.getOption().getName();
2059 StringRef RefStep = In.substr(Position + 1);
2060 // Allow exactly one numeric character for the additional refinement
2061 // step parameter. This is reasonable for all currently-supported
2062 // operations and architectures because we would expect that a larger value
2063 // of refinement steps would cause the estimate "optimization" to
2064 // under-perform the native operation. Also, if the estimate does not
2065 // converge quickly, it probably will not ever converge, so further
2066 // refinement steps will not produce a better answer.
2067 if (RefStep.size() != 1) {
2068 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2069 return false;
2070 }
2071 char RefStepChar = RefStep[0];
2072 if (RefStepChar < '0' || RefStepChar > '9') {
2073 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2074 return false;
2075 }
2076 }
2077 return true;
2078}
2079
2080/// The -mrecip flag requires processing of many optional parameters.
2081static void ParseMRecip(const Driver &D, const ArgList &Args,
2082 ArgStringList &OutStrings) {
2083 StringRef DisabledPrefixIn = "!";
2084 StringRef DisabledPrefixOut = "!";
2085 StringRef EnabledPrefixOut = "";
2086 StringRef Out = "-mrecip=";
2087
2088 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2089 if (!A)
2090 return;
2091
2092 unsigned NumOptions = A->getNumValues();
2093 if (NumOptions == 0) {
2094 // No option is the same as "all".
2095 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2096 return;
2097 }
2098
2099 // Pass through "all", "none", or "default" with an optional refinement step.
2100 if (NumOptions == 1) {
2101 StringRef Val = A->getValue(0);
2102 size_t RefStepLoc;
2103 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2104 return;
2105 StringRef ValBase = Val.slice(0, RefStepLoc);
2106 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2107 OutStrings.push_back(Args.MakeArgString(Out + Val));
2108 return;
2109 }
2110 }
2111
2112 // Each reciprocal type may be enabled or disabled individually.
2113 // Check each input value for validity, concatenate them all back together,
2114 // and pass through.
2115
2116 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002117 OptionStrings.insert(std::make_pair("divd", false));
2118 OptionStrings.insert(std::make_pair("divf", false));
2119 OptionStrings.insert(std::make_pair("vec-divd", false));
2120 OptionStrings.insert(std::make_pair("vec-divf", false));
2121 OptionStrings.insert(std::make_pair("sqrtd", false));
2122 OptionStrings.insert(std::make_pair("sqrtf", false));
2123 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2124 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00002125
2126 for (unsigned i = 0; i != NumOptions; ++i) {
2127 StringRef Val = A->getValue(i);
2128
2129 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2130 // Ignore the disablement token for string matching.
2131 if (IsDisabled)
2132 Val = Val.substr(1);
2133
2134 size_t RefStep;
2135 if (!getRefinementStep(Val, D, *A, RefStep))
2136 return;
2137
2138 StringRef ValBase = Val.slice(0, RefStep);
2139 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2140 if (OptionIter == OptionStrings.end()) {
2141 // Try again specifying float suffix.
2142 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2143 if (OptionIter == OptionStrings.end()) {
2144 // The input name did not match any known option string.
2145 D.Diag(diag::err_drv_unknown_argument) << Val;
2146 return;
2147 }
2148 // The option was specified without a float or double suffix.
2149 // Make sure that the double entry was not already specified.
2150 // The float entry will be checked below.
2151 if (OptionStrings[ValBase.str() + 'd']) {
2152 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2153 return;
2154 }
2155 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002156
Sanjay Patel2987c292015-06-11 14:53:41 +00002157 if (OptionIter->second == true) {
2158 // Duplicate option specified.
2159 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2160 return;
2161 }
2162
2163 // Mark the matched option as found. Do not allow duplicate specifiers.
2164 OptionIter->second = true;
2165
2166 // If the precision was not specified, also mark the double entry as found.
2167 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2168 OptionStrings[ValBase.str() + 'd'] = true;
2169
2170 // Build the output string.
2171 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2172 Out = Args.MakeArgString(Out + Prefix + Val);
2173 if (i != NumOptions - 1)
2174 Out = Args.MakeArgString(Out + ",");
2175 }
2176
2177 OutStrings.push_back(Args.MakeArgString(Out));
2178}
2179
Eric Christopherc54920a2015-03-23 19:26:05 +00002180static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002181 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002182 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002183 // If -march=native, autodetect the feature list.
2184 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2185 if (StringRef(A->getValue()) == "native") {
2186 llvm::StringMap<bool> HostFeatures;
2187 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2188 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002189 Features.push_back(
2190 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002191 }
2192 }
2193
Jim Grosbach82eee262013-11-16 00:53:35 +00002194 if (Triple.getArchName() == "x86_64h") {
2195 // x86_64h implies quite a few of the more modern subtarget features
2196 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2197 Features.push_back("-rdrnd");
2198 Features.push_back("-aes");
2199 Features.push_back("-pclmul");
2200 Features.push_back("-rtm");
2201 Features.push_back("-hle");
2202 Features.push_back("-fsgsbase");
2203 }
2204
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002205 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002206 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002207 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002208 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002209 Features.push_back("+sse4.2");
2210 Features.push_back("+popcnt");
2211 } else
2212 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002213 }
2214
Eric Christopherc54920a2015-03-23 19:26:05 +00002215 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002216 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2217 StringRef Arch = A->getValue();
2218 bool ArchUsed = false;
2219 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002220 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002221 if (Arch == "AVX" || Arch == "AVX2") {
2222 ArchUsed = true;
2223 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2224 }
2225 }
2226 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002227 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002228 if (Arch == "IA32") {
2229 ArchUsed = true;
2230 } else if (Arch == "SSE" || Arch == "SSE2") {
2231 ArchUsed = true;
2232 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2233 }
2234 }
2235 if (!ArchUsed)
2236 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2237 }
2238
Jim Grosbach82eee262013-11-16 00:53:35 +00002239 // Now add any that the user explicitly requested on the command line,
2240 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002241 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002242}
2243
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002244void Clang::AddX86TargetArgs(const ArgList &Args,
2245 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002246 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002247 Args.hasArg(options::OPT_mkernel) ||
2248 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002249 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002250
Bob Wilson2616e2e2013-02-10 16:01:41 +00002251 // Default to avoid implicit floating-point for kernel/kext code, but allow
2252 // that to be overridden with -mno-soft-float.
2253 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2254 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002255 if (Arg *A = Args.getLastArg(
2256 options::OPT_msoft_float, options::OPT_mno_soft_float,
2257 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002258 const Option &O = A->getOption();
2259 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2260 O.matches(options::OPT_msoft_float));
2261 }
2262 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002263 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002264
2265 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2266 StringRef Value = A->getValue();
2267 if (Value == "intel" || Value == "att") {
2268 CmdArgs.push_back("-mllvm");
2269 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2270 } else {
2271 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2272 << A->getOption().getName() << Value;
2273 }
2274 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002275
2276 // Set flags to support MCU ABI.
Andrey Turetskiy5fea71c2016-06-29 10:57:17 +00002277 if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) {
2278 CmdArgs.push_back("-mfloat-abi");
2279 CmdArgs.push_back("soft");
2280 CmdArgs.push_back("-mstack-alignment=4");
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002281 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002282}
2283
Tony Linthicum76329bf2011-12-12 21:14:55 +00002284void Clang::AddHexagonTargetArgs(const ArgList &Args,
2285 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002286 CmdArgs.push_back("-mqdsp6-compat");
2287 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002288
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002289 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2290 std::string N = llvm::utostr(G.getValue());
2291 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002293 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002294 }
2295
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002296 if (!Args.hasArg(options::OPT_fno_short_enums))
2297 CmdArgs.push_back("-fshort-enums");
2298 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002299 CmdArgs.push_back("-mllvm");
2300 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002301 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 CmdArgs.push_back("-mllvm");
2303 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002304}
2305
Jacques Pienaard964cc22016-03-28 21:02:54 +00002306void Clang::AddLanaiTargetArgs(const ArgList &Args,
2307 ArgStringList &CmdArgs) const {
2308 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2309 StringRef CPUName = A->getValue();
2310
2311 CmdArgs.push_back("-target-cpu");
2312 CmdArgs.push_back(Args.MakeArgString(CPUName));
2313 }
2314 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2315 StringRef Value = A->getValue();
2316 // Only support mregparm=4 to support old usage. Report error for all other
2317 // cases.
2318 int Mregparm;
2319 if (Value.getAsInteger(10, Mregparm)) {
2320 if (Mregparm != 4) {
2321 getToolChain().getDriver().Diag(
2322 diag::err_drv_unsupported_option_argument)
2323 << A->getOption().getName() << Value;
2324 }
2325 }
2326 }
2327}
2328
Dan Gohmane3d71e12016-01-07 01:00:21 +00002329void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2330 ArgStringList &CmdArgs) const {
2331 // Default to "hidden" visibility.
2332 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2333 options::OPT_fvisibility_ms_compat)) {
2334 CmdArgs.push_back("-fvisibility");
2335 CmdArgs.push_back("hidden");
2336 }
2337}
2338
Kevin Qin110db6f2014-07-18 07:03:22 +00002339// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002340static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002341 std::vector<const char *> &Features) {
2342 SmallVector<StringRef, 8> Split;
2343 text.split(Split, StringRef("+"), -1, false);
2344
Benjamin Kramer72e64312015-09-24 14:48:49 +00002345 for (StringRef Feature : Split) {
Zijiao Ma33e95212016-07-28 06:24:48 +00002346 if (const char *FeatureName = llvm::AArch64::getArchExtFeature(Feature))
2347 Features.push_back(FeatureName);
Douglas Katzman2675d012015-06-29 19:12:56 +00002348 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002349 D.Diag(diag::err_drv_no_neon_modifier);
2350 else
2351 return false;
2352 }
2353 return true;
2354}
2355
2356// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2357// decode CPU and feature.
2358static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2359 std::vector<const char *> &Features) {
2360 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2361 CPU = Split.first;
Zijiao Ma33e95212016-07-28 06:24:48 +00002362
2363 if (CPU == "generic") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002364 Features.push_back("+neon");
2365 } else {
Zijiao Ma33e95212016-07-28 06:24:48 +00002366 unsigned ArchKind = llvm::AArch64::parseCPUArch(CPU);
2367 unsigned Extersion = llvm::AArch64::getDefaultExtensions(CPU, ArchKind);
2368
2369 if (!llvm::AArch64::getExtensionFeatures(Extersion, Features))
2370 return false;
2371 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002372
2373 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2374 return false;
2375
2376 return true;
2377}
2378
2379static bool
2380getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2381 const ArgList &Args,
2382 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002383 std::string MarchLowerCase = March.lower();
2384 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002385
Zijiao Ma33e95212016-07-28 06:24:48 +00002386 unsigned ArchKind = llvm::AArch64::parseArch(Split.first);
2387 if (ArchKind == static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID) ||
2388 !llvm::AArch64::getArchFeatures(ArchKind, Features) ||
2389 (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features)))
Kevin Qin110db6f2014-07-18 07:03:22 +00002390 return false;
2391
2392 return true;
2393}
2394
2395static bool
2396getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2397 const ArgList &Args,
2398 std::vector<const char *> &Features) {
2399 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002400 std::string McpuLowerCase = Mcpu.lower();
2401 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002402 return false;
2403
2404 return true;
2405}
2406
2407static bool
2408getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2409 const ArgList &Args,
2410 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002411 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002412 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002413 if (MtuneLowerCase == "native")
2414 MtuneLowerCase = llvm::sys::getHostCPUName();
2415 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002416 Features.push_back("+zcm");
2417 Features.push_back("+zcz");
2418 }
2419 return true;
2420}
2421
2422static bool
2423getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2424 const ArgList &Args,
2425 std::vector<const char *> &Features) {
2426 StringRef CPU;
2427 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002428 std::string McpuLowerCase = Mcpu.lower();
2429 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002430 return false;
2431
2432 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2433}
2434
Justin Bognerf9052562015-11-13 23:07:31 +00002435static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002436 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002437 Arg *A;
2438 bool success = true;
2439 // Enable NEON by default.
2440 Features.push_back("+neon");
2441 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2442 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2443 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2444 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002445 else if (Args.hasArg(options::OPT_arch))
2446 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2447 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002448
2449 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2450 success =
2451 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2452 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2453 success =
2454 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002455 else if (Args.hasArg(options::OPT_arch))
2456 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2457 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002458
2459 if (!success)
2460 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002461
2462 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2463 Features.push_back("-fp-armv8");
2464 Features.push_back("-crypto");
2465 Features.push_back("-neon");
2466 }
Bradley Smith418c5932014-05-02 15:17:51 +00002467
2468 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002469 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002470 if (A->getOption().matches(options::OPT_mcrc))
2471 Features.push_back("+crc");
2472 else
2473 Features.push_back("-crc");
2474 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002475
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002476 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2477 options::OPT_munaligned_access))
2478 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2479 Features.push_back("+strict-align");
2480
Justin Bognerf9052562015-11-13 23:07:31 +00002481 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002482 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002483}
2484
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002485static void getHexagonTargetFeatures(const ArgList &Args,
2486 std::vector<const char *> &Features) {
2487 bool HasHVX = false, HasHVXD = false;
2488
Eric Christopher49062a52015-12-22 03:12:34 +00002489 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2490 // doing dependent option handling here rather than in initFeatureMap or a
2491 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002492 for (auto &A : Args) {
2493 auto &Opt = A->getOption();
2494 if (Opt.matches(options::OPT_mhexagon_hvx))
2495 HasHVX = true;
2496 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2497 HasHVXD = HasHVX = false;
2498 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2499 HasHVXD = HasHVX = true;
2500 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2501 HasHVXD = false;
2502 else
2503 continue;
2504 A->claim();
2505 }
2506
2507 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2508 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2509}
2510
Dan Gohmanc2853072015-09-03 22:51:53 +00002511static void getWebAssemblyTargetFeatures(const ArgList &Args,
2512 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002513 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002514}
2515
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002516static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2517 std::vector<const char *> &Features) {
2518 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2519 StringRef value = dAbi->getValue();
2520 if (value == "1.0") {
2521 Features.push_back("+amdgpu-debugger-insert-nops");
Konstantin Zhuravlyove6dbd902016-05-26 19:36:39 +00002522 Features.push_back("+amdgpu-debugger-reserve-regs");
2523 Features.push_back("+amdgpu-debugger-emit-prologue");
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002524 } else {
2525 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2526 }
2527 }
2528
2529 handleTargetFeaturesGroup(
2530 Args, Features, options::OPT_m_amdgpu_Features_Group);
2531}
2532
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002533static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002534 const ArgList &Args, ArgStringList &CmdArgs,
2535 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002536 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002537 std::vector<const char *> Features;
2538 switch (Triple.getArch()) {
2539 default:
2540 break;
2541 case llvm::Triple::mips:
2542 case llvm::Triple::mipsel:
2543 case llvm::Triple::mips64:
2544 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002545 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002546 break;
2547
2548 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002549 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002550 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002551 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002552 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002553 break;
2554
2555 case llvm::Triple::ppc:
2556 case llvm::Triple::ppc64:
2557 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002558 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002559 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002560 case llvm::Triple::systemz:
2561 getSystemZTargetFeatures(Args, Features);
2562 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002563 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002564 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002565 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002566 break;
2567 case llvm::Triple::x86:
2568 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002569 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002570 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002571 case llvm::Triple::hexagon:
2572 getHexagonTargetFeatures(Args, Features);
2573 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002574 case llvm::Triple::wasm32:
2575 case llvm::Triple::wasm64:
2576 getWebAssemblyTargetFeatures(Args, Features);
Adrian McCarthy084148f2016-08-25 18:24:35 +00002577 break;
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00002578 case llvm::Triple::sparc:
2579 case llvm::Triple::sparcel:
2580 case llvm::Triple::sparcv9:
2581 getSparcTargetFeatures(D, Args, Features);
Dan Gohmanc2853072015-09-03 22:51:53 +00002582 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002583 case llvm::Triple::r600:
2584 case llvm::Triple::amdgcn:
2585 getAMDGPUTargetFeatures(D, Args, Features);
2586 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002587 }
Rafael Espindola43964802013-08-21 17:34:32 +00002588
2589 // Find the last of each feature.
2590 llvm::StringMap<unsigned> LastOpt;
2591 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2592 const char *Name = Features[I];
2593 assert(Name[0] == '-' || Name[0] == '+');
2594 LastOpt[Name + 1] = I;
2595 }
2596
2597 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2598 // If this feature was overridden, ignore it.
2599 const char *Name = Features[I];
2600 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2601 assert(LastI != LastOpt.end());
2602 unsigned Last = LastI->second;
2603 if (Last != I)
2604 continue;
2605
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002606 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002607 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002608 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002609}
2610
David Majnemerae394812014-12-09 00:12:30 +00002611static bool
2612shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2613 const llvm::Triple &Triple) {
2614 // We use the zero-cost exception tables for Objective-C if the non-fragile
2615 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2616 // later.
2617 if (runtime.isNonFragile())
2618 return true;
2619
2620 if (!Triple.isMacOSX())
2621 return false;
2622
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002623 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002624 (Triple.getArch() == llvm::Triple::x86_64 ||
2625 Triple.getArch() == llvm::Triple::arm));
2626}
2627
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002628/// Adds exception related arguments to the driver command arguments. There's a
2629/// master flag, -fexceptions and also language specific flags to enable/disable
2630/// C++ and Objective-C exceptions. This makes it possible to for example
2631/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002632static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002633 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002634 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002635 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002636 const Driver &D = TC.getDriver();
2637 const llvm::Triple &Triple = TC.getTriple();
2638
Chad Rosier4fab82c2012-03-26 22:04:46 +00002639 if (KernelOrKext) {
2640 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2641 // arguments now to avoid warnings about unused arguments.
2642 Args.ClaimAllArgs(options::OPT_fexceptions);
2643 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2644 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2645 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2646 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2647 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002648 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002649 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002650
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002651 // See if the user explicitly enabled exceptions.
2652 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2653 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002654
David Majnemerae394812014-12-09 00:12:30 +00002655 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2656 // is not necessarily sensible, but follows GCC.
2657 if (types::isObjC(InputType) &&
2658 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002659 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002660 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002661
David Majnemerae394812014-12-09 00:12:30 +00002662 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002663 }
2664
2665 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002666 // Disable C++ EH by default on XCore and PS4.
2667 bool CXXExceptionsEnabled =
2668 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002669 Arg *ExceptionArg = Args.getLastArg(
2670 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2671 options::OPT_fexceptions, options::OPT_fno_exceptions);
2672 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002673 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002674 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2675 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002676
2677 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002678 if (Triple.isPS4CPU()) {
2679 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2680 assert(ExceptionArg &&
2681 "On the PS4 exceptions should only be enabled if passing "
2682 "an argument");
2683 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2684 const Arg *RTTIArg = TC.getRTTIArg();
2685 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2686 D.Diag(diag::err_drv_argument_not_allowed_with)
2687 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2688 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2689 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2690 } else
2691 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2692
Anders Carlssone96ab552011-02-28 02:27:16 +00002693 CmdArgs.push_back("-fcxx-exceptions");
2694
David Majnemer8de68642014-12-05 08:11:58 +00002695 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002696 }
2697 }
2698
David Majnemer8de68642014-12-05 08:11:58 +00002699 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002700 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002701}
2702
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002703static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002704 bool Default = true;
2705 if (TC.getTriple().isOSDarwin()) {
2706 // The native darwin assembler doesn't support the linker_option directives,
2707 // so we disable them if we think the .s file will be passed to it.
2708 Default = TC.useIntegratedAs();
2709 }
2710 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2711 Default);
2712}
2713
Ted Kremenek62093662013-03-12 17:02:12 +00002714static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2715 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002716 bool UseDwarfDirectory =
2717 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2718 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002719 return !UseDwarfDirectory;
2720}
2721
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002722/// \brief Check whether the given input tree contains any compilation actions.
2723static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002724 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002725 return true;
2726
Nico Weber5a459f82016-02-23 19:30:43 +00002727 for (const auto &AI : A->inputs())
2728 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002729 return true;
2730
2731 return false;
2732}
2733
2734/// \brief Check if -relax-all should be passed to the internal assembler.
2735/// This is done by default when compiling non-assembler source with -O0.
2736static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2737 bool RelaxDefault = true;
2738
2739 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2740 RelaxDefault = A->getOption().matches(options::OPT_O0);
2741
2742 if (RelaxDefault) {
2743 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002744 for (const auto &Act : C.getActions()) {
2745 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002746 RelaxDefault = true;
2747 break;
2748 }
2749 }
2750 }
2751
2752 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002754}
2755
Paul Robinson0334a042015-12-19 19:41:48 +00002756// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2757// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002758static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002759 assert(A.getOption().matches(options::OPT_gN_Group) &&
2760 "Not a -g option that specifies a debug-info level");
2761 if (A.getOption().matches(options::OPT_g0) ||
2762 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002763 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002764 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2765 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002766 return codegenoptions::DebugLineTablesOnly;
2767 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002768}
2769
Douglas Katzman3459ce22015-10-08 04:24:12 +00002770// Extract the integer N from a string spelled "-dwarf-N", returning 0
2771// on mismatch. The StringRef input (rather than an Arg) allows
2772// for use by the "-Xassembler" option parser.
2773static unsigned DwarfVersionNum(StringRef ArgValue) {
2774 return llvm::StringSwitch<unsigned>(ArgValue)
2775 .Case("-gdwarf-2", 2)
2776 .Case("-gdwarf-3", 3)
2777 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002778 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002779 .Default(0);
2780}
2781
2782static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002783 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002784 unsigned DwarfVersion,
2785 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002786 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002787 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002788 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2789 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002790 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002791 CmdArgs.push_back("-debug-info-kind=limited");
2792 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002793 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002794 CmdArgs.push_back("-debug-info-kind=standalone");
2795 break;
2796 default:
2797 break;
2798 }
2799 if (DwarfVersion > 0)
2800 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002801 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002802 switch (DebuggerTuning) {
2803 case llvm::DebuggerKind::GDB:
2804 CmdArgs.push_back("-debugger-tuning=gdb");
2805 break;
2806 case llvm::DebuggerKind::LLDB:
2807 CmdArgs.push_back("-debugger-tuning=lldb");
2808 break;
2809 case llvm::DebuggerKind::SCE:
2810 CmdArgs.push_back("-debugger-tuning=sce");
2811 break;
2812 default:
2813 break;
2814 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002815}
2816
David Blaikie9260ed62013-07-25 21:19:01 +00002817static void CollectArgsForIntegratedAssembler(Compilation &C,
2818 const ArgList &Args,
2819 ArgStringList &CmdArgs,
2820 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002821 if (UseRelaxAll(C, Args))
2822 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002823
David Majnemer2b9349d2015-12-21 22:09:34 +00002824 // Only default to -mincremental-linker-compatible if we think we are
2825 // targeting the MSVC linker.
2826 bool DefaultIncrementalLinkerCompatible =
2827 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2828 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2829 options::OPT_mno_incremental_linker_compatible,
2830 DefaultIncrementalLinkerCompatible))
2831 CmdArgs.push_back("-mincremental-linker-compatible");
2832
Oliver Stannard7921e832016-07-27 08:54:13 +00002833 switch (C.getDefaultToolChain().getArch()) {
2834 case llvm::Triple::arm:
2835 case llvm::Triple::armeb:
2836 case llvm::Triple::thumb:
2837 case llvm::Triple::thumbeb:
2838 if (Arg *A = Args.getLastArg(options::OPT_mimplicit_it_EQ)) {
2839 StringRef Value = A->getValue();
2840 if (Value == "always" || Value == "never" || Value == "arm" ||
2841 Value == "thumb") {
2842 CmdArgs.push_back("-mllvm");
2843 CmdArgs.push_back(Args.MakeArgString("-arm-implicit-it=" + Value));
2844 } else {
2845 D.Diag(diag::err_drv_unsupported_option_argument)
2846 << A->getOption().getName() << Value;
2847 }
2848 }
2849 break;
2850 default:
2851 break;
2852 }
2853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002854 // When passing -I arguments to the assembler we sometimes need to
2855 // unconditionally take the next argument. For example, when parsing
2856 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2857 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2858 // arg after parsing the '-I' arg.
2859 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002860
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002861 // When using an integrated assembler, translate -Wa, and -Xassembler
2862 // options.
2863 bool CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002864
Rafael Espindola557679f2016-06-20 23:54:44 +00002865 bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS;
Scott Egertonb67d4692016-01-14 13:01:48 +00002866 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002867 for (const Arg *A :
2868 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2869 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002870
Benjamin Kramer72e64312015-09-24 14:48:49 +00002871 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002872 if (TakeNextArg) {
2873 CmdArgs.push_back(Value.data());
2874 TakeNextArg = false;
2875 continue;
2876 }
David Blaikie9260ed62013-07-25 21:19:01 +00002877
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002878 switch (C.getDefaultToolChain().getArch()) {
2879 default:
2880 break;
2881 case llvm::Triple::mips:
2882 case llvm::Triple::mipsel:
2883 case llvm::Triple::mips64:
2884 case llvm::Triple::mips64el:
2885 if (Value == "--trap") {
2886 CmdArgs.push_back("-target-feature");
2887 CmdArgs.push_back("+use-tcc-in-div");
2888 continue;
2889 }
2890 if (Value == "--break") {
2891 CmdArgs.push_back("-target-feature");
2892 CmdArgs.push_back("-use-tcc-in-div");
2893 continue;
2894 }
2895 if (Value.startswith("-msoft-float")) {
2896 CmdArgs.push_back("-target-feature");
2897 CmdArgs.push_back("+soft-float");
2898 continue;
2899 }
2900 if (Value.startswith("-mhard-float")) {
2901 CmdArgs.push_back("-target-feature");
2902 CmdArgs.push_back("-soft-float");
2903 continue;
2904 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002905
2906 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2907 .Case("-mips1", "+mips1")
2908 .Case("-mips2", "+mips2")
2909 .Case("-mips3", "+mips3")
2910 .Case("-mips4", "+mips4")
2911 .Case("-mips5", "+mips5")
2912 .Case("-mips32", "+mips32")
2913 .Case("-mips32r2", "+mips32r2")
2914 .Case("-mips32r3", "+mips32r3")
2915 .Case("-mips32r5", "+mips32r5")
2916 .Case("-mips32r6", "+mips32r6")
2917 .Case("-mips64", "+mips64")
2918 .Case("-mips64r2", "+mips64r2")
2919 .Case("-mips64r3", "+mips64r3")
2920 .Case("-mips64r5", "+mips64r5")
2921 .Case("-mips64r6", "+mips64r6")
2922 .Default(nullptr);
2923 if (MipsTargetFeature)
2924 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002925 }
2926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002927 if (Value == "-force_cpusubtype_ALL") {
2928 // Do nothing, this is the default and we don't support anything else.
2929 } else if (Value == "-L") {
2930 CmdArgs.push_back("-msave-temp-labels");
2931 } else if (Value == "--fatal-warnings") {
2932 CmdArgs.push_back("-massembler-fatal-warnings");
2933 } else if (Value == "--noexecstack") {
2934 CmdArgs.push_back("-mnoexecstack");
2935 } else if (Value == "-compress-debug-sections" ||
2936 Value == "--compress-debug-sections") {
2937 CompressDebugSections = true;
2938 } else if (Value == "-nocompress-debug-sections" ||
2939 Value == "--nocompress-debug-sections") {
2940 CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002941 } else if (Value == "-mrelax-relocations=yes" ||
2942 Value == "--mrelax-relocations=yes") {
2943 UseRelaxRelocations = true;
2944 } else if (Value == "-mrelax-relocations=no" ||
2945 Value == "--mrelax-relocations=no") {
2946 UseRelaxRelocations = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002947 } else if (Value.startswith("-I")) {
2948 CmdArgs.push_back(Value.data());
2949 // We need to consume the next argument if the current arg is a plain
2950 // -I. The next arg will be the include directory.
2951 if (Value == "-I")
2952 TakeNextArg = true;
2953 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002954 // "-gdwarf-N" options are not cc1as options.
2955 unsigned DwarfVersion = DwarfVersionNum(Value);
2956 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2957 CmdArgs.push_back(Value.data());
2958 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002959 RenderDebugEnablingArgs(Args, CmdArgs,
2960 codegenoptions::LimitedDebugInfo,
2961 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002962 }
Renato Golin7c542b42015-07-27 23:44:45 +00002963 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2964 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2965 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002966 } else {
2967 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002968 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002969 }
2970 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971 }
2972 if (CompressDebugSections) {
2973 if (llvm::zlib::isAvailable())
2974 CmdArgs.push_back("-compress-debug-sections");
2975 else
2976 D.Diag(diag::warn_debug_compression_unavailable);
2977 }
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002978 if (UseRelaxRelocations)
2979 CmdArgs.push_back("--mrelax-relocations");
Scott Egertonb67d4692016-01-14 13:01:48 +00002980 if (MipsTargetFeature != nullptr) {
2981 CmdArgs.push_back("-target-feature");
2982 CmdArgs.push_back(MipsTargetFeature);
2983 }
David Blaikie9260ed62013-07-25 21:19:01 +00002984}
2985
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002986// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002987// FIXME: Make sure we can also emit shared objects if they're requested
2988// and available, check for possible errors, etc.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00002989static void addClangRT(const ToolChain &TC, const ArgList &Args,
2990 ArgStringList &CmdArgs) {
2991 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002992}
2993
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002994namespace {
2995enum OpenMPRuntimeKind {
2996 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2997 /// without knowing what runtime to target.
2998 OMPRT_Unknown,
2999
3000 /// The LLVM OpenMP runtime. When completed and integrated, this will become
3001 /// the default for Clang.
3002 OMPRT_OMP,
3003
3004 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
3005 /// this runtime but can swallow the pragmas, and find and link against the
3006 /// runtime library itself.
3007 OMPRT_GOMP,
3008
Chandler Carruthc6625c62015-05-28 21:10:31 +00003009 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003010 /// OpenMP runtime. We support this mode for users with existing dependencies
3011 /// on this runtime library name.
3012 OMPRT_IOMP5
3013};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00003014}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003015
3016/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00003017static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
3018 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003019 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
3020
3021 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
3022 if (A)
3023 RuntimeName = A->getValue();
3024
3025 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003026 .Case("libomp", OMPRT_OMP)
3027 .Case("libgomp", OMPRT_GOMP)
3028 .Case("libiomp5", OMPRT_IOMP5)
3029 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003030
3031 if (RT == OMPRT_Unknown) {
3032 if (A)
3033 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003034 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00003035 else
3036 // FIXME: We could use a nicer diagnostic here.
3037 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
3038 }
3039
3040 return RT;
3041}
3042
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00003043static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
3044 const ArgList &Args) {
3045 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
3046 options::OPT_fno_openmp, false))
3047 return;
3048
3049 switch (getOpenMPRuntime(TC, Args)) {
3050 case OMPRT_OMP:
3051 CmdArgs.push_back("-lomp");
3052 break;
3053 case OMPRT_GOMP:
3054 CmdArgs.push_back("-lgomp");
3055 break;
3056 case OMPRT_IOMP5:
3057 CmdArgs.push_back("-liomp5");
3058 break;
3059 case OMPRT_Unknown:
3060 // Already diagnosed.
3061 break;
3062 }
3063}
3064
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003065static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
3066 ArgStringList &CmdArgs, StringRef Sanitizer,
3067 bool IsShared, bool IsWhole) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003068 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00003069 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00003070 if (IsWhole) CmdArgs.push_back("-whole-archive");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003071 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
3072 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00003073}
3074
Alexey Samsonov52550342014-09-15 19:58:40 +00003075// Tries to use a file with the list of dynamic symbols that need to be exported
3076// from the runtime library. Returns true if the file was found.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003077static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
3078 ArgStringList &CmdArgs,
Alexey Samsonov52550342014-09-15 19:58:40 +00003079 StringRef Sanitizer) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003080 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00003081 if (llvm::sys::fs::exists(SanRT + ".syms")) {
3082 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00003083 return true;
3084 }
3085 return false;
3086}
3087
3088static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3089 ArgStringList &CmdArgs) {
3090 // Force linking against the system libraries sanitizers depends on
3091 // (see PR15823 why this is necessary).
3092 CmdArgs.push_back("--no-as-needed");
3093 CmdArgs.push_back("-lpthread");
3094 CmdArgs.push_back("-lrt");
3095 CmdArgs.push_back("-lm");
3096 // There's no libdl on FreeBSD.
3097 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3098 CmdArgs.push_back("-ldl");
3099}
3100
3101static void
3102collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3103 SmallVectorImpl<StringRef> &SharedRuntimes,
3104 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003105 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3106 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3107 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003108 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3109 // Collect shared runtimes.
3110 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3111 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00003112 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003113 // The stats_client library is also statically linked into DSOs.
3114 if (SanArgs.needsStatsRt())
3115 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003116
Alexey Samsonov52550342014-09-15 19:58:40 +00003117 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003118 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003119 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003120 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00003121 }
3122 if (SanArgs.needsAsanRt()) {
3123 if (SanArgs.needsSharedAsanRt()) {
3124 HelperStaticRuntimes.push_back("asan-preinit");
3125 } else {
3126 StaticRuntimes.push_back("asan");
3127 if (SanArgs.linkCXXRuntimes())
3128 StaticRuntimes.push_back("asan_cxx");
3129 }
3130 }
3131 if (SanArgs.needsDfsanRt())
3132 StaticRuntimes.push_back("dfsan");
3133 if (SanArgs.needsLsanRt())
3134 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003135 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003136 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003137 if (SanArgs.linkCXXRuntimes())
3138 StaticRuntimes.push_back("msan_cxx");
3139 }
3140 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003141 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003142 if (SanArgs.linkCXXRuntimes())
3143 StaticRuntimes.push_back("tsan_cxx");
3144 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003145 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003146 StaticRuntimes.push_back("ubsan_standalone");
3147 if (SanArgs.linkCXXRuntimes())
3148 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003149 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003150 if (SanArgs.needsSafeStackRt())
3151 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003152 if (SanArgs.needsCfiRt())
3153 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003154 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003155 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003156 if (SanArgs.linkCXXRuntimes())
3157 StaticRuntimes.push_back("ubsan_standalone_cxx");
3158 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003159 if (SanArgs.needsStatsRt()) {
3160 NonWholeStaticRuntimes.push_back("stats");
3161 RequiredSymbols.push_back("__sanitizer_stats_register");
3162 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003163 if (SanArgs.needsEsanRt())
3164 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003165}
3166
Alexey Samsonov52550342014-09-15 19:58:40 +00003167// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3168// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003169static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3170 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003171 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003172 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003173 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003174 NonWholeStaticRuntimes, HelperStaticRuntimes,
3175 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003176 for (auto RT : SharedRuntimes)
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003177 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003178 for (auto RT : HelperStaticRuntimes)
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003179 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003180 bool AddExportDynamic = false;
3181 for (auto RT : StaticRuntimes) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003182 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
3183 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
Alexey Samsonov52550342014-09-15 19:58:40 +00003184 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003185 for (auto RT : NonWholeStaticRuntimes) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003186 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3187 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
Peter Collingbournedc134532016-01-16 00:31:22 +00003188 }
3189 for (auto S : RequiredSymbols) {
3190 CmdArgs.push_back("-u");
3191 CmdArgs.push_back(Args.MakeArgString(S));
3192 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003193 // If there is a static runtime with no dynamic list, force all the symbols
3194 // to be dynamic to be sure we export sanitizer interface functions.
3195 if (AddExportDynamic)
3196 CmdArgs.push_back("-export-dynamic");
3197 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003198}
3199
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003200static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args,
3201 ArgStringList &CmdArgs) {
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00003202 if (Args.hasFlag(options::OPT_fxray_instrument,
3203 options::OPT_fnoxray_instrument, false)) {
3204 CmdArgs.push_back("-whole-archive");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003205 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false));
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00003206 CmdArgs.push_back("-no-whole-archive");
3207 return true;
3208 }
3209 return false;
3210}
3211
Dean Michael Berris39baab92016-07-14 04:58:44 +00003212static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args,
3213 ArgStringList &CmdArgs) {
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00003214 CmdArgs.push_back("--no-as-needed");
3215 CmdArgs.push_back("-lpthread");
3216 CmdArgs.push_back("-lrt");
3217 CmdArgs.push_back("-lm");
3218 CmdArgs.push_back("-latomic");
Dean Michael Berris39baab92016-07-14 04:58:44 +00003219 if (TC.GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3220 CmdArgs.push_back("-lc++");
3221 else
3222 CmdArgs.push_back("-lstdc++");
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00003223 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3224 CmdArgs.push_back("-ldl");
3225}
3226
Reid Kleckner86ea7702015-02-04 23:45:07 +00003227static bool areOptimizationsEnabled(const ArgList &Args) {
3228 // Find the last -O arg and see if it is non-zero.
3229 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3230 return !A->getOption().matches(options::OPT_O0);
3231 // Defaults to -O0.
3232 return false;
3233}
3234
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00003235static bool mustUseFramePointerForTarget(const llvm::Triple &Triple) {
3236 switch (Triple.getArch()){
3237 default:
3238 return false;
3239 case llvm::Triple::arm:
3240 case llvm::Triple::thumb:
3241 // ARM Darwin targets require a frame pointer to be always present to aid
3242 // offline debugging via backtraces.
3243 return Triple.isOSDarwin();
3244 }
3245}
3246
3247static bool useFramePointerForTargetByDefault(const ArgList &Args,
3248 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003249 switch (Triple.getArch()) {
3250 case llvm::Triple::xcore:
3251 case llvm::Triple::wasm32:
3252 case llvm::Triple::wasm64:
3253 // XCore never wants frame pointers, regardless of OS.
3254 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003255 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003256 default:
3257 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003258 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003259
Ed Schouten9e4da072016-08-11 19:23:30 +00003260 if (Triple.isOSLinux() || Triple.getOS() == llvm::Triple::CloudABI) {
Reid Kleckner86ea7702015-02-04 23:45:07 +00003261 switch (Triple.getArch()) {
3262 // Don't use a frame pointer on linux if optimizing for certain targets.
3263 case llvm::Triple::mips64:
3264 case llvm::Triple::mips64el:
3265 case llvm::Triple::mips:
3266 case llvm::Triple::mipsel:
3267 case llvm::Triple::systemz:
3268 case llvm::Triple::x86:
3269 case llvm::Triple::x86_64:
3270 return !areOptimizationsEnabled(Args);
3271 default:
3272 return true;
3273 }
3274 }
3275
3276 if (Triple.isOSWindows()) {
3277 switch (Triple.getArch()) {
3278 case llvm::Triple::x86:
3279 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003280 case llvm::Triple::x86_64:
3281 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003282 case llvm::Triple::arm:
3283 case llvm::Triple::thumb:
3284 // Windows on ARM builds with FPO disabled to aid fast stack walking
3285 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003286 default:
3287 // All other supported Windows ISAs use xdata unwind information, so frame
3288 // pointers are not generally useful.
3289 return false;
3290 }
3291 }
3292
3293 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003294}
3295
Rafael Espindola224dd632011-12-14 21:02:23 +00003296static bool shouldUseFramePointer(const ArgList &Args,
3297 const llvm::Triple &Triple) {
3298 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3299 options::OPT_fomit_frame_pointer))
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00003300 return A->getOption().matches(options::OPT_fno_omit_frame_pointer) ||
3301 mustUseFramePointerForTarget(Triple);
3302
Xinliang David Li4dff8752015-11-23 17:30:31 +00003303 if (Args.hasArg(options::OPT_pg))
3304 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003305
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00003306 return useFramePointerForTargetByDefault(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003307}
3308
Eric Christopherb7d97e92013-04-03 01:58:53 +00003309static bool shouldUseLeafFramePointer(const ArgList &Args,
3310 const llvm::Triple &Triple) {
3311 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3312 options::OPT_momit_leaf_frame_pointer))
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00003313 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer) ||
3314 mustUseFramePointerForTarget(Triple);
3315
Xinliang David Li4dff8752015-11-23 17:30:31 +00003316 if (Args.hasArg(options::OPT_pg))
3317 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003318
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003319 if (Triple.isPS4CPU())
3320 return false;
3321
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00003322 return useFramePointerForTargetByDefault(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003323}
3324
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003325/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003326static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003327 SmallString<128> cwd;
3328 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003329 CmdArgs.push_back("-fdebug-compilation-dir");
3330 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003331 }
3332}
3333
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003334static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003335 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3336 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3337 SmallString<128> T(FinalOutput->getValue());
3338 llvm::sys::path::replace_extension(T, "dwo");
3339 return Args.MakeArgString(T);
3340 } else {
3341 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003342 SmallString<128> T(
3343 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003344 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003345 llvm::sys::path::replace_extension(F, "dwo");
3346 T += F;
3347 return Args.MakeArgString(F);
3348 }
3349}
3350
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003351static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3352 const JobAction &JA, const ArgList &Args,
3353 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003354 ArgStringList ExtractArgs;
3355 ExtractArgs.push_back("--extract-dwo");
3356
3357 ArgStringList StripArgs;
3358 StripArgs.push_back("--strip-dwo");
3359
3360 // Grabbing the output of the earlier compile step.
3361 StripArgs.push_back(Output.getFilename());
3362 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003363 ExtractArgs.push_back(OutFile);
3364
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003365 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003366 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003367
3368 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003369 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003370
3371 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003372 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003373}
3374
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003375/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003376/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3377static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003378 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003379 if (A->getOption().matches(options::OPT_O4) ||
3380 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003381 return true;
3382
3383 if (A->getOption().matches(options::OPT_O0))
3384 return false;
3385
3386 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3387
Rafael Espindola91780de2013-08-26 14:05:41 +00003388 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003389 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003390 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003391 return true;
3392
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003393 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003394 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003395 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003396
3397 unsigned OptLevel = 0;
3398 if (S.getAsInteger(10, OptLevel))
3399 return false;
3400
3401 return OptLevel > 1;
3402 }
3403
3404 return false;
3405}
3406
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003407/// Add -x lang to \p CmdArgs for \p Input.
3408static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3409 ArgStringList &CmdArgs) {
3410 // When using -verify-pch, we don't want to provide the type
3411 // 'precompiled-header' if it was inferred from the file extension
3412 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3413 return;
3414
3415 CmdArgs.push_back("-x");
3416 if (Args.hasArg(options::OPT_rewrite_objc))
3417 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3418 else
3419 CmdArgs.push_back(types::getTypeName(Input.getType()));
3420}
3421
David Majnemerc371ff02015-03-22 08:39:22 +00003422static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003423 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003424 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003425
3426 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003427 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003428
3429 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003430 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003431 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003432 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003433}
3434
Rafael Espindola577637a2015-01-03 00:06:04 +00003435// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003436// options that build systems might add but are unused when assembling or only
3437// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003438static void claimNoWarnArgs(const ArgList &Args) {
3439 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003440 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003441 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003442 Args.ClaimAllArgs(options::OPT_flto);
3443 Args.ClaimAllArgs(options::OPT_fno_lto);
3444}
3445
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003446static void appendUserToPath(SmallVectorImpl<char> &Result) {
3447#ifdef LLVM_ON_UNIX
3448 const char *Username = getenv("LOGNAME");
3449#else
3450 const char *Username = getenv("USERNAME");
3451#endif
3452 if (Username) {
3453 // Validate that LoginName can be used in a path, and get its length.
3454 size_t Len = 0;
3455 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003456 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003457 Username = nullptr;
3458 break;
3459 }
3460 }
3461
3462 if (Username && Len > 0) {
3463 Result.append(Username, Username + Len);
3464 return;
3465 }
3466 }
3467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003469#ifdef LLVM_ON_UNIX
3470 std::string UID = llvm::utostr(getuid());
3471#else
3472 // FIXME: Windows seems to have an 'SID' that might work.
3473 std::string UID = "9999";
3474#endif
3475 Result.append(UID.begin(), UID.end());
3476}
3477
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003478VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
David Majnemere11d3732015-06-08 00:22:46 +00003479 const llvm::Triple &Triple,
3480 const llvm::opt::ArgList &Args,
3481 bool IsWindowsMSVC) {
3482 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3483 IsWindowsMSVC) ||
3484 Args.hasArg(options::OPT_fmsc_version) ||
3485 Args.hasArg(options::OPT_fms_compatibility_version)) {
3486 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3487 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003488 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003489
3490 if (MSCVersion && MSCompatibilityVersion) {
3491 if (D)
3492 D->Diag(diag::err_drv_argument_not_allowed_with)
3493 << MSCVersion->getAsString(Args)
3494 << MSCompatibilityVersion->getAsString(Args);
3495 return VersionTuple();
3496 }
3497
3498 if (MSCompatibilityVersion) {
3499 VersionTuple MSVT;
3500 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3501 D->Diag(diag::err_drv_invalid_value)
3502 << MSCompatibilityVersion->getAsString(Args)
3503 << MSCompatibilityVersion->getValue();
3504 return MSVT;
3505 }
3506
3507 if (MSCVersion) {
3508 unsigned Version = 0;
3509 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3510 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3511 << MSCVersion->getValue();
3512 return getMSCompatibilityVersion(Version);
3513 }
3514
3515 unsigned Major, Minor, Micro;
3516 Triple.getEnvironmentVersion(Major, Minor, Micro);
3517 if (Major || Minor || Micro)
3518 return VersionTuple(Major, Minor, Micro);
3519
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003520 if (IsWindowsMSVC) {
3521 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3522 if (!MSVT.empty())
3523 return MSVT;
3524
3525 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3526 return VersionTuple(18);
3527 }
David Majnemere11d3732015-06-08 00:22:46 +00003528 }
3529 return VersionTuple();
3530}
3531
Diego Novilloa0545962015-07-10 18:00:07 +00003532static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3533 const InputInfo &Output, const ArgList &Args,
3534 ArgStringList &CmdArgs) {
Sean Silvaa834ff22016-07-16 02:54:58 +00003535
3536 auto *PGOGenerateArg = Args.getLastArg(options::OPT_fprofile_generate,
3537 options::OPT_fprofile_generate_EQ,
3538 options::OPT_fno_profile_generate);
3539 if (PGOGenerateArg &&
3540 PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
3541 PGOGenerateArg = nullptr;
3542
Diego Novilloa0545962015-07-10 18:00:07 +00003543 auto *ProfileGenerateArg = Args.getLastArg(
3544 options::OPT_fprofile_instr_generate,
Sean Silvaa834ff22016-07-16 02:54:58 +00003545 options::OPT_fprofile_instr_generate_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003546 options::OPT_fno_profile_instr_generate);
3547 if (ProfileGenerateArg &&
3548 ProfileGenerateArg->getOption().matches(
3549 options::OPT_fno_profile_instr_generate))
3550 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003551
Sean Silvaa834ff22016-07-16 02:54:58 +00003552 if (PGOGenerateArg && ProfileGenerateArg)
3553 D.Diag(diag::err_drv_argument_not_allowed_with)
3554 << PGOGenerateArg->getSpelling() << ProfileGenerateArg->getSpelling();
3555
Diego Novilloa0545962015-07-10 18:00:07 +00003556 auto *ProfileUseArg = Args.getLastArg(
3557 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003558 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3559 options::OPT_fno_profile_instr_use);
3560 if (ProfileUseArg &&
3561 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3562 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003563
Sean Silvaa834ff22016-07-16 02:54:58 +00003564 if (PGOGenerateArg && ProfileUseArg)
3565 D.Diag(diag::err_drv_argument_not_allowed_with)
3566 << ProfileUseArg->getSpelling() << PGOGenerateArg->getSpelling();
3567
Diego Novilloa0545962015-07-10 18:00:07 +00003568 if (ProfileGenerateArg && ProfileUseArg)
3569 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003570 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003571
Diego Novillo758f3f52015-08-05 21:49:51 +00003572 if (ProfileGenerateArg) {
3573 if (ProfileGenerateArg->getOption().matches(
3574 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003575 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3576 ProfileGenerateArg->getValue()));
Sean Silvaa834ff22016-07-16 02:54:58 +00003577 // The default is to use Clang Instrumentation.
3578 CmdArgs.push_back("-fprofile-instrument=clang");
3579 }
3580
3581 if (PGOGenerateArg) {
3582 CmdArgs.push_back("-fprofile-instrument=llvm");
3583 if (PGOGenerateArg->getOption().matches(
3584 options::OPT_fprofile_generate_EQ)) {
3585 SmallString<128> Path(PGOGenerateArg->getValue());
Xinliang David Lib7b335a2016-07-22 22:25:01 +00003586 llvm::sys::path::append(Path, "default_%m.profraw");
Diego Novillo758f3f52015-08-05 21:49:51 +00003587 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003588 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3589 }
Diego Novillo758f3f52015-08-05 21:49:51 +00003590 }
Diego Novilloa0545962015-07-10 18:00:07 +00003591
Diego Novillo758f3f52015-08-05 21:49:51 +00003592 if (ProfileUseArg) {
3593 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003594 CmdArgs.push_back(Args.MakeArgString(
3595 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003596 else if ((ProfileUseArg->getOption().matches(
3597 options::OPT_fprofile_use_EQ) ||
3598 ProfileUseArg->getOption().matches(
3599 options::OPT_fprofile_instr_use))) {
3600 SmallString<128> Path(
3601 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3602 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3603 llvm::sys::path::append(Path, "default.profdata");
3604 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003605 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003606 }
Diego Novilloa0545962015-07-10 18:00:07 +00003607 }
3608
3609 if (Args.hasArg(options::OPT_ftest_coverage) ||
3610 Args.hasArg(options::OPT_coverage))
3611 CmdArgs.push_back("-femit-coverage-notes");
3612 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3613 false) ||
3614 Args.hasArg(options::OPT_coverage))
3615 CmdArgs.push_back("-femit-coverage-data");
3616
Diego Novilloc4b94da2015-08-05 23:27:40 +00003617 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3618 options::OPT_fno_coverage_mapping, false) &&
3619 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003620 D.Diag(diag::err_drv_argument_only_allowed_with)
3621 << "-fcoverage-mapping"
3622 << "-fprofile-instr-generate";
3623
Diego Novilloc4b94da2015-08-05 23:27:40 +00003624 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3625 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003626 CmdArgs.push_back("-fcoverage-mapping");
3627
3628 if (C.getArgs().hasArg(options::OPT_c) ||
3629 C.getArgs().hasArg(options::OPT_S)) {
3630 if (Output.isFilename()) {
3631 CmdArgs.push_back("-coverage-file");
3632 SmallString<128> CoverageFilename;
3633 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3634 CoverageFilename = FinalOutput->getValue();
3635 } else {
3636 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3637 }
3638 if (llvm::sys::path::is_relative(CoverageFilename)) {
3639 SmallString<128> Pwd;
3640 if (!llvm::sys::fs::current_path(Pwd)) {
3641 llvm::sys::path::append(Pwd, CoverageFilename);
3642 CoverageFilename.swap(Pwd);
3643 }
3644 }
3645 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3646 }
3647 }
3648}
3649
Paul Robinsond083b9a2015-12-16 17:25:27 +00003650static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3651 ArgStringList &CmdArgs) {
3652 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3653 false) ||
3654 Args.hasFlag(options::OPT_fprofile_generate,
3655 options::OPT_fno_profile_instr_generate, false) ||
3656 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3657 options::OPT_fno_profile_instr_generate, false) ||
3658 Args.hasFlag(options::OPT_fprofile_instr_generate,
3659 options::OPT_fno_profile_instr_generate, false) ||
3660 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3661 options::OPT_fno_profile_instr_generate, false) ||
3662 Args.hasArg(options::OPT_fcreate_profile) ||
3663 Args.hasArg(options::OPT_coverage)))
3664 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3665}
3666
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003667/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3668/// smooshes them together with platform defaults, to decide whether
3669/// this compile should be using PIC mode or not. Returns a tuple of
3670/// (RelocationModel, PICLevel, IsPIE).
3671static std::tuple<llvm::Reloc::Model, unsigned, bool>
3672ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3673 const ArgList &Args) {
3674 // FIXME: why does this code...and so much everywhere else, use both
3675 // ToolChain.getTriple() and Triple?
3676 bool PIE = ToolChain.isPIEDefault();
3677 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003678 // The Darwin/MachO default to use PIC does not apply when using -static.
3679 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3680 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003681 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003682 bool IsPICLevelTwo = PIC;
3683
3684 bool KernelOrKext =
3685 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3686
3687 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003688 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003689 switch (ToolChain.getArch()) {
3690 case llvm::Triple::arm:
3691 case llvm::Triple::armeb:
3692 case llvm::Triple::thumb:
3693 case llvm::Triple::thumbeb:
3694 case llvm::Triple::aarch64:
3695 case llvm::Triple::mips:
3696 case llvm::Triple::mipsel:
3697 case llvm::Triple::mips64:
3698 case llvm::Triple::mips64el:
3699 PIC = true; // "-fpic"
3700 break;
3701
3702 case llvm::Triple::x86:
3703 case llvm::Triple::x86_64:
3704 PIC = true; // "-fPIC"
3705 IsPICLevelTwo = true;
3706 break;
3707
3708 default:
3709 break;
3710 }
3711 }
3712
3713 // OpenBSD-specific defaults for PIE
3714 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3715 switch (ToolChain.getArch()) {
3716 case llvm::Triple::mips64:
3717 case llvm::Triple::mips64el:
3718 case llvm::Triple::sparcel:
3719 case llvm::Triple::x86:
3720 case llvm::Triple::x86_64:
3721 IsPICLevelTwo = false; // "-fpie"
3722 break;
3723
3724 case llvm::Triple::ppc:
3725 case llvm::Triple::sparc:
3726 case llvm::Triple::sparcv9:
3727 IsPICLevelTwo = true; // "-fPIE"
3728 break;
3729
3730 default:
3731 break;
3732 }
3733 }
3734
3735 // The last argument relating to either PIC or PIE wins, and no
3736 // other argument is used. If the last argument is any flavor of the
3737 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3738 // option implicitly enables PIC at the same level.
3739 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3740 options::OPT_fpic, options::OPT_fno_pic,
3741 options::OPT_fPIE, options::OPT_fno_PIE,
3742 options::OPT_fpie, options::OPT_fno_pie);
3743 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3744 // is forced, then neither PIC nor PIE flags will have no effect.
3745 if (!ToolChain.isPICDefaultForced()) {
3746 if (LastPICArg) {
3747 Option O = LastPICArg->getOption();
3748 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3749 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3750 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3751 PIC =
3752 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3753 IsPICLevelTwo =
3754 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3755 } else {
3756 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003757 if (Triple.isPS4CPU()) {
3758 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3759 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3760 if (Model != "kernel") {
3761 PIC = true;
3762 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3763 << LastPICArg->getSpelling();
3764 }
3765 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003766 }
3767 }
3768 }
3769
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003770 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3771 // PIC level would've been set to level 1, force it back to level 2 PIC
3772 // instead.
3773 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003774 IsPICLevelTwo |= ToolChain.isPICDefault();
3775
James Y Knightc4015d32015-08-21 04:14:55 +00003776 // This kernel flags are a trump-card: they will disable PIC/PIE
3777 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003778 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3779 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003780 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003781
3782 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3783 // This is a very special mode. It trumps the other modes, almost no one
3784 // uses it, and it isn't even valid on any OS but Darwin.
3785 if (!ToolChain.getTriple().isOSDarwin())
3786 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3787 << A->getSpelling() << ToolChain.getTriple().str();
3788
3789 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3790
3791 // Only a forced PIC mode can cause the actual compile to have PIC defines
3792 // etc., no flags are sufficient. This behavior was selected to closely
3793 // match that of llvm-gcc and Apple GCC before that.
3794 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3795
Vedant Kumarae7e39a2016-07-27 03:43:34 +00003796 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0U, false);
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003797 }
3798
Oliver Stannard218c4cb2016-08-08 15:28:40 +00003799 bool EmbeddedPISupported;
3800 switch (ToolChain.getArch()) {
3801 case llvm::Triple::arm:
3802 case llvm::Triple::armeb:
3803 case llvm::Triple::thumb:
3804 case llvm::Triple::thumbeb:
3805 EmbeddedPISupported = true;
3806 break;
3807 default:
3808 EmbeddedPISupported = false;
3809 break;
3810 }
3811
3812 bool ROPI = false, RWPI = false;
3813 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
3814 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
3815 if (!EmbeddedPISupported)
3816 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3817 << LastROPIArg->getSpelling() << ToolChain.getTriple().str();
3818 ROPI = true;
3819 }
3820 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
3821 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
3822 if (!EmbeddedPISupported)
3823 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3824 << LastRWPIArg->getSpelling() << ToolChain.getTriple().str();
3825 RWPI = true;
3826 }
3827
3828 // ROPI and RWPI are not comaptible with PIC or PIE.
3829 if ((ROPI || RWPI) && (PIC || PIE)) {
3830 ToolChain.getDriver().Diag(diag::err_drv_ropi_rwpi_incompatible_with_pic);
3831 }
3832
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003833 if (PIC)
Vedant Kumarae7e39a2016-07-27 03:43:34 +00003834 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003835
Oliver Stannard218c4cb2016-08-08 15:28:40 +00003836 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
3837 if (ROPI && RWPI)
3838 RelocM = llvm::Reloc::ROPI_RWPI;
3839 else if (ROPI)
3840 RelocM = llvm::Reloc::ROPI;
3841 else if (RWPI)
3842 RelocM = llvm::Reloc::RWPI;
3843
3844 return std::make_tuple(RelocM, 0U, false);
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003845}
3846
3847static const char *RelocationModelName(llvm::Reloc::Model Model) {
3848 switch (Model) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003849 case llvm::Reloc::Static:
3850 return "static";
3851 case llvm::Reloc::PIC_:
3852 return "pic";
3853 case llvm::Reloc::DynamicNoPIC:
3854 return "dynamic-no-pic";
Oliver Stannard218c4cb2016-08-08 15:28:40 +00003855 case llvm::Reloc::ROPI:
3856 return "ropi";
3857 case llvm::Reloc::RWPI:
3858 return "rwpi";
3859 case llvm::Reloc::ROPI_RWPI:
3860 return "ropi-rwpi";
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003861 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003862 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003863}
3864
3865static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3866 ArgStringList &CmdArgs) {
3867 llvm::Reloc::Model RelocationModel;
3868 unsigned PICLevel;
3869 bool IsPIE;
3870 std::tie(RelocationModel, PICLevel, IsPIE) =
3871 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3872
3873 if (RelocationModel != llvm::Reloc::Static)
3874 CmdArgs.push_back("-KPIC");
3875}
3876
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003877void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003878 const InputInfo &Output, const InputInfoList &Inputs,
3879 const ArgList &Args, const char *LinkingOutput) const {
Vedant Kumar18286cf2016-07-27 23:02:20 +00003880 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
3881 const std::string &TripleStr = Triple.getTriple();
James Y Knight2db38f32015-08-15 03:45:25 +00003882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003883 bool KernelOrKext =
3884 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003885 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003886 ArgStringList CmdArgs;
3887
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003888 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003889 bool IsWindowsCygnus =
3890 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003891 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003892 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00003893 bool IsIAMCU = getToolChain().getTriple().isOSIAMCU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003894
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003895 // Check number of inputs for sanity. We need at least one input.
3896 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003897 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003898 // CUDA compilation may have multiple inputs (source file + results of
3899 // device-side compilations). All other jobs are expected to have exactly one
3900 // input.
Samuel Antaod06239d2016-07-15 23:13:27 +00003901 bool IsCuda = JA.isOffloading(Action::OFK_Cuda);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003902 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003903
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00003904 // C++ is not supported for IAMCU.
3905 if (IsIAMCU && types::isCXX(Input.getType()))
3906 D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU";
3907
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003908 // Invoke ourselves in -cc1 mode.
3909 //
3910 // FIXME: Implement custom jobs for internal actions.
3911 CmdArgs.push_back("-cc1");
3912
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003913 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003914 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003915 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003916
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003917 if (IsCuda) {
Samuel Antaod06239d2016-07-15 23:13:27 +00003918 // We have to pass the triple of the host if compiling for a CUDA device and
3919 // vice-versa.
Samuel Antao2f7b3392016-07-16 00:15:56 +00003920 std::string NormalizedTriple;
Samuel Antaod06239d2016-07-15 23:13:27 +00003921 if (JA.isDeviceOffloading(Action::OFK_Cuda))
3922 NormalizedTriple = C.getSingleOffloadToolChain<Action::OFK_Host>()
3923 ->getTriple()
3924 .normalize();
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003925 else
Samuel Antaod06239d2016-07-15 23:13:27 +00003926 NormalizedTriple = C.getSingleOffloadToolChain<Action::OFK_Cuda>()
3927 ->getTriple()
3928 .normalize();
3929
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003930 CmdArgs.push_back("-aux-triple");
Samuel Antaod06239d2016-07-15 23:13:27 +00003931 CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003932 }
3933
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003934 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3935 Triple.getArch() == llvm::Triple::thumb)) {
3936 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003937 unsigned Version;
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003938 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003939 if (Version < 7)
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003940 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003941 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003942 }
3943
Tim Northover336f1892014-03-29 13:16:12 +00003944 // Push all default warning arguments that are specific to
3945 // the given target. These come before user provided warning options
3946 // are provided.
3947 getToolChain().addClangWarningOptions(CmdArgs);
3948
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003949 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003950 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003951
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003952 if (isa<AnalyzeJobAction>(JA)) {
3953 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3954 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003955 } else if (isa<MigrateJobAction>(JA)) {
3956 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003957 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003958 if (Output.getType() == types::TY_Dependencies)
3959 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003960 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003961 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003962 if (Args.hasArg(options::OPT_rewrite_objc) &&
3963 !Args.hasArg(options::OPT_g_Group))
3964 CmdArgs.push_back("-P");
3965 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003966 } else if (isa<AssembleJobAction>(JA)) {
3967 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003968
David Blaikie9260ed62013-07-25 21:19:01 +00003969 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003970
3971 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003972 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003974 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003975 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003976
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003977 if (JA.getType() == types::TY_Nothing)
3978 CmdArgs.push_back("-fsyntax-only");
3979 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003980 CmdArgs.push_back("-emit-pch");
3981 else
3982 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003983 } else if (isa<VerifyPCHJobAction>(JA)) {
3984 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003985 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003986 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3987 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003988 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003989 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003990 } else if (JA.getType() == types::TY_LLVM_IR ||
3991 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003992 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003993 } else if (JA.getType() == types::TY_LLVM_BC ||
3994 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003995 CmdArgs.push_back("-emit-llvm-bc");
3996 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003997 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003998 } else if (JA.getType() == types::TY_AST) {
3999 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004000 } else if (JA.getType() == types::TY_ModuleFile) {
4001 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004002 } else if (JA.getType() == types::TY_RewrittenObjC) {
4003 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00004004 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00004005 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
4006 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00004007 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004008 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004009 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004010 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00004011
4012 // Preserve use-list order by default when emitting bitcode, so that
4013 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
4014 // same result as running passes here. For LTO, we don't need to preserve
4015 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00004016 if (JA.getType() == types::TY_LLVM_BC)
4017 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00004018
4019 if (D.isUsingLTO())
4020 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004021 }
4022
Teresa Johnsonaff22322015-12-07 19:21:34 +00004023 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
4024 if (!types::isLLVMIR(Input.getType()))
4025 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4026 << "-x ir";
4027 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
4028 }
4029
Steven Wu574b0f22016-03-01 01:07:58 +00004030 // Embed-bitcode option.
4031 if (C.getDriver().embedBitcodeEnabled() &&
4032 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
4033 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00004034 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00004035 // Disable all llvm IR level optimizations.
4036 CmdArgs.push_back("-disable-llvm-optzns");
4037 }
4038 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00004039 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00004040
Justin Bognera88f0122014-06-20 22:59:50 +00004041 // We normally speed up the clang process a bit by skipping destructors at
4042 // exit, but when we're generating diagnostics we can rely on some of the
4043 // cleanup.
4044 if (!C.isForDiagnostics())
4045 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004047// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00004048#ifdef NDEBUG
4049 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00004050 // Discard LLVM value names in -asserts builds.
4051 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00004052#endif
4053
Daniel Dunbar3b358a32009-04-08 05:11:16 +00004054 // Set the main file name, so that debug info works even with
4055 // -save-temps.
4056 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00004057 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00004058
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00004059 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00004060 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00004061 if (Args.hasArg(options::OPT_static))
4062 CmdArgs.push_back("-static-define");
4063
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004064 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00004065 // Enable region store model by default.
4066 CmdArgs.push_back("-analyzer-store=region");
4067
Ted Kremenek7bea9a12009-12-07 22:26:14 +00004068 // Treat blocks as analysis entry points.
4069 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
4070
Ted Kremenek49c79792011-03-24 00:28:47 +00004071 CmdArgs.push_back("-analyzer-eagerly-assume");
4072
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004073 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00004074 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00004075 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00004076
Devin Coughlin65c77082016-01-21 20:09:49 +00004077 if (!IsWindowsMSVC) {
4078 CmdArgs.push_back("-analyzer-checker=unix");
4079 } else {
4080 // Enable "unix" checkers that also work on Windows.
4081 CmdArgs.push_back("-analyzer-checker=unix.API");
4082 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
4083 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
4084 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
4085 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
4086 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
4087 }
Ted Kremenek49c79792011-03-24 00:28:47 +00004088
Sean Evesonb38c32b2016-01-06 10:03:58 +00004089 // Disable some unix checkers for PS4.
4090 if (IsPS4CPU) {
4091 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
4092 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
4093 }
4094
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00004095 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00004096 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004097
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00004098 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004099
Artem Belevichba558952015-05-06 18:20:23 +00004100 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00004101 CmdArgs.push_back("-analyzer-checker=cplusplus");
4102
Sean Evesonb38c32b2016-01-06 10:03:58 +00004103 if (!IsPS4CPU) {
4104 CmdArgs.push_back(
4105 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
4106 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
4107 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
4108 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
4109 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
4110 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
4111 }
Gabor Horvathe3085992015-09-14 20:34:06 +00004112
4113 // Default nullability checks.
4114 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
4115 CmdArgs.push_back(
4116 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00004117 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004118
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00004119 // Set the output format. The default is plist, for (lame) historical
4120 // reasons.
4121 CmdArgs.push_back("-analyzer-output");
4122 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00004123 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00004124 else
4125 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004126
Ted Kremenekfe449a22010-03-22 22:32:05 +00004127 // Disable the presentation of standard compiler warnings when
4128 // using --analyze. We only want to show static analyzer diagnostics
4129 // or frontend errors.
4130 CmdArgs.push_back("-w");
4131
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004132 // Add -Xanalyzer arguments when running as analyzer.
4133 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00004134 }
4135
Daniel Dunbar4eadb602009-09-10 01:21:12 +00004136 CheckCodeGenerationOptions(D, Args);
4137
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004138 llvm::Reloc::Model RelocationModel;
4139 unsigned PICLevel;
4140 bool IsPIE;
4141 std::tie(RelocationModel, PICLevel, IsPIE) =
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004142 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004143
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004144 const char *RMName = RelocationModelName(RelocationModel);
Oliver Stannard218c4cb2016-08-08 15:28:40 +00004145
4146 if ((RelocationModel == llvm::Reloc::ROPI ||
4147 RelocationModel == llvm::Reloc::ROPI_RWPI) &&
4148 types::isCXX(Input.getType()) &&
4149 !Args.hasArg(options::OPT_fallow_unsupported))
4150 D.Diag(diag::err_drv_ropi_incompatible_with_cxx);
4151
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004152 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004153 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00004154 CmdArgs.push_back(RMName);
4155 }
4156 if (PICLevel > 0) {
4157 CmdArgs.push_back("-pic-level");
4158 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Rafael Espindolac9d336e2016-06-23 15:07:32 +00004159 if (IsPIE)
4160 CmdArgs.push_back("-pic-is-pie");
Daniel Dunbar44e71222009-04-29 18:32:25 +00004161 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00004162
Renato Golin4854d802015-11-09 12:40:41 +00004163 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
4164 CmdArgs.push_back("-meabi");
4165 CmdArgs.push_back(A->getValue());
4166 }
4167
Jonathan Roelofsb140a102014-10-03 21:57:44 +00004168 CmdArgs.push_back("-mthread-model");
4169 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
4170 CmdArgs.push_back(A->getValue());
4171 else
4172 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
4173
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00004174 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
4175
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00004176 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
4177 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00004178 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00004179
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004180 // LLVM Code Generator Options.
4181
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004182 if (Args.hasArg(options::OPT_frewrite_map_file) ||
4183 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00004184 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
4185 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004186 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00004187 CmdArgs.push_back(A->getValue());
4188 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004189 }
4190 }
4191
Alp Tokerfb8d02b2014-06-05 22:10:59 +00004192 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
4193 StringRef v = A->getValue();
4194 CmdArgs.push_back("-mllvm");
4195 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
4196 A->claim();
4197 }
4198
Nirav Daved2f44d82016-04-05 17:50:43 +00004199 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
4200 true))
4201 CmdArgs.push_back("-fno-jump-tables");
4202
Nirav Dave993a1392016-07-27 19:57:40 +00004203 if (!Args.hasFlag(options::OPT_fpreserve_as_comments,
4204 options::OPT_fno_preserve_as_comments, true))
4205 CmdArgs.push_back("-fno-preserve-as-comments");
4206
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004207 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
4208 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00004209 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004210 }
4211
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004212 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4213 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004214 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00004215 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004216 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00004217 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4218 CmdArgs.push_back("-fpcc-struct-return");
4219 } else {
4220 assert(A->getOption().matches(options::OPT_freg_struct_return));
4221 CmdArgs.push_back("-freg-struct-return");
4222 }
4223 }
4224
Roman Divacky65b88cd2011-03-01 17:40:53 +00004225 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Alexey Bataeva7547182016-05-18 09:06:38 +00004226 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divacky65b88cd2011-03-01 17:40:53 +00004227
Rafael Espindola224dd632011-12-14 21:02:23 +00004228 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004229 CmdArgs.push_back("-mdisable-fp-elim");
4230 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4231 options::OPT_fno_zero_initialized_in_bss))
4232 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004233
4234 bool OFastEnabled = isOptimizationLevelFast(Args);
4235 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4236 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004237 OptSpecifier StrictAliasingAliasOption =
4238 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004239 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4240 // doesn't do any TBAA.
4241 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004242 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004243 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00004244 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00004245 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4246 options::OPT_fno_struct_path_tbaa))
4247 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00004248 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4249 false))
4250 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004251 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004252 options::OPT_fno_strict_vtable_pointers,
4253 false))
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004254 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00004255 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4256 options::OPT_fno_optimize_sibling_calls))
4257 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004258
Eric Christopher006208c2013-04-04 06:29:47 +00004259 // Handle segmented stacks.
4260 if (Args.hasArg(options::OPT_fsplit_stack))
4261 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004262
4263 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4264 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004265 OptSpecifier FastMathAliasOption =
4266 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4267
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004268 // Handle various floating point optimization flags, mapping them to the
4269 // appropriate LLVM code generation flags. The pattern for all of these is to
4270 // default off the codegen optimizations, and if any flag enables them and no
4271 // flag disables them after the flag enabling them, enable the codegen
4272 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004273 if (Arg *A = Args.getLastArg(
4274 options::OPT_ffast_math, FastMathAliasOption,
4275 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4276 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4277 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004278 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4279 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004280 A->getOption().getID() != options::OPT_fhonor_infinities)
4281 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004282 if (Arg *A = Args.getLastArg(
4283 options::OPT_ffast_math, FastMathAliasOption,
4284 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4285 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4286 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004287 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4288 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004289 A->getOption().getID() != options::OPT_fhonor_nans)
4290 CmdArgs.push_back("-menable-no-nans");
4291
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004292 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4293 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004294 if (Arg *A =
4295 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4296 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4297 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004298 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4299 // However, turning *off* -ffast_math merely restores the toolchain default
4300 // (which may be false).
4301 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4302 A->getOption().getID() == options::OPT_ffast_math ||
4303 A->getOption().getID() == options::OPT_Ofast)
4304 MathErrno = false;
4305 else if (A->getOption().getID() == options::OPT_fmath_errno)
4306 MathErrno = true;
4307 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004308 if (MathErrno)
4309 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004310
4311 // There are several flags which require disabling very specific
4312 // optimizations. Any of these being disabled forces us to turn off the
4313 // entire set of LLVM optimizations, so collect them through all the flag
4314 // madness.
4315 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004316 if (Arg *A = Args.getLastArg(
4317 options::OPT_ffast_math, FastMathAliasOption,
4318 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4319 options::OPT_fno_unsafe_math_optimizations,
4320 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004321 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4322 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004323 A->getOption().getID() != options::OPT_fno_associative_math)
4324 AssociativeMath = true;
4325 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004326 if (Arg *A = Args.getLastArg(
4327 options::OPT_ffast_math, FastMathAliasOption,
4328 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4329 options::OPT_fno_unsafe_math_optimizations,
4330 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004331 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4332 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004333 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4334 ReciprocalMath = true;
4335 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004336 if (Arg *A = Args.getLastArg(
4337 options::OPT_ffast_math, FastMathAliasOption,
4338 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4339 options::OPT_fno_unsafe_math_optimizations,
4340 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004341 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4342 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004343 A->getOption().getID() != options::OPT_fsigned_zeros)
4344 SignedZeros = false;
4345 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004346 if (Arg *A = Args.getLastArg(
4347 options::OPT_ffast_math, FastMathAliasOption,
4348 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4349 options::OPT_fno_unsafe_math_optimizations,
4350 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004351 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4352 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004353 A->getOption().getID() != options::OPT_ftrapping_math)
4354 TrappingMath = false;
4355 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4356 !TrappingMath)
4357 CmdArgs.push_back("-menable-unsafe-fp-math");
4358
Sanjay Patel76c9e092015-01-23 16:40:50 +00004359 if (!SignedZeros)
4360 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004361
Sanjay Patel359b1052015-04-09 15:03:23 +00004362 if (ReciprocalMath)
4363 CmdArgs.push_back("-freciprocal-math");
4364
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004365 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004366 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004367 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004368 options::OPT_ffp_contract)) {
4369 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004370 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004371 if (Val == "fast" || Val == "on" || Val == "off") {
4372 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4373 } else {
4374 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004375 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004376 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004377 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4378 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004379 // If fast-math is set then set the fp-contract mode to fast.
4380 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4381 }
4382 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004383
Sanjay Patel2987c292015-06-11 14:53:41 +00004384 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004385
Bob Wilson6a039162012-07-19 03:52:53 +00004386 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4387 // and if we find them, tell the frontend to provide the appropriate
4388 // preprocessor macros. This is distinct from enabling any optimizations as
4389 // these options induce language changes which must survive serialization
4390 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004391 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4392 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004393 if (!A->getOption().matches(options::OPT_fno_fast_math))
4394 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004395 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4396 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004397 if (A->getOption().matches(options::OPT_ffinite_math_only))
4398 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004399
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004400 // Decide whether to use verbose asm. Verbose assembly is the default on
4401 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004402 bool IsIntegratedAssemblerDefault =
4403 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004404 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004405 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004406 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004407 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004408
Rafael Espindolab8a12932015-05-22 20:44:03 +00004409 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4410 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004411 CmdArgs.push_back("-no-integrated-as");
4412
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004413 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4414 CmdArgs.push_back("-mdebug-pass");
4415 CmdArgs.push_back("Structure");
4416 }
4417 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4418 CmdArgs.push_back("-mdebug-pass");
4419 CmdArgs.push_back("Arguments");
4420 }
4421
Justin Lebar710a35f2016-01-25 22:36:35 +00004422 // Enable -mconstructor-aliases except on darwin, where we have to work around
4423 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4424 // aliases aren't supported.
4425 if (!getToolChain().getTriple().isOSDarwin() &&
4426 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004427 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004428
John McCall7ef5cb32011-03-18 02:56:14 +00004429 // Darwin's kernel doesn't support guard variables; just die if we
4430 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004431 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004432 CmdArgs.push_back("-fforbid-guard-variables");
4433
Akira Hatanaka02028482015-11-12 17:21:22 +00004434 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4435 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004436 CmdArgs.push_back("-mms-bitfields");
4437 }
John McCall8517abc2010-02-19 02:45:38 +00004438
Daniel Dunbar306945d2009-09-16 06:17:29 +00004439 // This is a coarse approximation of what llvm-gcc actually does, both
4440 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4441 // complicated ways.
4442 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004443 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4444 options::OPT_fno_asynchronous_unwind_tables,
4445 (getToolChain().IsUnwindTablesDefault() ||
4446 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4447 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004448 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4449 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004450 CmdArgs.push_back("-munwind-tables");
4451
Chandler Carruth05fb5852012-11-21 23:40:23 +00004452 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004453
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004454 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4455 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004456 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004457 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004458
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004459 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004460 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004461
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004462 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004463 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004464 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004465 }
4466
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004467 // Add the target cpu
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004468 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004469 if (!CPU.empty()) {
4470 CmdArgs.push_back("-target-cpu");
4471 CmdArgs.push_back(Args.MakeArgString(CPU));
4472 }
4473
Rafael Espindolaeb265472013-08-21 21:59:03 +00004474 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4475 CmdArgs.push_back("-mfpmath");
4476 CmdArgs.push_back(A->getValue());
4477 }
4478
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004479 // Add the target features
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004480 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004481
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004482 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004483 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004484 default:
4485 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004486
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004487 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004488 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004489 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004490 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004491 // Use the effective triple, which takes into account the deployment target.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004492 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004493 break;
4494
Tim Northover573cbee2014-05-24 12:52:07 +00004495 case llvm::Triple::aarch64:
4496 case llvm::Triple::aarch64_be:
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004497 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004498 break;
4499
Eric Christopher0b26a612010-03-02 02:41:08 +00004500 case llvm::Triple::mips:
4501 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004502 case llvm::Triple::mips64:
4503 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004504 AddMIPSTargetArgs(Args, CmdArgs);
4505 break;
4506
Ulrich Weigand8afad612014-07-28 13:17:52 +00004507 case llvm::Triple::ppc:
4508 case llvm::Triple::ppc64:
4509 case llvm::Triple::ppc64le:
4510 AddPPCTargetArgs(Args, CmdArgs);
4511 break;
4512
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004513 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004514 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004515 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004516 AddSparcTargetArgs(Args, CmdArgs);
4517 break;
4518
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004519 case llvm::Triple::systemz:
4520 AddSystemZTargetArgs(Args, CmdArgs);
4521 break;
4522
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004523 case llvm::Triple::x86:
4524 case llvm::Triple::x86_64:
4525 AddX86TargetArgs(Args, CmdArgs);
4526 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004527
Jacques Pienaard964cc22016-03-28 21:02:54 +00004528 case llvm::Triple::lanai:
4529 AddLanaiTargetArgs(Args, CmdArgs);
4530 break;
4531
Tony Linthicum76329bf2011-12-12 21:14:55 +00004532 case llvm::Triple::hexagon:
4533 AddHexagonTargetArgs(Args, CmdArgs);
4534 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004535
4536 case llvm::Triple::wasm32:
4537 case llvm::Triple::wasm64:
4538 AddWebAssemblyTargetArgs(Args, CmdArgs);
4539 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004540 }
4541
Douglas Katzman3459ce22015-10-08 04:24:12 +00004542 // The 'g' groups options involve a somewhat intricate sequence of decisions
4543 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004544 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004545 // * what level of debug info to generate
4546 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004547 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004548 // This avoids having to monkey around further in cc1 other than to disable
4549 // codeview if not running in a Windows environment. Perhaps even that
4550 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004551 unsigned DwarfVersion = 0;
4552 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4553 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004554 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004555 bool EmitCodeView = false;
4556
Hans Wennborg75958c42013-08-08 00:17:41 +00004557 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004558 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004559 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004560 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004561
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004562 // Pass the linker version in use.
4563 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4564 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004565 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004566 }
4567
Eric Christopherb7d97e92013-04-03 01:58:53 +00004568 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004569 CmdArgs.push_back("-momit-leaf-frame-pointer");
4570
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004571 // Explicitly error on some things we know we don't support and can't just
4572 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004573 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4574 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004575 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004576 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004577 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4578 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004579 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004580 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004581 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004582 }
4583
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004584 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004585 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004586 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004587 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004588 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4589 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004590 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004591 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004592 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004593
Chad Rosierbe10f982011-08-02 17:58:04 +00004594 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004595 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004596 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4597 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004598 }
4599
David Blaikie3d0a0392016-08-24 23:22:36 +00004600 bool splitDwarfInlining =
4601 Args.hasFlag(options::OPT_fsplit_dwarf_inlining,
4602 options::OPT_fno_split_dwarf_inlining, true);
4603 if (!splitDwarfInlining)
4604 CmdArgs.push_back("-fno-split-dwarf-inlining");
4605
Rafael Espindola08a692a2010-03-07 04:46:18 +00004606 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004607 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004608 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004609 // If the last option explicitly specified a debug-info level, use it.
4610 if (A->getOption().matches(options::OPT_gN_Group)) {
4611 DebugInfoKind = DebugLevelToInfoKind(*A);
4612 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4613 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4614 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
David Blaikie3d0a0392016-08-24 23:22:36 +00004615 // This gets a bit more complicated if you've disabled inline info in the
4616 // skeleton CUs (splitDwarfInlining) - then there's value in composing
4617 // split-dwarf and line-tables-only, so let those compose naturally in
4618 // that case.
4619 // And if you just turned off debug info, (-gsplit-dwarf -g0) - do that.
4620 if (SplitDwarfArg && A->getIndex() > SplitDwarfArg->getIndex() &&
4621 ((DebugInfoKind == codegenoptions::DebugLineTablesOnly &&
4622 splitDwarfInlining) ||
4623 DebugInfoKind == codegenoptions::NoDebugInfo))
Paul Robinson0334a042015-12-19 19:41:48 +00004624 SplitDwarfArg = nullptr;
4625 } else
4626 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004627 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004628 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004629
Paul Robinson0334a042015-12-19 19:41:48 +00004630 // If a debugger tuning argument appeared, remember it.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004631 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4632 options::OPT_ggdbN_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004633 if (A->getOption().matches(options::OPT_glldb))
4634 DebuggerTuning = llvm::DebuggerKind::LLDB;
4635 else if (A->getOption().matches(options::OPT_gsce))
4636 DebuggerTuning = llvm::DebuggerKind::SCE;
4637 else
4638 DebuggerTuning = llvm::DebuggerKind::GDB;
4639 }
4640
4641 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004642 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004643 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004644 DwarfVersion = DwarfVersionNum(A->getSpelling());
4645
Reid Klecknerbab5a5d2016-08-09 17:23:56 +00004646 // Forward -gcodeview. EmitCodeView might have been set by CL-compatibility
4647 // argument parsing.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004648 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4649 // DwarfVersion remains at 0 if no explicit choice was made.
4650 CmdArgs.push_back("-gcodeview");
4651 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004652 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004653 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4654 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004655
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004656 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4657 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004658
Adrian McCarthy084148f2016-08-25 18:24:35 +00004659 // Column info is included by default for everything except PS4 and CodeView.
4660 // Clang doesn't track end columns, just starting columns, which, in theory,
4661 // is fine for CodeView (and PDB). In practice, however, the Microsoft
4662 // debuggers don't handle missing end columns well, so it's better not to
4663 // include any column info.
Diego Novillo94b276d2014-07-10 23:29:28 +00004664 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Adrian McCarthy084148f2016-08-25 18:24:35 +00004665 /*Default=*/ !IsPS4CPU && !(IsWindowsMSVC && EmitCodeView)))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004666 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004667
Eric Christopher138c32b2013-09-13 22:37:55 +00004668 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004669 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004670 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004671 CmdArgs.push_back("-dwarf-ext-refs");
4672 CmdArgs.push_back("-fmodule-format=obj");
4673 }
4674
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004675 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4676 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004677 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004678 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
David Blaikie3d0a0392016-08-24 23:22:36 +00004679 if (splitDwarfInlining)
4680 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004681 CmdArgs.push_back("-backend-option");
4682 CmdArgs.push_back("-split-dwarf=Enable");
4683 }
4684
Douglas Katzman3459ce22015-10-08 04:24:12 +00004685 // After we've dealt with all combinations of things that could
4686 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4687 // figure out if we need to "upgrade" it to standalone debug info.
4688 // We parse these two '-f' options whether or not they will be used,
4689 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4690 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4691 options::OPT_fno_standalone_debug,
4692 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004693 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4694 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004695 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4696 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004697
Eric Christopher138c32b2013-09-13 22:37:55 +00004698 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4699 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4700 CmdArgs.push_back("-backend-option");
4701 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4702 }
Eric Christophereec89c22013-06-18 00:03:50 +00004703
Eric Christopher0d403d22014-02-14 01:27:03 +00004704 // -gdwarf-aranges turns on the emission of the aranges section in the
4705 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004706 // Always enabled on the PS4.
4707 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004708 CmdArgs.push_back("-backend-option");
4709 CmdArgs.push_back("-generate-arange-section");
4710 }
4711
David Blaikief36d9ba2014-01-27 18:52:43 +00004712 if (Args.hasFlag(options::OPT_fdebug_types_section,
4713 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004714 CmdArgs.push_back("-backend-option");
4715 CmdArgs.push_back("-generate-type-units");
4716 }
Eric Christophereec89c22013-06-18 00:03:50 +00004717
Dan Gohmana5b804b2016-01-07 00:50:27 +00004718 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4719 // default.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004720 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4721 Triple.getArch() == llvm::Triple::wasm32 ||
4722 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004723
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004724 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004725 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004726 CmdArgs.push_back("-ffunction-sections");
4727 }
4728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004729 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4730 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004731 CmdArgs.push_back("-fdata-sections");
4732 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004733
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004734 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004735 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004736 CmdArgs.push_back("-fno-unique-section-names");
4737
Chris Lattner3c77a352010-06-22 00:03:40 +00004738 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4739
Dean Michael Berris25a15642016-07-14 06:37:46 +00004740 if (Args.hasFlag(options::OPT_fxray_instrument,
4741 options::OPT_fnoxray_instrument, false)) {
Dean Michael Berris39baab92016-07-14 04:58:44 +00004742 CmdArgs.push_back("-fxray-instrument");
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00004743 if (const Arg *A =
4744 Args.getLastArg(options::OPT_fxray_instruction_threshold_,
4745 options::OPT_fxray_instruction_threshold_EQ)) {
4746 CmdArgs.push_back("-fxray-instruction-threshold");
4747 CmdArgs.push_back(A->getValue());
4748 }
4749 }
4750
Diego Novilloa0545962015-07-10 18:00:07 +00004751 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004752
Paul Robinsond083b9a2015-12-16 17:25:27 +00004753 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4754 if (getToolChain().getTriple().isPS4CPU())
4755 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4756
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004757 // Pass options for controlling the default header search paths.
4758 if (Args.hasArg(options::OPT_nostdinc)) {
4759 CmdArgs.push_back("-nostdsysteminc");
4760 CmdArgs.push_back("-nobuiltininc");
4761 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004762 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004763 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004764 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4765 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4766 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004767
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004768 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004769 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004770 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004771
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004772 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4773
Ted Kremenekf7639e12012-03-06 20:06:33 +00004774 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004775 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004776 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004777 options::OPT_ccc_arcmt_modify,
4778 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004779 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004780 switch (A->getOption().getID()) {
4781 default:
4782 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004783 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004784 CmdArgs.push_back("-arcmt-check");
4785 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004786 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004787 CmdArgs.push_back("-arcmt-modify");
4788 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004789 case options::OPT_ccc_arcmt_migrate:
4790 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004791 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004792 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004793
4794 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4795 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004796 break;
John McCalld70fb982011-06-15 23:25:17 +00004797 }
4798 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004799 } else {
4800 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4801 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4802 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004803 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004804
Ted Kremenekf7639e12012-03-06 20:06:33 +00004805 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4806 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004807 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4808 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004809 }
4810 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004811 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004812
4813 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004814 options::OPT_objcmt_migrate_subscripting,
4815 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004816 // None specified, means enable them all.
4817 CmdArgs.push_back("-objcmt-migrate-literals");
4818 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004819 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004820 } else {
4821 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4822 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004823 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004824 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004825 } else {
4826 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4827 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4828 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4829 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4830 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4831 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004832 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004833 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4834 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4835 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4836 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4837 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4838 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4839 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004840 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004841 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004842 }
4843
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004844 // Add preprocessing options like -I, -D, etc. if we are using the
4845 // preprocessor.
4846 //
4847 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004848 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Samuel Antaod06239d2016-07-15 23:13:27 +00004849 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004850
Rafael Espindolaa7431922011-07-21 23:40:37 +00004851 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4852 // that "The compiler can only warn and ignore the option if not recognized".
4853 // When building with ccache, it will pass -D options to clang even on
4854 // preprocessed inputs and configure concludes that -fPIC is not supported.
4855 Args.ClaimAllArgs(options::OPT_D);
4856
Alp Toker7874bdc2013-11-15 20:40:58 +00004857 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004858 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4859 if (A->getOption().matches(options::OPT_O4)) {
4860 CmdArgs.push_back("-O3");
4861 D.Diag(diag::warn_O4_is_O3);
4862 } else {
4863 A->render(Args, CmdArgs);
4864 }
4865 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004866
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004867 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004868 for (const Arg *A :
4869 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4870 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004871 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004872 }
4873
Rafael Espindola577637a2015-01-03 00:06:04 +00004874 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004875
Richard Smith3be1cb22014-08-07 00:24:21 +00004876 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004877 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004878 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4879 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004880 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004881 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004882
4883 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004884 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004885 //
4886 // If a std is supplied, only add -trigraphs if it follows the
4887 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004888 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004889 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4890 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004891 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004892 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004893 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004894 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004895 else
4896 Std->render(Args, CmdArgs);
4897
Nico Weber00721502014-12-23 22:32:37 +00004898 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004899 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004900 options::OPT_ftrigraphs,
4901 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004902 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004903 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004904 } else {
4905 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004906 //
4907 // FIXME: Clang doesn't correctly handle -std= when the input language
4908 // doesn't match. For the time being just ignore this for C++ inputs;
4909 // eventually we want to do all the standard defaulting here instead of
4910 // splitting it between the driver and clang -cc1.
4911 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004912 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4913 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004914 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004915 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004916
Nico Weber00721502014-12-23 22:32:37 +00004917 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4918 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004919 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004920
Richard Smith282b4492013-09-04 22:50:31 +00004921 // GCC's behavior for -Wwrite-strings is a bit strange:
4922 // * In C, this "warning flag" changes the types of string literals from
4923 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4924 // for the discarded qualifier.
4925 // * In C++, this is just a normal warning flag.
4926 //
4927 // Implementing this warning correctly in C is hard, so we follow GCC's
4928 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4929 // a non-const char* in C, rather than using this crude hack.
4930 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004931 // FIXME: This should behave just like a warning flag, and thus should also
4932 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4933 Arg *WriteStrings =
4934 Args.getLastArg(options::OPT_Wwrite_strings,
4935 options::OPT_Wno_write_strings, options::OPT_w);
4936 if (WriteStrings &&
4937 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004938 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004939 }
4940
Chandler Carruth61fbf622011-04-23 09:27:53 +00004941 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004942 // during C++ compilation, which it is by default. GCC keeps this define even
4943 // in the presence of '-w', match this behavior bug-for-bug.
4944 if (types::isCXX(InputType) &&
4945 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4946 true)) {
4947 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004948 }
4949
Chandler Carruthe0391482010-05-22 02:21:53 +00004950 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4951 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4952 if (Asm->getOption().matches(options::OPT_fasm))
4953 CmdArgs.push_back("-fgnu-keywords");
4954 else
4955 CmdArgs.push_back("-fno-gnu-keywords");
4956 }
4957
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004958 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4959 CmdArgs.push_back("-fno-dwarf-directory-asm");
4960
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004961 if (ShouldDisableAutolink(Args, getToolChain()))
4962 CmdArgs.push_back("-fno-autolink");
4963
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004964 // Add in -fdebug-compilation-dir if necessary.
4965 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004966
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004967 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4968 StringRef Map = A->getValue();
4969 if (Map.find('=') == StringRef::npos)
4970 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4971 else
4972 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4973 A->claim();
4974 }
4975
Richard Smith9a568822011-11-21 19:36:32 +00004976 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4977 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004978 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004979 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004980 }
4981
Richard Smith79c927b2013-11-06 19:31:51 +00004982 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4983 CmdArgs.push_back("-foperator-arrow-depth");
4984 CmdArgs.push_back(A->getValue());
4985 }
4986
Richard Smith9a568822011-11-21 19:36:32 +00004987 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4988 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004989 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004990 }
4991
Richard Smitha3d3bd22013-05-08 02:12:03 +00004992 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4993 CmdArgs.push_back("-fconstexpr-steps");
4994 CmdArgs.push_back(A->getValue());
4995 }
4996
Richard Smithb3a14522013-02-22 01:59:51 +00004997 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4998 CmdArgs.push_back("-fbracket-depth");
4999 CmdArgs.push_back(A->getValue());
5000 }
5001
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00005002 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
5003 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00005004 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005005 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00005006 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
5007 } else
5008 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00005009 }
5010
Michael J. Spencer929fccd2012-10-22 22:13:48 +00005011 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00005012 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00005013
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005014 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
5015 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00005016 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005017 }
David Chisnall5778fce2009-08-31 16:41:57 +00005018
Chris Lattnere23003d2010-01-09 21:54:33 +00005019 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
5020 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00005021 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00005022 }
5023
Chris Lattnerb35583d2010-04-07 20:49:23 +00005024 CmdArgs.push_back("-ferror-limit");
5025 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00005026 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00005027 else
5028 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00005029
Chandler Carrutha77a7272010-05-06 04:55:18 +00005030 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
5031 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00005032 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00005033 }
5034
5035 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
5036 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00005037 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00005038 }
5039
Richard Smithf6f003a2011-12-16 19:06:07 +00005040 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
5041 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00005042 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00005043 }
5044
Nick Lewycky24653262014-12-16 21:39:02 +00005045 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
5046 CmdArgs.push_back("-fspell-checking-limit");
5047 CmdArgs.push_back(A->getValue());
5048 }
5049
Daniel Dunbar2c978472009-11-04 06:24:47 +00005050 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00005051 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00005052 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005053 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00005054 } else {
5055 // If -fmessage-length=N was not specified, determine whether this is a
5056 // terminal and, if so, implicitly define -fmessage-length appropriately.
5057 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005058 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00005059 }
5060
John McCallb4a99d32013-02-19 01:57:35 +00005061 // -fvisibility= and -fvisibility-ms-compat are of a piece.
5062 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
5063 options::OPT_fvisibility_ms_compat)) {
5064 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
5065 CmdArgs.push_back("-fvisibility");
5066 CmdArgs.push_back(A->getValue());
5067 } else {
5068 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
5069 CmdArgs.push_back("-fvisibility");
5070 CmdArgs.push_back("hidden");
5071 CmdArgs.push_back("-ftype-visibility");
5072 CmdArgs.push_back("default");
5073 }
Daniel Dunbare357d562009-12-03 18:42:11 +00005074 }
5075
Douglas Gregor08329632010-06-15 17:05:35 +00005076 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005077
Hans Wennborgf60f6af2012-06-28 08:01:44 +00005078 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
5079
Daniel Dunbare46b52a2010-03-20 04:52:14 +00005080 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00005081 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
5082 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00005083 CmdArgs.push_back("-ffreestanding");
5084
Daniel Dunbare357d562009-12-03 18:42:11 +00005085 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005086 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005087 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00005088 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00005089 // Emulated TLS is enabled by default on Android, and can be enabled manually
5090 // with -femulated-tls.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005091 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00005092 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
5093 EmulatedTLSDefault))
5094 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005095 // AltiVec-like language extensions aren't relevant for assembling.
5096 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00005097 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005098 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
5099 }
Richard Trieu91844232012-06-26 18:18:47 +00005100 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
5101 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00005102
Samuel Antaodb5f02b2016-07-28 14:29:18 +00005103 // Forward flags for OpenMP. We don't do this if the current action is an
5104 // device offloading action.
5105 //
5106 // TODO: Allow OpenMP offload actions when they become available.
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00005107 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Samuel Antaodb5f02b2016-07-28 14:29:18 +00005108 options::OPT_fno_openmp, false) &&
5109 JA.isDeviceOffloading(Action::OFK_None)) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00005110 switch (getOpenMPRuntime(getToolChain(), Args)) {
5111 case OMPRT_OMP:
5112 case OMPRT_IOMP5:
5113 // Clang can generate useful OpenMP code for these two runtime libraries.
5114 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00005115
5116 // If no option regarding the use of TLS in OpenMP codegeneration is
5117 // given, decide a default based on the target. Otherwise rely on the
5118 // options and pass the right information to the frontend.
5119 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00005120 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00005121 CmdArgs.push_back("-fnoopenmp-use-tls");
Alexey Bataev18c48522016-05-27 04:13:39 +00005122 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00005123 break;
5124 default:
5125 // By default, if Clang doesn't know how to generate useful OpenMP code
5126 // for a specific runtime library, we just don't pass the '-fopenmp' flag
5127 // down to the actual compilation.
5128 // FIXME: It would be better to have a mode which *only* omits IR
5129 // generation based on the OpenMP support so that we get consistent
5130 // semantic analysis, etc.
5131 break;
5132 }
Alexey Bataevc6bd8912016-05-26 11:10:11 +00005133 }
Alexey Bataevdb390212015-05-20 04:24:19 +00005134
Peter Collingbourne32701642013-11-01 18:16:25 +00005135 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005136 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00005137
Eric Christopher459d2712013-02-19 06:16:53 +00005138 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005139 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
5140 const llvm::Triple::ArchType Arch = getToolChain().getArch();
5141 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
5142 Arch == llvm::Triple::ppc64le))
5143 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
5144 << "ppc/ppc64/ppc64le";
5145 }
Chad Rosier864dfe12012-03-13 23:45:51 +00005146
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005147 // -fzvector is incompatible with -faltivec.
5148 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
5149 if (Args.hasArg(options::OPT_faltivec))
5150 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
5151 << "-faltivec";
5152
Daniel Dunbar733b0f82011-03-01 18:49:30 +00005153 if (getToolChain().SupportsProfiling())
5154 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00005155
5156 // -flax-vector-conversions is default.
5157 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
5158 options::OPT_fno_lax_vector_conversions))
5159 CmdArgs.push_back("-fno-lax-vector-conversions");
5160
John Brawna7b4ec02015-08-10 11:11:28 +00005161 if (Args.getLastArg(options::OPT_fapple_kext) ||
5162 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00005163 CmdArgs.push_back("-fapple-kext");
5164
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00005165 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00005166 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00005167 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005168 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
5169 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00005170
5171 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
5172 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00005173 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00005174 }
5175
Bob Wilson14adb362012-02-03 06:27:22 +00005176 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00005177
Chandler Carruth6e501032011-03-27 00:04:55 +00005178 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
5179 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005180 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00005181 if (A->getOption().matches(options::OPT_fwrapv))
5182 CmdArgs.push_back("-fwrapv");
5183 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
5184 options::OPT_fno_strict_overflow)) {
5185 if (A->getOption().matches(options::OPT_fno_strict_overflow))
5186 CmdArgs.push_back("-fwrapv");
5187 }
Hal Finkelce0697f2013-11-17 16:03:29 +00005188
5189 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
5190 options::OPT_fno_reroll_loops))
5191 if (A->getOption().matches(options::OPT_freroll_loops))
5192 CmdArgs.push_back("-freroll-loops");
5193
Daniel Dunbar3a148f22009-04-07 21:51:40 +00005194 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00005195 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
5196 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005197
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00005198 Args.AddLastArg(CmdArgs, options::OPT_pthread);
5199
Daniel Dunbar4930e332009-11-17 08:07:36 +00005200 // -stack-protector=0 is default.
5201 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00005202 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
5203 options::OPT_fstack_protector_all,
5204 options::OPT_fstack_protector_strong,
5205 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00005206 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005207 StackProtectorLevel = std::max<unsigned>(
5208 LangOptions::SSPOn,
5209 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00005210 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005211 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00005212 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00005213 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00005214 } else {
5215 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005216 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00005217 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00005218 if (StackProtectorLevel) {
5219 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005220 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005221 }
Chad Rosierdb3da832012-08-21 16:16:06 +00005222
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005223 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00005224 for (const Arg *A : Args.filtered(options::OPT__param)) {
5225 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005226 if (Str.startswith("ssp-buffer-size=")) {
5227 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00005228 CmdArgs.push_back("-stack-protector-buffer-size");
5229 // FIXME: Verify the argument is a valid integer.
5230 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00005231 }
Sean Silva14facf32015-06-09 01:57:17 +00005232 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00005233 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00005234 }
5235
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005236 // Translate -mstackrealign
5237 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00005238 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005239 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005240
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00005241 if (Args.hasArg(options::OPT_mstack_alignment)) {
5242 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5243 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00005244 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00005245
Hans Wennborg77dc2362015-01-20 19:45:50 +00005246 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5247 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5248
5249 if (!Size.empty())
5250 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5251 else
5252 CmdArgs.push_back("-mstack-probe-size=0");
5253 }
5254
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005255 switch (getToolChain().getArch()) {
5256 case llvm::Triple::aarch64:
5257 case llvm::Triple::aarch64_be:
5258 case llvm::Triple::arm:
5259 case llvm::Triple::armeb:
5260 case llvm::Triple::thumb:
5261 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005262 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005263 break;
5264
5265 default:
5266 break;
5267 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005268
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005269 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5270 options::OPT_mno_restrict_it)) {
5271 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5272 CmdArgs.push_back("-backend-option");
5273 CmdArgs.push_back("-arm-restrict-it");
5274 } else {
5275 CmdArgs.push_back("-backend-option");
5276 CmdArgs.push_back("-arm-no-restrict-it");
5277 }
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005278 } else if (Triple.isOSWindows() &&
5279 (Triple.getArch() == llvm::Triple::arm ||
5280 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00005281 // Windows on ARM expects restricted IT blocks
5282 CmdArgs.push_back("-backend-option");
5283 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005284 }
5285
Yaxun Liub5f176e2016-06-29 19:39:32 +00005286 // Forward -cl options to -cc1
5287 if (Args.getLastArg(options::OPT_cl_opt_disable)) {
5288 CmdArgs.push_back("-cl-opt-disable");
5289 }
5290 if (Args.getLastArg(options::OPT_cl_strict_aliasing)) {
5291 CmdArgs.push_back("-cl-strict-aliasing");
5292 }
5293 if (Args.getLastArg(options::OPT_cl_single_precision_constant)) {
5294 CmdArgs.push_back("-cl-single-precision-constant");
5295 }
5296 if (Args.getLastArg(options::OPT_cl_finite_math_only)) {
5297 CmdArgs.push_back("-cl-finite-math-only");
5298 }
5299 if (Args.getLastArg(options::OPT_cl_kernel_arg_info)) {
5300 CmdArgs.push_back("-cl-kernel-arg-info");
5301 }
5302 if (Args.getLastArg(options::OPT_cl_unsafe_math_optimizations)) {
5303 CmdArgs.push_back("-cl-unsafe-math-optimizations");
5304 }
5305 if (Args.getLastArg(options::OPT_cl_fast_relaxed_math)) {
5306 CmdArgs.push_back("-cl-fast-relaxed-math");
5307 }
5308 if (Args.getLastArg(options::OPT_cl_mad_enable)) {
5309 CmdArgs.push_back("-cl-mad-enable");
5310 }
Yaxun Liu79c99fb2016-07-08 20:28:29 +00005311 if (Args.getLastArg(options::OPT_cl_no_signed_zeros)) {
5312 CmdArgs.push_back("-cl-no-signed-zeros");
5313 }
Yaxun Liub5f176e2016-06-29 19:39:32 +00005314 if (Arg *A = Args.getLastArg(options::OPT_cl_std_EQ)) {
5315 std::string CLStdStr = "-cl-std=";
5316 CLStdStr += A->getValue();
5317 CmdArgs.push_back(Args.MakeArgString(CLStdStr));
5318 }
5319 if (Args.getLastArg(options::OPT_cl_denorms_are_zero)) {
5320 CmdArgs.push_back("-cl-denorms-are-zero");
5321 }
Yaxun Liuffb60902016-08-09 20:10:18 +00005322 if (Args.getLastArg(options::OPT_cl_fp32_correctly_rounded_divide_sqrt)) {
5323 CmdArgs.push_back("-cl-fp32-correctly-rounded-divide-sqrt");
5324 }
Yaxun Liub5f176e2016-06-29 19:39:32 +00005325
Daniel Dunbard18049a2009-04-07 21:16:11 +00005326 // Forward -f options with positive and negative forms; we translate
5327 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005328 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5329 StringRef fname = A->getValue();
5330 if (!llvm::sys::fs::exists(fname))
5331 D.Diag(diag::err_drv_no_such_file) << fname;
5332 else
5333 A->render(Args, CmdArgs);
5334 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005335
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005336 // -fbuiltin is default unless -mkernel is used.
5337 bool UseBuiltins =
5338 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5339 !Args.hasArg(options::OPT_mkernel));
5340 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005341 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005342
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005343 // -ffreestanding implies -fno-builtin.
5344 if (Args.hasArg(options::OPT_ffreestanding))
5345 UseBuiltins = false;
5346
5347 // Process the -fno-builtin-* options.
5348 for (const auto &Arg : Args) {
5349 const Option &O = Arg->getOption();
5350 if (!O.matches(options::OPT_fno_builtin_))
5351 continue;
5352
5353 Arg->claim();
5354 // If -fno-builtin is specified, then there's no need to pass the option to
5355 // the frontend.
5356 if (!UseBuiltins)
5357 continue;
5358
5359 StringRef FuncName = Arg->getValue();
5360 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5361 }
5362
Nuno Lopes13c88c72009-12-16 16:59:22 +00005363 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5364 options::OPT_fno_assume_sane_operator_new))
5365 CmdArgs.push_back("-fno-assume-sane-operator-new");
5366
Daniel Dunbar4930e332009-11-17 08:07:36 +00005367 // -fblocks=0 is default.
5368 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005369 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005370 (Args.hasArg(options::OPT_fgnu_runtime) &&
5371 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5372 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005373 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005375 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005376 !getToolChain().hasBlocksRuntime())
5377 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005378 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005379
Richard Smith47972af2015-06-16 00:08:24 +00005380 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005381 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005382 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005383 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005384 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005385 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5386 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005387 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005388 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005389 HaveModules = true;
5390 }
5391 }
5392
Richard Smith47972af2015-06-16 00:08:24 +00005393 // -fmodule-maps enables implicit reading of module map files. By default,
5394 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005395 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5396 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005397 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005398 }
5399
Daniel Jasperac42b752013-10-21 06:34:34 +00005400 // -fmodules-decluse checks that modules used are declared so (off by
5401 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005402 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005404 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005405 }
5406
Daniel Jasper962b38e2014-04-11 11:47:45 +00005407 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5408 // all #included headers are part of modules.
5409 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005410 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005411 CmdArgs.push_back("-fmodules-strict-decluse");
5412 }
5413
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005414 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5415 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5416 options::OPT_fno_implicit_modules)) {
5417 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005418 } else if (HaveModules) {
5419 // -fmodule-cache-path specifies where our implicitly-built module files
5420 // should be written.
5421 SmallString<128> Path;
5422 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5423 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005424 if (C.isForDiagnostics()) {
5425 // When generating crash reports, we want to emit the modules along with
5426 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005427 Path = Output.getFilename();
5428 llvm::sys::path::replace_extension(Path, ".cache");
5429 llvm::sys::path::append(Path, "modules");
5430 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005431 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005432 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005433 llvm::sys::path::append(Path, "org.llvm.clang.");
5434 appendUserToPath(Path);
5435 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005436 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005437 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005438 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5439 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005440 }
5441
Manman Ren11f2a472016-08-18 17:42:15 +00005442 if (HaveModules) {
5443 // -fprebuilt-module-path specifies where to load the prebuilt module files.
5444 for (const Arg *A : Args.filtered(options::OPT_fprebuilt_module_path))
5445 CmdArgs.push_back(Args.MakeArgString(
5446 std::string("-fprebuilt-module-path=") + A->getValue()));
5447 }
5448
Richard Smith8d83d6d2016-03-21 19:06:06 +00005449 // -fmodule-name specifies the module that is currently being built (or
5450 // used for header checking by -fmodule-maps).
5451 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5452
5453 // -fmodule-map-file can be used to specify files containing module
5454 // definitions.
5455 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5456
5457 // -fmodule-file can be used to specify files containing precompiled modules.
5458 if (HaveModules)
5459 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5460 else
5461 Args.ClaimAllArgs(options::OPT_fmodule_file);
5462
Justin Bognera88f0122014-06-20 22:59:50 +00005463 // When building modules and generating crashdumps, we need to dump a module
5464 // dependency VFS alongside the output.
5465 if (HaveModules && C.isForDiagnostics()) {
5466 SmallString<128> VFSDir(Output.getFilename());
5467 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005468 // Add the cache directory as a temp so the crash diagnostics pick it up.
5469 C.addTempFile(Args.MakeArgString(VFSDir));
5470
Justin Bognera88f0122014-06-20 22:59:50 +00005471 llvm::sys::path::append(VFSDir, "vfs");
5472 CmdArgs.push_back("-module-dependency-dir");
5473 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005474 }
5475
Richard Smith9887d792014-10-17 01:42:53 +00005476 if (HaveModules)
5477 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005478
Douglas Gregor35b04d62013-02-07 19:01:24 +00005479 // Pass through all -fmodules-ignore-macro arguments.
5480 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005481 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5482 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005483
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005484 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5485
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005486 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5487 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5488 D.Diag(diag::err_drv_argument_not_allowed_with)
5489 << A->getAsString(Args) << "-fbuild-session-timestamp";
5490
5491 llvm::sys::fs::file_status Status;
5492 if (llvm::sys::fs::status(A->getValue(), Status))
5493 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005494 CmdArgs.push_back(Args.MakeArgString(
5495 "-fbuild-session-timestamp=" +
5496 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005497 }
5498
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005499 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005500 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5501 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005502 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5503
5504 Args.AddLastArg(CmdArgs,
5505 options::OPT_fmodules_validate_once_per_build_session);
5506 }
5507
Ben Langmuirdcf73862014-03-12 00:06:17 +00005508 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
Manman Ren4482b2a2016-07-26 19:56:12 +00005509 Args.AddLastArg(CmdArgs, options::OPT_fmodules_disable_diagnostic_validation);
Ben Langmuirdcf73862014-03-12 00:06:17 +00005510
John McCalldfea9982010-04-09 19:12:06 +00005511 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005512 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005513 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005514 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005515
Anders Carlssond470fef2010-11-21 00:09:52 +00005516 // -felide-constructors is the default.
5517 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005518 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005519 CmdArgs.push_back("-fno-elide-constructors");
5520
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005521 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005522
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005523 if (KernelOrKext || (types::isCXX(InputType) &&
5524 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5525 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005526 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005527
Tony Linthicum76329bf2011-12-12 21:14:55 +00005528 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005529 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5530 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005531 CmdArgs.push_back("-fshort-enums");
5532
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005533 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005534 if (Arg *A = Args.getLastArg(
5535 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5536 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5537 if (A->getOption().matches(options::OPT_funsigned_char) ||
5538 A->getOption().matches(options::OPT_fno_signed_char)) {
5539 CmdArgs.push_back("-fno-signed-char");
5540 }
5541 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005542 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005543 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005544
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005545 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005546 if (!Args.hasFlag(
5547 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5548 !IsWindowsCygnus && !IsWindowsGNU &&
5549 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5550 getToolChain().getArch() != llvm::Triple::hexagon &&
5551 getToolChain().getArch() != llvm::Triple::xcore &&
5552 ((getToolChain().getTriple().getVendor() !=
5553 llvm::Triple::MipsTechnologies) ||
5554 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005555 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005556 CmdArgs.push_back("-fno-use-cxa-atexit");
5557
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005558 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005559 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005560 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005561 CmdArgs.push_back("-fms-extensions");
5562
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005563 // -fno-use-line-directives is default.
5564 if (Args.hasFlag(options::OPT_fuse_line_directives,
5565 options::OPT_fno_use_line_directives, false))
5566 CmdArgs.push_back("-fuse-line-directives");
5567
Francois Pichet1b4f1632011-09-17 04:32:15 +00005568 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005569 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005570 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005571 (IsWindowsMSVC &&
5572 Args.hasFlag(options::OPT_fms_extensions,
5573 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005574 CmdArgs.push_back("-fms-compatibility");
5575
David Majnemerc371ff02015-03-22 08:39:22 +00005576 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005577 VersionTuple MSVT = visualstudio::getMSVCVersion(
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00005578 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +00005579 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005580 CmdArgs.push_back(
5581 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005582
David Majnemer8db91762015-05-18 04:49:30 +00005583 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5584 if (ImplyVCPPCXXVer) {
David Majnemer093012b2016-06-27 02:32:12 +00005585 StringRef LanguageStandard;
5586 if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) {
5587 LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue())
5588 .Case("c++14", "-std=c++14")
5589 .Case("c++latest", "-std=c++1z")
5590 .Default("");
5591 if (LanguageStandard.empty())
5592 D.Diag(clang::diag::warn_drv_unused_argument)
5593 << StdArg->getAsString(Args);
5594 }
5595
5596 if (LanguageStandard.empty()) {
5597 if (IsMSVC2015Compatible)
5598 LanguageStandard = "-std=c++14";
5599 else
5600 LanguageStandard = "-std=c++11";
5601 }
5602
5603 CmdArgs.push_back(LanguageStandard.data());
David Majnemer8db91762015-05-18 04:49:30 +00005604 }
5605
Eric Christopher5ecce122013-02-18 00:38:31 +00005606 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005607 if (Args.hasFlag(options::OPT_fborland_extensions,
5608 options::OPT_fno_borland_extensions, false))
5609 CmdArgs.push_back("-fborland-extensions");
5610
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005611 // -fno-declspec is default, except for PS4.
5612 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5613 getToolChain().getTriple().isPS4()))
5614 CmdArgs.push_back("-fdeclspec");
5615 else if (Args.hasArg(options::OPT_fno_declspec))
5616 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5617
David Majnemerc371ff02015-03-22 08:39:22 +00005618 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5619 // than 19.
5620 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5621 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005622 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005623 CmdArgs.push_back("-fno-threadsafe-statics");
5624
Francois Pichet02744872011-09-01 16:38:08 +00005625 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5626 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005627 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005628 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005629 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005630
Chandler Carruthe03aa552010-04-17 20:17:31 +00005631 // -fgnu-keywords default varies depending on language; only pass if
5632 // specified.
5633 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005634 options::OPT_fno_gnu_keywords))
5635 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005637 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005638 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005639 CmdArgs.push_back("-fgnu89-inline");
5640
Chad Rosier9c76d242012-03-15 22:31:42 +00005641 if (Args.hasArg(options::OPT_fno_inline))
5642 CmdArgs.push_back("-fno-inline");
5643
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005644 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
Hans Wennborg44d061a2016-06-22 16:56:16 +00005645 options::OPT_finline_hint_functions,
Hans Wennborg7a008882016-05-24 20:40:51 +00005646 options::OPT_fno_inline_functions))
5647 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005648
John McCall5fb5df92012-06-20 06:18:46 +00005649 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005650
John McCall5fb5df92012-06-20 06:18:46 +00005651 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005652 // legacy is the default. Except for deployment taget of 10.5,
5653 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5654 // gets ignored silently.
5655 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005656 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5657 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005658 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005659 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005660 if (getToolChain().UseObjCMixedDispatch())
5661 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5662 else
5663 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5664 }
5665 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005666
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005667 // When ObjectiveC legacy runtime is in effect on MacOSX,
5668 // turn on the option to do Array/Dictionary subscripting
5669 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005670 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005671 getToolChain().getTriple().isMacOSX() &&
5672 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5673 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005674 objcRuntime.isNeXTFamily())
5675 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005676
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005677 // -fencode-extended-block-signature=1 is default.
5678 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5679 CmdArgs.push_back("-fencode-extended-block-signature");
5680 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005681
John McCall24fc0de2011-07-06 00:26:06 +00005682 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5683 // NOTE: This logic is duplicated in ToolChains.cpp.
5684 bool ARC = isObjCAutoRefCount(Args);
5685 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005686 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005687
John McCall24fc0de2011-07-06 00:26:06 +00005688 CmdArgs.push_back("-fobjc-arc");
5689
Chandler Carruth491db322011-11-04 07:34:47 +00005690 // FIXME: It seems like this entire block, and several around it should be
5691 // wrapped in isObjC, but for now we just use it here as this is where it
5692 // was being used previously.
5693 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5694 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5695 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5696 else
5697 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5698 }
5699
John McCall24fc0de2011-07-06 00:26:06 +00005700 // Allow the user to enable full exceptions code emission.
5701 // We define off for Objective-CC, on for Objective-C++.
5702 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5703 options::OPT_fno_objc_arc_exceptions,
5704 /*default*/ types::isCXX(InputType)))
5705 CmdArgs.push_back("-fobjc-arc-exceptions");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005706
John McCall24fc0de2011-07-06 00:26:06 +00005707 }
5708
5709 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5710 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005711 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005712 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005713
John McCall24fc0de2011-07-06 00:26:06 +00005714 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5715 // takes precedence.
5716 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5717 if (!GCArg)
5718 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5719 if (GCArg) {
5720 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005721 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005722 } else if (getToolChain().SupportsObjCGC()) {
5723 GCArg->render(Args, CmdArgs);
5724 } else {
5725 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005726 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005727 }
5728 }
5729
John McCallfbe5ed72015-11-05 19:19:56 +00005730 // Pass down -fobjc-weak or -fno-objc-weak if present.
5731 if (types::isObjC(InputType)) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005732 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5733 options::OPT_fno_objc_weak);
John McCallfbe5ed72015-11-05 19:19:56 +00005734 if (!WeakArg) {
5735 // nothing to do
5736 } else if (GCArg) {
5737 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5738 D.Diag(diag::err_objc_weak_with_gc);
5739 } else if (!objcRuntime.allowsWeak()) {
5740 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5741 D.Diag(diag::err_objc_weak_unsupported);
5742 } else {
5743 WeakArg->render(Args, CmdArgs);
5744 }
5745 }
5746
Bob Wilsonb111ec92015-03-02 19:01:14 +00005747 if (Args.hasFlag(options::OPT_fapplication_extension,
5748 options::OPT_fno_application_extension, false))
5749 CmdArgs.push_back("-fapplication-extension");
5750
Reid Klecknerc542d372014-06-27 17:02:02 +00005751 // Handle GCC-style exception args.
5752 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005753 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5754 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005755
Saleem Abdulrasool094f17b2016-06-10 20:12:00 +00005756 if (Args.hasArg(options::OPT_fsjlj_exceptions) ||
5757 getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005758 CmdArgs.push_back("-fsjlj-exceptions");
5759
5760 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005761 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5762 options::OPT_fno_assume_sane_operator_new))
5763 CmdArgs.push_back("-fno-assume-sane-operator-new");
5764
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005765 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5766 // most platforms.
5767 if (Args.hasFlag(options::OPT_fsized_deallocation,
5768 options::OPT_fno_sized_deallocation, false))
5769 CmdArgs.push_back("-fsized-deallocation");
5770
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005771 // -fconstant-cfstrings is default, and may be subject to argument translation
5772 // on Darwin.
5773 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5774 options::OPT_fno_constant_cfstrings) ||
5775 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5776 options::OPT_mno_constant_cfstrings))
5777 CmdArgs.push_back("-fno-constant-cfstrings");
5778
John Thompsoned4e2952009-11-05 20:14:16 +00005779 // -fshort-wchar default varies depending on platform; only
5780 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005781 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5782 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005783 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005784
Hans Wennborg28c96312013-07-31 23:39:13 +00005785 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005786 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005787 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005788 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005789
Daniel Dunbar096ed292011-10-05 21:04:55 +00005790 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5791 // -fno-pack-struct doesn't apply to -fpack-struct=.
5792 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005793 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005794 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005795 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005796 } else if (Args.hasFlag(options::OPT_fpack_struct,
5797 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005798 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005799 }
5800
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005801 // Handle -fmax-type-align=N and -fno-type-align
5802 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5803 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5804 if (!SkipMaxTypeAlign) {
5805 std::string MaxTypeAlignStr = "-fmax-type-align=";
5806 MaxTypeAlignStr += A->getValue();
5807 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5808 }
5809 } else if (getToolChain().getTriple().isOSDarwin()) {
5810 if (!SkipMaxTypeAlign) {
5811 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5812 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5813 }
5814 }
5815
John Brawna7b4ec02015-08-10 11:11:28 +00005816 // -fcommon is the default unless compiling kernel code or the target says so
5817 bool NoCommonDefault =
5818 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5819 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5820 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005821 CmdArgs.push_back("-fno-common");
5822
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005823 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005824 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005825 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005826 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005827 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005828 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005829
Daniel Dunbar6358d682010-10-15 22:30:42 +00005830 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005831 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005832 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005833 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005834
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005835 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005836 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5837 StringRef value = inputCharset->getValue();
Nico Weberebe8d622016-08-26 21:11:43 +00005838 if (!value.equals_lower("utf-8"))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005839 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5840 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005841 }
5842
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005843 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5845 StringRef value = execCharset->getValue();
Nico Weberebe8d622016-08-26 21:11:43 +00005846 if (!value.equals_lower("utf-8"))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005847 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5848 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005849 }
5850
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005851 // -fcaret-diagnostics is default.
5852 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5853 options::OPT_fno_caret_diagnostics, true))
5854 CmdArgs.push_back("-fno-caret-diagnostics");
5855
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005856 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005857 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005858 options::OPT_fno_diagnostics_fixit_info))
5859 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005860
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005861 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005862 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005863 options::OPT_fno_diagnostics_show_option))
5864 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005865
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005866 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005868 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005869 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005870 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005873 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005874 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005875 }
5876
Chandler Carruthb6766f02011-03-27 01:50:55 +00005877 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 options::OPT_fdiagnostics_show_note_include_stack,
5879 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005880 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005881 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005882 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5883 else
5884 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5885 }
5886
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005887 // Color diagnostics are parsed by the driver directly from argv
5888 // and later re-parsed to construct this job; claim any possible
5889 // color diagnostic here to avoid warn_drv_unused_argument and
5890 // diagnose bad OPT_fdiagnostics_color_EQ values.
5891 for (Arg *A : Args) {
5892 const Option &O = A->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005893 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5894 !O.matches(options::OPT_fdiagnostics_color) &&
5895 !O.matches(options::OPT_fno_color_diagnostics) &&
5896 !O.matches(options::OPT_fno_diagnostics_color) &&
5897 !O.matches(options::OPT_fdiagnostics_color_EQ))
5898 continue;
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005899 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5900 StringRef Value(A->getValue());
5901 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber7e2da792013-04-17 21:52:44 +00005902 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Vedant Kumar5fb00e42016-07-27 23:01:55 +00005903 << ("-fdiagnostics-color=" + Value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005904 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005905 A->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005906 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005907 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005908 CmdArgs.push_back("-fcolor-diagnostics");
5909
Nico Rieck7857d462013-09-11 00:38:02 +00005910 if (Args.hasArg(options::OPT_fansi_escape_codes))
5911 CmdArgs.push_back("-fansi-escape-codes");
5912
Daniel Dunbardb097022009-06-08 21:13:54 +00005913 if (!Args.hasFlag(options::OPT_fshow_source_location,
5914 options::OPT_fno_show_source_location))
5915 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005916
Hans Wennborgb30f4372016-08-26 15:45:36 +00005917 if (Args.hasArg(options::OPT_fdiagnostics_absolute_paths))
5918 CmdArgs.push_back("-fdiagnostics-absolute-paths");
5919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005920 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005921 true))
5922 CmdArgs.push_back("-fno-show-column");
5923
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005924 if (!Args.hasFlag(options::OPT_fspell_checking,
5925 options::OPT_fno_spell_checking))
5926 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005927
Chad Rosierc8e56e82012-12-05 21:08:21 +00005928 // -fno-asm-blocks is default.
5929 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5930 false))
5931 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005932
Steven Wucb0d13f2015-01-16 23:05:28 +00005933 // -fgnu-inline-asm is default.
5934 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5935 options::OPT_fno_gnu_inline_asm, true))
5936 CmdArgs.push_back("-fno-gnu-inline-asm");
5937
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005938 // Enable vectorization per default according to the optimization level
5939 // selected. For optimization levels that want vectorization we use the alias
5940 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005941 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005942 OptSpecifier VectorizeAliasOption =
5943 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005944 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005945 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005946 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005947
Chad Rosier136d67d2014-04-28 19:30:57 +00005948 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005949 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005950 OptSpecifier SLPVectAliasOption =
5951 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005952 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005953 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005954 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005955
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005956 // -fno-slp-vectorize-aggressive is default.
5957 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005958 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005959 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005960
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005961 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5962 A->render(Args, CmdArgs);
5963
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005964 if (Arg *A = Args.getLastArg(
5965 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5966 A->render(Args, CmdArgs);
5967
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005968 // -fdollars-in-identifiers default varies depending on platform and
5969 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005970 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005971 options::OPT_fno_dollars_in_identifiers)) {
5972 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005973 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005974 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005975 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005976 }
5977
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005978 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5979 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005980 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005981 options::OPT_fno_unit_at_a_time)) {
5982 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005983 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005984 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005985
Eli Friedman055c9702011-11-02 01:53:16 +00005986 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5987 options::OPT_fno_apple_pragma_pack, false))
5988 CmdArgs.push_back("-fapple-pragma-pack");
5989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005990 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005991 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5992 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005993 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005994 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005995 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005996
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005997// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5998//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005999// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00006000#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00006001 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006002 (getToolChain().getArch() == llvm::Triple::arm ||
6003 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00006004 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
6005 CmdArgs.push_back("-fno-builtin-strcat");
6006 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
6007 CmdArgs.push_back("-fno-builtin-strcpy");
6008 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00006009#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00006010
Justin Bognera88f0122014-06-20 22:59:50 +00006011 // Enable rewrite includes if the user's asked for it or if we're generating
6012 // diagnostics.
6013 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
6014 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00006015 if (Args.hasFlag(options::OPT_frewrite_includes,
6016 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00006017 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00006018 CmdArgs.push_back("-frewrite-includes");
6019
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00006020 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00006021 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00006022 options::OPT_traditional_cpp)) {
6023 if (isa<PreprocessJobAction>(JA))
6024 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006025 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006026 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00006027 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00006028
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006029 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00006030 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00006032 // Handle serialized diagnostics.
6033 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
6034 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00006035 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00006036 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006037
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00006038 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
6039 CmdArgs.push_back("-fretain-comments-from-system-headers");
6040
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00006041 // Forward -fcomment-block-commands to -cc1.
6042 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00006043 // Forward -fparse-all-comments to -cc1.
6044 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00006045
John Brawnad31ace2015-09-23 13:55:40 +00006046 // Turn -fplugin=name.so into -load name.so
6047 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
6048 CmdArgs.push_back("-load");
6049 CmdArgs.push_back(A->getValue());
6050 A->claim();
6051 }
6052
Daniel Dunbar76fa8402010-04-15 06:09:03 +00006053 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
6054 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006055 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00006056 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
6057 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00006058
Daniel Dunbar76fa8402010-04-15 06:09:03 +00006059 // We translate this by hand to the -cc1 argument, since nightly test uses
6060 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00006061 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00006062 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00006063 } else
Sean Silva14facf32015-06-09 01:57:17 +00006064 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00006065 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006066
Bob Wilson23a55f12014-12-21 07:00:00 +00006067 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00006068 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
6069 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00006070 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
6071 // has slightly different breakdown between stages.
6072 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
6073 // pristine IR generated by the frontend. Ideally, a new compile action should
6074 // be added so both IR can be captured.
6075 if (C.getDriver().isSaveTempsEnabled() &&
6076 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00006077 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00006078
Daniel Dunbard67a3222009-03-30 06:36:42 +00006079 if (Output.getType() == types::TY_Dependencies) {
6080 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006081 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006082 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006083 CmdArgs.push_back(Output.getFilename());
6084 } else {
6085 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006086 }
6087
Artem Belevich0ff05cd2015-07-13 23:27:56 +00006088 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00006089
Artem Belevich0ff05cd2015-07-13 23:27:56 +00006090 if (Input.isFilename())
6091 CmdArgs.push_back(Input.getFilename());
6092 else
6093 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006094
Chris Lattnere9d7d782009-11-03 19:50:27 +00006095 Args.AddAllArgs(CmdArgs, options::OPT_undef);
6096
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006097 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00006098
6099 // Optionally embed the -cc1 level arguments into the debug info, for build
6100 // analysis.
6101 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00006102 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006103 for (const auto &Arg : Args)
6104 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00006105
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006106 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00006107 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006108 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006109 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006110 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00006111 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006112 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00006113 }
6114 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006115 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00006116 }
6117
Eric Christopherd3804002013-02-22 20:12:52 +00006118 // Add the split debug info name to the command lines here so we
6119 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00006120 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006121 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
6122 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00006123 const char *SplitDwarfOut;
6124 if (SplitDwarf) {
6125 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00006126 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00006127 CmdArgs.push_back(SplitDwarfOut);
6128 }
6129
Artem Belevich0ff05cd2015-07-13 23:27:56 +00006130 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
6131 // Include them with -fcuda-include-gpubinary.
6132 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00006133 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00006134 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00006135 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00006136 }
6137
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006138 bool WholeProgramVTables =
6139 Args.hasFlag(options::OPT_fwhole_program_vtables,
6140 options::OPT_fno_whole_program_vtables, false);
6141 if (WholeProgramVTables) {
6142 if (!D.isUsingLTO())
6143 D.Diag(diag::err_drv_argument_only_allowed_with)
6144 << "-fwhole-program-vtables"
6145 << "-flto";
6146 CmdArgs.push_back("-fwhole-program-vtables");
6147 }
6148
Eric Christopherd3804002013-02-22 20:12:52 +00006149 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00006150 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00006151 Output.getType() == types::TY_Object &&
6152 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00006153 auto CLCommand =
6154 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00006155 C.addCommand(llvm::make_unique<FallbackCommand>(
6156 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00006157 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
6158 isa<PrecompileJobAction>(JA)) {
6159 // In /fallback builds, run the main compilation even if the pch generation
6160 // fails, so that the main compilation's fallback to cl.exe runs.
6161 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
6162 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00006163 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00006164 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00006165 }
6166
Eric Christopherf1545832013-02-22 23:50:16 +00006167 // Handle the debug info splitting at object creation time if we're
6168 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00006169 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00006170 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00006171 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00006172
Roman Divacky178e01602011-02-10 16:52:03 +00006173 if (Arg *A = Args.getLastArg(options::OPT_pg))
6174 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006175 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
6176 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006177
Daniel Dunbarc2a71892009-04-03 20:51:31 +00006178 // Claim some arguments which clang supports automatically.
6179
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00006180 // -fpch-preprocess is used with gcc to add a special marker in the output to
6181 // include the PCH file. Clang's PTH solution is completely transparent, so we
6182 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00006183 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006184
Daniel Dunbar17731772009-03-23 19:03:36 +00006185 // Claim some arguments which clang doesn't support, but we don't
6186 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00006187 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
6188 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00006189
Rafael Espindolab0092d72013-09-04 19:37:35 +00006190 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00006191 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006192}
6193
John McCall5fb5df92012-06-20 06:18:46 +00006194/// Add options related to the Objective-C runtime/ABI.
6195///
6196/// Returns true if the runtime is non-fragile.
6197ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
6198 ArgStringList &cmdArgs,
6199 RewriteKind rewriteKind) const {
6200 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006201 Arg *runtimeArg =
6202 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
6203 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00006204
6205 // Just forward -fobjc-runtime= to the frontend. This supercedes
6206 // options about fragility.
6207 if (runtimeArg &&
6208 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
6209 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00006210 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00006211 if (runtime.tryParse(value)) {
6212 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006213 << value;
John McCall5fb5df92012-06-20 06:18:46 +00006214 }
6215
6216 runtimeArg->render(args, cmdArgs);
6217 return runtime;
6218 }
6219
6220 // Otherwise, we'll need the ABI "version". Version numbers are
6221 // slightly confusing for historical reasons:
6222 // 1 - Traditional "fragile" ABI
6223 // 2 - Non-fragile ABI, version 1
6224 // 3 - Non-fragile ABI, version 2
6225 unsigned objcABIVersion = 1;
6226 // If -fobjc-abi-version= is present, use that to set the version.
6227 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006228 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00006229 if (value == "1")
6230 objcABIVersion = 1;
6231 else if (value == "2")
6232 objcABIVersion = 2;
6233 else if (value == "3")
6234 objcABIVersion = 3;
6235 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006236 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00006237 } else {
6238 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006239 bool nonFragileABIIsDefault =
6240 (rewriteKind == RK_NonFragile ||
6241 (rewriteKind == RK_None &&
6242 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00006243 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
6244 options::OPT_fno_objc_nonfragile_abi,
6245 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006246// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00006247#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
6248 unsigned nonFragileABIVersion = 1;
6249#else
6250 unsigned nonFragileABIVersion = 2;
6251#endif
6252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006253 if (Arg *abiArg =
6254 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006255 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00006256 if (value == "1")
6257 nonFragileABIVersion = 1;
6258 else if (value == "2")
6259 nonFragileABIVersion = 2;
6260 else
6261 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006262 << value;
John McCall5fb5df92012-06-20 06:18:46 +00006263 }
6264
6265 objcABIVersion = 1 + nonFragileABIVersion;
6266 } else {
6267 objcABIVersion = 1;
6268 }
6269 }
6270
6271 // We don't actually care about the ABI version other than whether
6272 // it's non-fragile.
6273 bool isNonFragile = objcABIVersion != 1;
6274
6275 // If we have no runtime argument, ask the toolchain for its default runtime.
6276 // However, the rewriter only really supports the Mac runtime, so assume that.
6277 ObjCRuntime runtime;
6278 if (!runtimeArg) {
6279 switch (rewriteKind) {
6280 case RK_None:
6281 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6282 break;
6283 case RK_Fragile:
6284 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
6285 break;
6286 case RK_NonFragile:
6287 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6288 break;
6289 }
6290
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006291 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006292 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6293 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006294 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006295 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6296
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006297 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006298 } else {
6299 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6300 }
6301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006302 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006303 } else {
6304 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006305 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006306 // non-fragile mode or the GCC runtime in fragile mode.
6307 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006308 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006309 else
6310 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006311 }
6312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006313 cmdArgs.push_back(
6314 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006315 return runtime;
6316}
6317
Reid Klecknerc542d372014-06-27 17:02:02 +00006318static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6319 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6320 I += HaveDash;
6321 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006322}
Reid Klecknerc542d372014-06-27 17:02:02 +00006323
Benjamin Kramere003ca22015-10-28 13:54:16 +00006324namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006325struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006326 bool Synch = false;
6327 bool Asynch = false;
6328 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006329};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006330} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006331
6332/// /EH controls whether to run destructor cleanups when exceptions are
6333/// thrown. There are three modifiers:
6334/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6335/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6336/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006337/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006338/// The default is /EHs-c-, meaning cleanups are disabled.
6339static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6340 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006341
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006342 std::vector<std::string> EHArgs =
6343 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006344 for (auto EHVal : EHArgs) {
6345 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6346 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006347 case 'a':
6348 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006349 if (EH.Asynch)
6350 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006351 continue;
6352 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006353 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006354 continue;
6355 case 's':
6356 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006357 if (EH.Synch)
6358 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006359 continue;
6360 default:
6361 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006362 }
6363 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6364 break;
6365 }
6366 }
David Majnemerb8809092016-02-20 09:23:44 +00006367 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006368 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006369 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006370 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6371 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006372 EH.Synch = true;
6373 EH.NoUnwindC = true;
6374 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006375
Reid Klecknerc542d372014-06-27 17:02:02 +00006376 return EH;
6377}
6378
David Majnemercd5855e2016-02-29 01:40:36 +00006379void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6380 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006381 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006382 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006383 unsigned RTOptionID = options::OPT__SLASH_MT;
6384
Hans Wennborgf1a74252013-09-10 20:18:04 +00006385 if (Args.hasArg(options::OPT__SLASH_LDd))
6386 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6387 // but defining _DEBUG is sticky.
6388 RTOptionID = options::OPT__SLASH_MTd;
6389
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006390 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006391 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006392
David Majnemere2afb472015-07-24 06:49:13 +00006393 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006394 switch (RTOptionID) {
6395 case options::OPT__SLASH_MD:
6396 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006397 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006398 CmdArgs.push_back("-D_MT");
6399 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006400 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006401 break;
6402 case options::OPT__SLASH_MDd:
6403 CmdArgs.push_back("-D_DEBUG");
6404 CmdArgs.push_back("-D_MT");
6405 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006406 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006407 break;
6408 case options::OPT__SLASH_MT:
6409 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006410 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006411 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006412 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006413 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006414 break;
6415 case options::OPT__SLASH_MTd:
6416 CmdArgs.push_back("-D_DEBUG");
6417 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006418 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006419 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006420 break;
6421 default:
6422 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006423 }
6424
David Majnemere2afb472015-07-24 06:49:13 +00006425 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6426 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6427 } else {
6428 CmdArgs.push_back(FlagForCRT.data());
6429
6430 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6431 // users want. The /Za flag to cl.exe turns this off, but it's not
6432 // implemented in clang.
6433 CmdArgs.push_back("--dependent-lib=oldnames");
6434 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006435
Hans Wennborg8858a032014-07-21 23:42:07 +00006436 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6437 // would produce interleaved output, so ignore /showIncludes in such cases.
6438 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6439 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6440 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006441
David Majnemerf6072342014-07-01 22:24:56 +00006442 // This controls whether or not we emit RTTI data for polymorphic types.
6443 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6444 /*default=*/false))
6445 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006446
Etienne Bergerone28e7f22016-06-15 20:34:33 +00006447 // This controls whether or not we emit stack-protector instrumentation.
6448 // In MSVC, Buffer Security Check (/GS) is on by default.
6449 if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_,
6450 /*default=*/true)) {
6451 CmdArgs.push_back("-stack-protector");
6452 CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong)));
6453 }
6454
Reid Klecknerbab5a5d2016-08-09 17:23:56 +00006455 // Emit CodeView if -Z7, -Zd, or -gline-tables-only are present.
David Majnemer58fab352016-07-09 21:49:16 +00006456 if (Arg *DebugInfoArg =
Reid Klecknerbab5a5d2016-08-09 17:23:56 +00006457 Args.getLastArg(options::OPT__SLASH_Z7, options::OPT__SLASH_Zd,
6458 options::OPT_gline_tables_only)) {
David Majnemer58fab352016-07-09 21:49:16 +00006459 *EmitCodeView = true;
6460 if (DebugInfoArg->getOption().matches(options::OPT__SLASH_Z7))
6461 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
6462 else
6463 *DebugInfoKind = codegenoptions::DebugLineTablesOnly;
Reid Kleckner124955a2015-08-05 18:51:13 +00006464 CmdArgs.push_back("-gcodeview");
David Majnemer58fab352016-07-09 21:49:16 +00006465 } else {
6466 *EmitCodeView = false;
6467 }
Reid Kleckner124955a2015-08-05 18:51:13 +00006468
Reid Klecknerc542d372014-06-27 17:02:02 +00006469 const Driver &D = getToolChain().getDriver();
6470 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006471 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006472 if (types::isCXX(InputType))
6473 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006474 CmdArgs.push_back("-fexceptions");
6475 }
David Majnemercd5855e2016-02-29 01:40:36 +00006476 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6477 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006478
Hans Wennborge50cec32014-06-13 20:59:54 +00006479 // /EP should expand to -E -P.
6480 if (Args.hasArg(options::OPT__SLASH_EP)) {
6481 CmdArgs.push_back("-E");
6482 CmdArgs.push_back("-P");
6483 }
6484
David Majnemera5b195a2015-02-14 01:35:12 +00006485 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006486 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6487 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006488 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6489 else
6490 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6491
6492 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6493 VolatileOptionID = A->getOption().getID();
6494
6495 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6496 CmdArgs.push_back("-fms-volatile");
6497
David Majnemer86c318f2014-02-11 21:05:00 +00006498 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6499 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6500 if (MostGeneralArg && BestCaseArg)
6501 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6502 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6503
6504 if (MostGeneralArg) {
6505 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6506 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6507 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6508
6509 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6510 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6511 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6512 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6513 << FirstConflict->getAsString(Args)
6514 << SecondConflict->getAsString(Args);
6515
6516 if (SingleArg)
6517 CmdArgs.push_back("-fms-memptr-rep=single");
6518 else if (MultipleArg)
6519 CmdArgs.push_back("-fms-memptr-rep=multiple");
6520 else
6521 CmdArgs.push_back("-fms-memptr-rep=virtual");
6522 }
6523
Alexey Bataeva7547182016-05-18 09:06:38 +00006524 if (Args.getLastArg(options::OPT__SLASH_Gd))
6525 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6526 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6527 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6528 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6529 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6530 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6531 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6532
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006533 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6534 A->render(Args, CmdArgs);
6535
Hans Wennborg81f74482013-09-10 01:07:07 +00006536 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6537 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006538 if (Args.hasArg(options::OPT__SLASH_fallback))
6539 CmdArgs.push_back("msvc-fallback");
6540 else
6541 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006542 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006543}
6544
Douglas Katzman95354292015-06-23 20:42:09 +00006545visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006546 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006547 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006548 return CLFallback.get();
6549}
6550
Daniel Sanders7f933f42015-01-30 17:35:23 +00006551void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6552 ArgStringList &CmdArgs) const {
6553 StringRef CPUName;
6554 StringRef ABIName;
6555 const llvm::Triple &Triple = getToolChain().getTriple();
6556 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6557
6558 CmdArgs.push_back("-target-abi");
6559 CmdArgs.push_back(ABIName.data());
6560}
6561
Yunzhong Gaofc611132016-07-18 18:44:51 +00006562void ClangAs::AddX86TargetArgs(const ArgList &Args,
6563 ArgStringList &CmdArgs) const {
6564 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
6565 StringRef Value = A->getValue();
6566 if (Value == "intel" || Value == "att") {
6567 CmdArgs.push_back("-mllvm");
6568 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
6569 } else {
6570 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
6571 << A->getOption().getName() << Value;
6572 }
6573 }
6574}
6575
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006576void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006577 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006578 const ArgList &Args,
6579 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006580 ArgStringList CmdArgs;
6581
6582 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6583 const InputInfo &Input = Inputs[0];
6584
Vedant Kumar18286cf2016-07-27 23:02:20 +00006585 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
6586 const std::string &TripleStr = Triple.getTriple();
James Y Knight2db38f32015-08-15 03:45:25 +00006587
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006588 // Don't warn about "clang -w -c foo.s"
6589 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006590 // and "clang -emit-llvm -c foo.s"
6591 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006592
Rafael Espindola577637a2015-01-03 00:06:04 +00006593 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006594
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006595 // Invoke ourselves in -cc1as mode.
6596 //
6597 // FIXME: Implement custom jobs for internal actions.
6598 CmdArgs.push_back("-cc1as");
6599
6600 // Add the "effective" target triple.
6601 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006602 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6603
6604 // Set the output mode, we currently only expect to be used as a real
6605 // assembler.
6606 CmdArgs.push_back("-filetype");
6607 CmdArgs.push_back("obj");
6608
Eric Christopher45f2e712012-12-18 00:31:10 +00006609 // Set the main file name, so that debug info works even with
6610 // -save-temps or preprocessed assembly.
6611 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006612 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006613
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006614 // Add the target cpu
Vedant Kumar5fb00e42016-07-27 23:01:55 +00006615 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006616 if (!CPU.empty()) {
6617 CmdArgs.push_back("-target-cpu");
6618 CmdArgs.push_back(Args.MakeArgString(CPU));
6619 }
6620
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006621 // Add the target features
Vedant Kumar5fb00e42016-07-27 23:01:55 +00006622 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006623
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006624 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006625 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006626
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006627 // Pass along any -I options so we get proper .include search paths.
6628 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6629
Eric Christopherfc3ee562012-01-10 00:38:01 +00006630 // Determine the original source input.
6631 const Action *SourceAction = &JA;
6632 while (SourceAction->getKind() != Action::InputClass) {
6633 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6634 SourceAction = SourceAction->getInputs()[0];
6635 }
6636
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006637 // Forward -g and handle debug info related flags, assuming we are dealing
6638 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006639 bool WantDebug = false;
6640 unsigned DwarfVersion = 0;
6641 Args.ClaimAllArgs(options::OPT_g_Group);
6642 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6643 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6644 !A->getOption().matches(options::OPT_ggdb0);
6645 if (WantDebug)
6646 DwarfVersion = DwarfVersionNum(A->getSpelling());
6647 }
6648 if (DwarfVersion == 0)
6649 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6650
6651 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6652
Eric Christopherfc3ee562012-01-10 00:38:01 +00006653 if (SourceAction->getType() == types::TY_Asm ||
6654 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006655 // You might think that it would be ok to set DebugInfoKind outside of
6656 // the guard for source type, however there is a test which asserts
6657 // that some assembler invocation receives no -debug-info-kind,
6658 // and it's not clear whether that test is just overly restrictive.
6659 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6660 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006661 // Add the -fdebug-compilation-dir flag if needed.
6662 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006663
6664 // Set the AT_producer to the clang version when using the integrated
6665 // assembler on assembly source files.
6666 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006667 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006668
6669 // And pass along -I options
6670 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006671 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006672 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6673 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006674
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006675 // Handle -fPIC et al -- the relocation-model affects the assembler
6676 // for some targets.
6677 llvm::Reloc::Model RelocationModel;
6678 unsigned PICLevel;
6679 bool IsPIE;
6680 std::tie(RelocationModel, PICLevel, IsPIE) =
Vedant Kumar5fb00e42016-07-27 23:01:55 +00006681 ParsePICArgs(getToolChain(), Triple, Args);
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006682
6683 const char *RMName = RelocationModelName(RelocationModel);
6684 if (RMName) {
6685 CmdArgs.push_back("-mrelocation-model");
6686 CmdArgs.push_back(RMName);
6687 }
6688
Kevin Enderby292dc082011-12-22 19:31:58 +00006689 // Optionally embed the -cc1as level arguments into the debug info, for build
6690 // analysis.
6691 if (getToolChain().UseDwarfDebugFlags()) {
6692 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006693 for (const auto &Arg : Args)
6694 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006695
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006696 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006697 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6698 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006699 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006700 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006701 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006702 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006703 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006704 }
6705 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006706 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006707 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006708
6709 // FIXME: Add -static support, once we have it.
6710
Daniel Sanders7f933f42015-01-30 17:35:23 +00006711 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006712 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006713 default:
6714 break;
6715
6716 case llvm::Triple::mips:
6717 case llvm::Triple::mipsel:
6718 case llvm::Triple::mips64:
6719 case llvm::Triple::mips64el:
6720 AddMIPSTargetArgs(Args, CmdArgs);
6721 break;
Adrian McCarthy084148f2016-08-25 18:24:35 +00006722
Yunzhong Gaofc611132016-07-18 18:44:51 +00006723 case llvm::Triple::x86:
6724 case llvm::Triple::x86_64:
6725 AddX86TargetArgs(Args, CmdArgs);
6726 break;
Daniel Sanders7f933f42015-01-30 17:35:23 +00006727 }
6728
David Blaikie372d9502014-01-17 03:17:40 +00006729 // Consume all the warning flags. Usually this would be handled more
6730 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6731 // doesn't handle that so rather than warning about unused flags that are
6732 // actually used, we'll lie by omission instead.
6733 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006734 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006735
David Blaikie9260ed62013-07-25 21:19:01 +00006736 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6737 getToolChain().getDriver());
6738
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006739 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006740
6741 assert(Output.isFilename() && "Unexpected lipo output.");
6742 CmdArgs.push_back("-o");
6743 CmdArgs.push_back(Output.getFilename());
6744
Daniel Dunbarb440f562010-08-02 02:38:21 +00006745 assert(Input.isFilename() && "Invalid input.");
6746 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006747
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006748 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006749 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006750
6751 // Handle the debug info splitting at object creation time if we're
6752 // creating an object.
6753 // TODO: Currently only works on linux with newer objcopy.
6754 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006755 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006756 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006757 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006758}
6759
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006760void GnuTool::anchor() {}
6761
Daniel Dunbara3246a02009-03-18 08:07:30 +00006762void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006763 const InputInfo &Output,
Vedant Kumar5fb00e42016-07-27 23:01:55 +00006764 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006765 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006766 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006767 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006768
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006769 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006770 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006771 // It is unfortunate that we have to claim here, as this means
6772 // we will basically never report anything interesting for
6773 // platforms using a generic gcc, even if we are just using gcc
6774 // to get to the assembler.
6775 A->claim();
6776
Daniel Dunbar939c1212010-08-03 16:14:14 +00006777 // Don't forward any -g arguments to assembly steps.
6778 if (isa<AssembleJobAction>(JA) &&
6779 A->getOption().matches(options::OPT_g_Group))
6780 continue;
6781
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006782 // Don't forward any -W arguments to assembly and link steps.
6783 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6784 A->getOption().matches(options::OPT_W_Group))
6785 continue;
6786
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006787 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006788 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006789 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006790
Daniel Dunbar4e295052010-01-25 22:35:08 +00006791 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006792
6793 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006794 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006795 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006796 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006797 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006798 }
6799
Daniel Dunbar5716d872009-05-02 21:41:52 +00006800 // Try to force gcc to match the tool chain we want, if we recognize
6801 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006802 //
6803 // FIXME: The triple class should directly provide the information we want
6804 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006805 switch (getToolChain().getArch()) {
6806 default:
6807 break;
6808 case llvm::Triple::x86:
6809 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006810 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006811 break;
6812 case llvm::Triple::x86_64:
6813 case llvm::Triple::ppc64:
6814 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006815 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006816 break;
6817 case llvm::Triple::sparcel:
6818 CmdArgs.push_back("-EL");
6819 break;
6820 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006821
Daniel Dunbarb440f562010-08-02 02:38:21 +00006822 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006823 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006824 CmdArgs.push_back(Output.getFilename());
6825 } else {
6826 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006827 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006828 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006829
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006830 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006831
6832 // Only pass -x if gcc will understand it; otherwise hope gcc
6833 // understands the suffix correctly. The main use case this would go
6834 // wrong in is for linker inputs if they happened to have an odd
6835 // suffix; really the only way to get this to happen is a command
6836 // like '-x foobar a.c' which will treat a.c like a linker input.
6837 //
6838 // FIXME: For the linker case specifically, can we safely convert
6839 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006840 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006841 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006842 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006843 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006844 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006845 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006846 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006847 else if (II.getType() == types::TY_ModuleFile)
6848 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006849 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006850
Daniel Dunbara3246a02009-03-18 08:07:30 +00006851 if (types::canTypeBeUserSpecified(II.getType())) {
6852 CmdArgs.push_back("-x");
6853 CmdArgs.push_back(types::getTypeName(II.getType()));
6854 }
6855
Daniel Dunbarb440f562010-08-02 02:38:21 +00006856 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006857 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006858 else {
6859 const Arg &A = II.getInputArg();
6860
6861 // Reverse translate some rewritten options.
6862 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6863 CmdArgs.push_back("-lstdc++");
6864 continue;
6865 }
6866
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006867 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006868 A.render(Args, CmdArgs);
6869 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006870 }
6871
Benjamin Kramer2e018ef2016-05-27 13:36:58 +00006872 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006873 const char *GCCName;
6874 if (!customGCCName.empty())
6875 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006876 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006877 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006878 } else
6879 GCCName = "gcc";
6880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006881 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006882 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006883}
6884
Douglas Katzman95354292015-06-23 20:42:09 +00006885void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6886 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006887 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006888}
6889
Douglas Katzman95354292015-06-23 20:42:09 +00006890void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6891 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006892 const Driver &D = getToolChain().getDriver();
6893
Eric Christophercc7ff502015-01-29 00:56:17 +00006894 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006895 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006896 case types::TY_LLVM_IR:
6897 case types::TY_LTO_IR:
6898 case types::TY_LLVM_BC:
6899 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006900 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006901 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006902 // We assume we've got an "integrated" assembler in that gcc will produce an
6903 // object file itself.
6904 case types::TY_Object:
6905 CmdArgs.push_back("-c");
6906 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006907 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006908 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006909 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006910 case types::TY_Nothing:
6911 CmdArgs.push_back("-fsyntax-only");
6912 break;
6913 default:
6914 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006915 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006916}
6917
Douglas Katzman95354292015-06-23 20:42:09 +00006918void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6919 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006920 // The types are (hopefully) good enough.
6921}
6922
Tony Linthicum76329bf2011-12-12 21:14:55 +00006923// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006924void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006925 ArgStringList &CmdArgs) const {
6926}
6927
Douglas Katzman95354292015-06-23 20:42:09 +00006928void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6929 const InputInfo &Output,
6930 const InputInfoList &Inputs,
6931 const ArgList &Args,
6932 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006933 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006934
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006935 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6936 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006937 ArgStringList CmdArgs;
6938
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006939 std::string MArchString = "-march=hexagon";
6940 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006941
6942 RenderExtraToolArgs(JA, CmdArgs);
6943
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006944 std::string AsName = "hexagon-llvm-mc";
6945 std::string MCpuString = "-mcpu=hexagon" +
6946 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6947 CmdArgs.push_back("-filetype=obj");
6948 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6949
Tony Linthicum76329bf2011-12-12 21:14:55 +00006950 if (Output.isFilename()) {
6951 CmdArgs.push_back("-o");
6952 CmdArgs.push_back(Output.getFilename());
6953 } else {
6954 assert(Output.isNothing() && "Unexpected output");
6955 CmdArgs.push_back("-fsyntax-only");
6956 }
6957
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006958 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6959 std::string N = llvm::utostr(G.getValue());
6960 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6961 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006962
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006963 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006964
Tony Linthicum76329bf2011-12-12 21:14:55 +00006965 // Only pass -x if gcc will understand it; otherwise hope gcc
6966 // understands the suffix correctly. The main use case this would go
6967 // wrong in is for linker inputs if they happened to have an odd
6968 // suffix; really the only way to get this to happen is a command
6969 // like '-x foobar a.c' which will treat a.c like a linker input.
6970 //
6971 // FIXME: For the linker case specifically, can we safely convert
6972 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006973 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006974 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006975 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006976 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006977 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006978 else if (II.getType() == types::TY_AST)
6979 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006980 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006981 else if (II.getType() == types::TY_ModuleFile)
6982 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006983 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006984
6985 if (II.isFilename())
6986 CmdArgs.push_back(II.getFilename());
6987 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006988 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006989 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006990 II.getInputArg().render(Args, CmdArgs);
6991 }
6992
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006993 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006994 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006995}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006996
Douglas Katzman95354292015-06-23 20:42:09 +00006997void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6998 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006999}
7000
Douglas Katzman54366072015-07-27 16:53:08 +00007001static void
7002constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007003 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00007004 const InputInfo &Output, const InputInfoList &Inputs,
7005 const ArgList &Args, ArgStringList &CmdArgs,
7006 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00007007
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007008 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00007009
Matthew Curtise689b052012-12-06 15:46:07 +00007010 //----------------------------------------------------------------------------
7011 //
7012 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007013 bool IsStatic = Args.hasArg(options::OPT_static);
7014 bool IsShared = Args.hasArg(options::OPT_shared);
7015 bool IsPIE = Args.hasArg(options::OPT_pie);
7016 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
7017 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
7018 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
7019 bool UseG0 = false;
7020 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00007021
Matthew Curtise689b052012-12-06 15:46:07 +00007022 //----------------------------------------------------------------------------
7023 // Silence warnings for various options
7024 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00007025 Args.ClaimAllArgs(options::OPT_g_Group);
7026 Args.ClaimAllArgs(options::OPT_emit_llvm);
7027 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
7028 // handled somewhere else.
7029 Args.ClaimAllArgs(options::OPT_static_libgcc);
7030
7031 //----------------------------------------------------------------------------
7032 //
7033 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007034 if (Args.hasArg(options::OPT_s))
7035 CmdArgs.push_back("-s");
7036
7037 if (Args.hasArg(options::OPT_r))
7038 CmdArgs.push_back("-r");
7039
7040 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007041 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00007042
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007043 CmdArgs.push_back("-march=hexagon");
7044 std::string CpuVer =
7045 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
7046 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
7047 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00007048
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007049 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00007050 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007051 // The following should be the default, but doing as hexagon-gcc does.
7052 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00007053 }
7054
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007055 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00007056 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00007057
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007058 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00007059 CmdArgs.push_back("-pie");
7060
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007061 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
7062 std::string N = llvm::utostr(G.getValue());
7063 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
7064 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00007065 }
7066
Matthew Curtise689b052012-12-06 15:46:07 +00007067 //----------------------------------------------------------------------------
7068 //
7069 //----------------------------------------------------------------------------
7070 CmdArgs.push_back("-o");
7071 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00007072
Matthew Curtise689b052012-12-06 15:46:07 +00007073 //----------------------------------------------------------------------------
7074 // moslib
7075 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007076 std::vector<std::string> OsLibs;
7077 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00007078
Sean Silva14facf32015-06-09 01:57:17 +00007079 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
7080 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007081 OsLibs.emplace_back(A->getValue());
7082 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00007083 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007084 if (OsLibs.empty()) {
7085 OsLibs.push_back("standalone");
7086 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00007087 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00007088
Matthew Curtise689b052012-12-06 15:46:07 +00007089 //----------------------------------------------------------------------------
7090 // Start Files
7091 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007092 const std::string MCpuSuffix = "/" + CpuVer;
7093 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
7094 const std::string RootDir =
7095 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
7096 const std::string StartSubDir =
7097 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00007098
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007099 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
7100 const char *Name) -> std::string {
7101 std::string RelName = SubDir + Name;
7102 std::string P = HTC.GetFilePath(RelName.c_str());
7103 if (llvm::sys::fs::exists(P))
7104 return P;
7105 return RootDir + RelName;
7106 };
7107
7108 if (IncStdLib && IncStartFiles) {
7109 if (!IsShared) {
7110 if (HasStandalone) {
7111 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
7112 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00007113 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007114 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
7115 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00007116 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007117 std::string Init = UseShared
7118 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
7119 : Find(RootDir, StartSubDir, "/init.o");
7120 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00007121 }
7122
7123 //----------------------------------------------------------------------------
7124 // Library Search Paths
7125 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007126 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
7127 for (const auto &LibPath : LibPaths)
7128 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00007129
7130 //----------------------------------------------------------------------------
7131 //
7132 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007133 Args.AddAllArgs(CmdArgs,
7134 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7135 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00007136
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007137 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00007138
7139 //----------------------------------------------------------------------------
7140 // Libraries
7141 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007142 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007143 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007144 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00007145 CmdArgs.push_back("-lm");
7146 }
7147
7148 CmdArgs.push_back("--start-group");
7149
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007150 if (!IsShared) {
7151 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00007152 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00007153 CmdArgs.push_back("-lc");
7154 }
7155 CmdArgs.push_back("-lgcc");
7156
7157 CmdArgs.push_back("--end-group");
7158 }
7159
7160 //----------------------------------------------------------------------------
7161 // End files
7162 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007163 if (IncStdLib && IncStartFiles) {
7164 std::string Fini = UseShared
7165 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
7166 : Find(RootDir, StartSubDir, "/fini.o");
7167 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00007168 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00007169}
7170
Douglas Katzman95354292015-06-23 20:42:09 +00007171void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7172 const InputInfo &Output,
7173 const InputInfoList &Inputs,
7174 const ArgList &Args,
7175 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007176 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00007177
7178 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007179 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00007180 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00007181
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00007182 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00007183 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00007184 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00007185}
7186// Hexagon tools end.
7187
Tom Stellard8fa33092015-07-18 01:49:05 +00007188void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7189 const InputInfo &Output,
7190 const InputInfoList &Inputs,
7191 const ArgList &Args,
7192 const char *LinkingOutput) const {
7193
7194 std::string Linker = getToolChain().GetProgramPath(getShortName());
7195 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00007196 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00007197 CmdArgs.push_back("-shared");
7198 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00007199 CmdArgs.push_back(Output.getFilename());
7200 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
7201 CmdArgs, Inputs));
7202}
7203// AMDGPU tools end.
7204
Dan Gohman52816862015-12-16 23:30:41 +00007205wasm::Linker::Linker(const ToolChain &TC)
7206 : GnuTool("wasm::Linker", "lld", TC) {}
7207
7208bool wasm::Linker::isLinkJob() const {
7209 return true;
7210}
7211
7212bool wasm::Linker::hasIntegratedCPP() const {
7213 return false;
7214}
7215
7216void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7217 const InputInfo &Output,
7218 const InputInfoList &Inputs,
7219 const ArgList &Args,
7220 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00007221
7222 const ToolChain &ToolChain = getToolChain();
7223 const Driver &D = ToolChain.getDriver();
7224 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00007225 ArgStringList CmdArgs;
7226 CmdArgs.push_back("-flavor");
7227 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00007228
7229 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00007230 // size is of particular importance. This is significantly facilitated by
7231 // the enabling of -ffunction-sections and -fdata-sections in
7232 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00007233 if (areOptimizationsEnabled(Args))
7234 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00007235
Dan Gohman57b62c52016-02-22 19:26:15 +00007236 if (Args.hasArg(options::OPT_rdynamic))
7237 CmdArgs.push_back("-export-dynamic");
7238 if (Args.hasArg(options::OPT_s))
7239 CmdArgs.push_back("--strip-all");
7240 if (Args.hasArg(options::OPT_shared))
7241 CmdArgs.push_back("-shared");
7242 if (Args.hasArg(options::OPT_static))
7243 CmdArgs.push_back("-Bstatic");
7244
7245 Args.AddAllArgs(CmdArgs, options::OPT_L);
7246 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
7247
7248 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
7249 if (Args.hasArg(options::OPT_shared))
7250 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
7251 else if (Args.hasArg(options::OPT_pie))
7252 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
7253 else
7254 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
7255
7256 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7257 }
7258
7259 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7260
7261 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
7262 if (D.CCCIsCXX())
7263 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7264
7265 if (Args.hasArg(options::OPT_pthread))
7266 CmdArgs.push_back("-lpthread");
7267
7268 CmdArgs.push_back("-lc");
7269 CmdArgs.push_back("-lcompiler_rt");
7270 }
7271
7272 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
7273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
7274
Dan Gohman52816862015-12-16 23:30:41 +00007275 CmdArgs.push_back("-o");
7276 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00007277
Dan Gohman52816862015-12-16 23:30:41 +00007278 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
7279}
7280
Renato Golin7c542b42015-07-27 23:44:45 +00007281const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00007282 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00007283 if (!Arch.empty())
7284 MArch = Arch;
7285 else
Bernard Ogden31561762013-12-12 13:27:11 +00007286 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00007287 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00007288
7289 // Handle -march=native.
7290 if (MArch == "native") {
7291 std::string CPU = llvm::sys::getHostCPUName();
7292 if (CPU != "generic") {
7293 // Translate the native cpu into the architecture suffix for that CPU.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00007294 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007295 // If there is no valid architecture suffix for this CPU we don't know how
7296 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007297 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00007298 MArch = "";
7299 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007300 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00007301 }
7302 }
7303
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007304 return MArch;
7305}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007306
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007307/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007308StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00007309 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00007310 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
7311 // here means an -march=native that we can't handle, so instead return no CPU.
7312 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007313 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00007314
John Brawna95c1a82015-05-08 12:52:18 +00007315 // We need to return an empty string here on invalid MArch values as the
7316 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00007317 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00007318}
7319
7320/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00007321std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007322 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00007323 // FIXME: Warn on inconsistent use of -mcpu and -march.
7324 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00007325 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00007326 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00007327 // Handle -mcpu=native.
7328 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007329 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007330 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007331 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007332 }
7333
Renato Goline17c5802015-07-27 23:44:42 +00007334 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007335}
7336
7337/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007338/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007339// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007340StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7341 const llvm::Triple &Triple) {
7342 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007343 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007344 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007345 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007346 if (ArchKind == llvm::ARM::AK_INVALID)
7347 // In case of generic Arch, i.e. "arm",
7348 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007349 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007350 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007351 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7352 // armv7k triple if it's actually been specified via "-arch armv7k".
7353 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007354 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007355 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007356 }
Renato Golin3c007252015-05-28 15:05:53 +00007357 if (ArchKind == llvm::ARM::AK_INVALID)
7358 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007359 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007360}
7361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007362void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007363 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007364 if (Args.hasArg(options::OPT_r))
7365 return;
7366
John Brawn94fd9632015-05-21 12:19:49 +00007367 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7368 // to generate BE-8 executables.
7369 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7370 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007371}
7372
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007373mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007374 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7375 // was first introduced in Release 3. However, other compilers have
7376 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007377 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7378 .Case("mips1", NanLegacy)
7379 .Case("mips2", NanLegacy)
7380 .Case("mips3", NanLegacy)
7381 .Case("mips4", NanLegacy)
7382 .Case("mips5", NanLegacy)
7383 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007384 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007385 .Case("mips32r3", NanLegacy | Nan2008)
7386 .Case("mips32r5", NanLegacy | Nan2008)
7387 .Case("mips32r6", Nan2008)
7388 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007389 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007390 .Case("mips64r3", NanLegacy | Nan2008)
7391 .Case("mips64r5", NanLegacy | Nan2008)
7392 .Case("mips64r6", Nan2008)
7393 .Default(NanLegacy);
7394}
7395
Simon Dardisd0e83ba2016-05-27 15:13:31 +00007396bool mips::hasCompactBranches(StringRef &CPU) {
7397 // mips32r6 and mips64r6 have compact branches.
7398 return llvm::StringSwitch<bool>(CPU)
7399 .Case("mips32r6", true)
7400 .Case("mips64r6", true)
7401 .Default(false);
7402}
7403
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007404bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7405 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7406 return A && (A->getValue() == StringRef(Value));
7407}
7408
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007409bool mips::isUCLibc(const ArgList &Args) {
7410 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007411 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007412}
7413
Daniel Sanders2bf13662014-07-10 14:40:57 +00007414bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007415 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7416 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007417 .Case("2008", true)
7418 .Case("legacy", false)
7419 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007420
7421 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007422 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007423 .Cases("mips32r6", "mips64r6", true)
7424 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007425
7426 return false;
7427}
7428
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007429bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7430 if (!Triple.isAndroid())
7431 return false;
7432
7433 // Android MIPS32R6 defaults to FP64A.
7434 return llvm::StringSwitch<bool>(CPUName)
7435 .Case("mips32r6", true)
7436 .Default(false);
7437}
7438
Daniel Sanders379d44b2014-07-16 11:52:23 +00007439bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007440 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007441 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007442 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7443 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007444 return false;
7445
7446 if (ABIName != "32")
7447 return false;
7448
Toma Tabacu94ea6862015-06-16 13:54:13 +00007449 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7450 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007451 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007452 return false;
7453
Daniel Sanders379d44b2014-07-16 11:52:23 +00007454 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007455 .Cases("mips2", "mips3", "mips4", "mips5", true)
7456 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7457 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7458 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007459}
7460
Toma Tabacu94ea6862015-06-16 13:54:13 +00007461bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7462 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007463 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007464 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7465
7466 // FPXX shouldn't be used if -msingle-float is present.
7467 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7468 options::OPT_mdouble_float))
7469 if (A->getOption().matches(options::OPT_msingle_float))
7470 UseFPXX = false;
7471
7472 return UseFPXX;
7473}
7474
Tim Northover157d9112014-01-16 08:48:16 +00007475llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007476 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7477 // archs which Darwin doesn't use.
7478
7479 // The matching this routine does is fairly pointless, since it is neither the
7480 // complete architecture list, nor a reasonable subset. The problem is that
7481 // historically the driver driver accepts this and also ties its -march=
7482 // handling to the architecture name, so we need to be careful before removing
7483 // support for it.
7484
7485 // This code must be kept in sync with Clang's Darwin specific argument
7486 // translation.
7487
7488 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007489 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7490 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7491 .Case("ppc64", llvm::Triple::ppc64)
7492 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7493 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7494 llvm::Triple::x86)
7495 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7496 // This is derived from the driver driver.
7497 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7498 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7499 .Cases("armv7s", "xscale", llvm::Triple::arm)
7500 .Case("arm64", llvm::Triple::aarch64)
7501 .Case("r600", llvm::Triple::r600)
7502 .Case("amdgcn", llvm::Triple::amdgcn)
7503 .Case("nvptx", llvm::Triple::nvptx)
7504 .Case("nvptx64", llvm::Triple::nvptx64)
7505 .Case("amdil", llvm::Triple::amdil)
7506 .Case("spir", llvm::Triple::spir)
7507 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007508}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007509
Tim Northover157d9112014-01-16 08:48:16 +00007510void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007511 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Zijiao Ma56a83722016-08-17 02:13:33 +00007512 unsigned ArchKind = llvm::ARM::parseArch(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007513 T.setArch(Arch);
7514
7515 if (Str == "x86_64h")
7516 T.setArchName(Str);
Zijiao Ma56a83722016-08-17 02:13:33 +00007517 else if (ArchKind == llvm::ARM::AK_ARMV6M ||
7518 ArchKind == llvm::ARM::AK_ARMV7M ||
7519 ArchKind == llvm::ARM::AK_ARMV7EM) {
Tim Northover157d9112014-01-16 08:48:16 +00007520 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007521 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007522 }
7523}
7524
Bob Wilsondecc03e2012-11-23 06:14:39 +00007525const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007526 const InputInfo &Input) {
7527 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007528}
7529
Bob Wilsondecc03e2012-11-23 06:14:39 +00007530const char *Clang::getBaseInputStem(const ArgList &Args,
7531 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007532 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007533
Chris Lattner906bb902011-01-16 08:14:11 +00007534 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007535 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007536
7537 return Str;
7538}
7539
Bob Wilsondecc03e2012-11-23 06:14:39 +00007540const char *Clang::getDependencyFileName(const ArgList &Args,
7541 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007542 // FIXME: Think about this more.
7543 std::string Res;
7544
7545 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007546 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007547 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007548 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007549 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007550 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007551 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007552}
7553
Douglas Katzman95354292015-06-23 20:42:09 +00007554void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7555 const InputInfo &Output,
7556 const InputInfoList &Inputs,
7557 const ArgList &Args,
7558 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007559 const ToolChain &ToolChain = getToolChain();
7560 const Driver &D = ToolChain.getDriver();
7561 ArgStringList CmdArgs;
7562
7563 // Silence warning for "clang -g foo.o -o foo"
7564 Args.ClaimAllArgs(options::OPT_g_Group);
7565 // and "clang -emit-llvm foo.o -o foo"
7566 Args.ClaimAllArgs(options::OPT_emit_llvm);
7567 // and for "clang -w foo.o -o foo". Other warning options are already
7568 // handled somewhere else.
7569 Args.ClaimAllArgs(options::OPT_w);
7570
7571 if (!D.SysRoot.empty())
7572 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7573
7574 // CloudABI only supports static linkage.
7575 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007576 CmdArgs.push_back("--no-dynamic-linker");
Ed Schouten610adae2016-08-11 20:03:22 +00007577
7578 // Provide PIE linker flags in case PIE is default for the architecture.
7579 if (ToolChain.isPIEDefault()) {
7580 CmdArgs.push_back("-pie");
7581 CmdArgs.push_back("-zrelro");
7582 }
Ed Schouten506f2952016-04-06 15:37:06 +00007583
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007584 CmdArgs.push_back("--eh-frame-hdr");
7585 CmdArgs.push_back("--gc-sections");
7586
7587 if (Output.isFilename()) {
7588 CmdArgs.push_back("-o");
7589 CmdArgs.push_back(Output.getFilename());
7590 } else {
7591 assert(Output.isNothing() && "Invalid output.");
7592 }
7593
Douglas Katzman78b37b02015-11-17 20:28:07 +00007594 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007595 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7596 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7597 }
7598
7599 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007600 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007601 Args.AddAllArgs(CmdArgs,
7602 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7603 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007604
Teresa Johnson945bc502015-10-15 20:35:53 +00007605 if (D.isUsingLTO())
7606 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007607
7608 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7609
Douglas Katzman78b37b02015-11-17 20:28:07 +00007610 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007611 if (D.CCCIsCXX())
7612 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7613 CmdArgs.push_back("-lc");
7614 CmdArgs.push_back("-lcompiler_rt");
7615 }
7616
Douglas Katzman78b37b02015-11-17 20:28:07 +00007617 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007618 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7619
7620 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007622}
7623
Douglas Katzman95354292015-06-23 20:42:09 +00007624void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7625 const InputInfo &Output,
7626 const InputInfoList &Inputs,
7627 const ArgList &Args,
7628 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007629 ArgStringList CmdArgs;
7630
7631 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7632 const InputInfo &Input = Inputs[0];
7633
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007634 // Determine the original source input.
7635 const Action *SourceAction = &JA;
7636 while (SourceAction->getKind() != Action::InputClass) {
7637 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7638 SourceAction = SourceAction->getInputs()[0];
7639 }
7640
Eric Christopherf5a8f492015-12-08 00:10:10 +00007641 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007642 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007643 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7644 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007645 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007646 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007647 const llvm::Triple &T(getToolChain().getTriple());
7648 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007649 CmdArgs.push_back("-Q");
7650 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007651
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007652 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007653 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007654 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007655 if (Args.hasArg(options::OPT_gstabs))
7656 CmdArgs.push_back("--gstabs");
7657 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007658 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007659 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007660
Daniel Dunbarbe220842009-03-20 16:06:39 +00007661 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007662 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007663
Daniel Dunbar6d484762010-07-22 01:47:22 +00007664 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007665 if (getToolChain().getArch() == llvm::Triple::x86 ||
7666 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007667 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7668 CmdArgs.push_back("-force_cpusubtype_ALL");
7669
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007670 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007671 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007672 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007673 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007674 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007675 CmdArgs.push_back("-static");
7676
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007677 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007678
7679 assert(Output.isFilename() && "Unexpected lipo output.");
7680 CmdArgs.push_back("-o");
7681 CmdArgs.push_back(Output.getFilename());
7682
Daniel Dunbarb440f562010-08-02 02:38:21 +00007683 assert(Input.isFilename() && "Invalid input.");
7684 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007685
7686 // asm_final spec is empty.
7687
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007688 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007689 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007690}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007691
Tim Northover157d9112014-01-16 08:48:16 +00007692void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007693
Tim Northover157d9112014-01-16 08:48:16 +00007694void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7695 ArgStringList &CmdArgs) const {
7696 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007697
Daniel Dunbarc1964212009-03-26 16:23:12 +00007698 // Derived from darwin_arch spec.
7699 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007700 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007701
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007702 // FIXME: Is this needed anymore?
7703 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007704 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007705}
7706
Douglas Katzman95354292015-06-23 20:42:09 +00007707bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007708 // We only need to generate a temp path for LTO if we aren't compiling object
7709 // files. When compiling source files, we run 'dsymutil' after linking. We
7710 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007711 for (const auto &Input : Inputs)
7712 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007713 return true;
7714
7715 return false;
7716}
7717
Douglas Katzman95354292015-06-23 20:42:09 +00007718void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7719 ArgStringList &CmdArgs,
7720 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007721 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007722 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007723
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007724 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007725 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007726 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007727 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007728 }
7729
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007730 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007731 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007732 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7733 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007734
Bob Wilson3d27dad2013-08-02 22:25:34 +00007735 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7736 CmdArgs.push_back("-export_dynamic");
7737
Bob Wilsonb111ec92015-03-02 19:01:14 +00007738 // If we are using App Extension restrictions, pass a flag to the linker
7739 // telling it that the compiled code has been audited.
7740 if (Args.hasFlag(options::OPT_fapplication_extension,
7741 options::OPT_fno_application_extension, false))
7742 CmdArgs.push_back("-application_extension");
7743
Teresa Johnson945bc502015-10-15 20:35:53 +00007744 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007745 // If we are using LTO, then automatically create a temporary file path for
7746 // the linker to use, so that it's lifetime will extend past a possible
7747 // dsymutil step.
7748 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7749 const char *TmpPath = C.getArgs().MakeArgString(
7750 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7751 C.addTempFile(TmpPath);
7752 CmdArgs.push_back("-object_path_lto");
7753 CmdArgs.push_back(TmpPath);
7754 }
7755
7756 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7757 // it in clang installed libraries. If not found, the option is not used
7758 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7759 if (Version[0] >= 133) {
7760 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7761 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7762 SmallString<128> LibLTOPath(P);
7763 llvm::sys::path::append(LibLTOPath, "lib");
7764 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7765 if (llvm::sys::fs::exists(LibLTOPath)) {
7766 CmdArgs.push_back("-lto_library");
7767 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7768 } else {
7769 D.Diag(diag::warn_drv_lto_libpath);
7770 }
7771 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007772 }
7773
Daniel Dunbarc1964212009-03-26 16:23:12 +00007774 // Derived from the "link" spec.
7775 Args.AddAllArgs(CmdArgs, options::OPT_static);
7776 if (!Args.hasArg(options::OPT_static))
7777 CmdArgs.push_back("-dynamic");
7778 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7779 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7780 // here. How do we wish to handle such things?
7781 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007782
Daniel Dunbarc1964212009-03-26 16:23:12 +00007783 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007784 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007785 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007786 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007787
7788 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7789 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7790 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7791
7792 Arg *A;
7793 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7794 (A = Args.getLastArg(options::OPT_current__version)) ||
7795 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007796 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7797 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007798
7799 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7800 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7801 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7802 } else {
7803 CmdArgs.push_back("-dylib");
7804
7805 Arg *A;
7806 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7807 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7808 (A = Args.getLastArg(options::OPT_client__name)) ||
7809 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7810 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7811 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007812 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7813 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007814
Daniel Dunbarc1964212009-03-26 16:23:12 +00007815 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7816 "-dylib_compatibility_version");
7817 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7818 "-dylib_current_version");
7819
Tim Northover157d9112014-01-16 08:48:16 +00007820 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007821
7822 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7823 "-dylib_install_name");
7824 }
7825
7826 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7827 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7828 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007829 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007830 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007831 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7832 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7833 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7834 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7835 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7836 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007837 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007838 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7839 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7840 Args.AddAllArgs(CmdArgs, options::OPT_init);
7841
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007842 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007843 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007844
Daniel Dunbarc1964212009-03-26 16:23:12 +00007845 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7846 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7847 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7848 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7849 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007851 if (const Arg *A =
7852 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7853 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007854 if (A->getOption().matches(options::OPT_fpie) ||
7855 A->getOption().matches(options::OPT_fPIE))
7856 CmdArgs.push_back("-pie");
7857 else
7858 CmdArgs.push_back("-no_pie");
7859 }
Steven Wu574b0f22016-03-01 01:07:58 +00007860 // for embed-bitcode, use -bitcode_bundle in linker command
7861 if (C.getDriver().embedBitcodeEnabled() ||
7862 C.getDriver().embedBitcodeMarkerOnly()) {
7863 // Check if the toolchain supports bitcode build flow.
7864 if (MachOTC.SupportsEmbeddedBitcode())
7865 CmdArgs.push_back("-bitcode_bundle");
7866 else
7867 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7868 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007869
7870 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7871 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7872 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7873 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7874 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7875 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7876 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7877 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7878 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7879 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7880 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7881 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7882 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7883 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7884 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7885 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007886
Daniel Dunbar84384642011-05-02 21:03:47 +00007887 // Give --sysroot= preference, over the Apple specific behavior to also use
7888 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007889 StringRef sysroot = C.getSysRoot();
7890 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007891 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007892 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007893 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7894 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007895 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007896 }
7897
Daniel Dunbarc1964212009-03-26 16:23:12 +00007898 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7899 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7900 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7901 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7902 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007903 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007904 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7905 Args.AddAllArgs(CmdArgs, options::OPT_y);
7906 Args.AddLastArg(CmdArgs, options::OPT_w);
7907 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7908 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7909 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7910 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7911 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7912 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7913 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7914 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7915 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7916 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7917 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7918 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7919}
7920
Douglas Katzman95354292015-06-23 20:42:09 +00007921void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7922 const InputInfo &Output,
7923 const InputInfoList &Inputs,
7924 const ArgList &Args,
7925 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007926 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007927
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007928 // If the number of arguments surpasses the system limits, we will encode the
7929 // input files in a separate file, shortening the command line. To this end,
7930 // build a list of input file names that can be passed via a file with the
7931 // -filelist linker option.
7932 llvm::opt::ArgStringList InputFileList;
7933
Daniel Dunbarc1964212009-03-26 16:23:12 +00007934 // The logic here is derived from gcc's behavior; most of which
7935 // comes from specs (starting with link_command). Consult gcc for
7936 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007937 ArgStringList CmdArgs;
7938
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007939 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7940 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7941 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007942 for (const auto &Arg : Args)
7943 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007944 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007945 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007946 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007947 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007948 return;
7949 }
7950
Daniel Dunbarc1964212009-03-26 16:23:12 +00007951 // I'm not sure why this particular decomposition exists in gcc, but
7952 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007953 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007954
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007955 // It seems that the 'e' option is completely ignored for dynamic executables
7956 // (the default), and with static executables, the last one wins, as expected.
7957 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7958 options::OPT_Z_Flag, options::OPT_u_Group,
7959 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007960
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007961 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7962 // members of static archive libraries which implement Objective-C classes or
7963 // categories.
7964 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7965 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007966
Daniel Dunbarc1964212009-03-26 16:23:12 +00007967 CmdArgs.push_back("-o");
7968 CmdArgs.push_back(Output.getFilename());
7969
Douglas Katzman78b37b02015-11-17 20:28:07 +00007970 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007971 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007972
Peter Collingbournec4122c12015-06-15 21:08:13 +00007973 // SafeStack requires its own runtime libraries
7974 // These libraries should be linked first, to make sure the
7975 // __safestack_init constructor executes before everything else
7976 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7977 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7978 "libclang_rt.safestack_osx.a",
7979 /*AlwaysLink=*/true);
7980 }
7981
Daniel Dunbarc1964212009-03-26 16:23:12 +00007982 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007983
Douglas Gregor9295df02012-05-15 21:00:27 +00007984 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007985 // Build the input file for -filelist (list of linker input files) in case we
7986 // need it later
7987 for (const auto &II : Inputs) {
7988 if (!II.isFilename()) {
7989 // This is a linker input argument.
7990 // We cannot mix input arguments and file names in a -filelist input, thus
7991 // we prematurely stop our list (remaining files shall be passed as
7992 // arguments).
7993 if (InputFileList.size() > 0)
7994 break;
7995
7996 continue;
7997 }
7998
7999 InputFileList.push_back(II.getFilename());
8000 }
8001
Douglas Katzman78b37b02015-11-17 20:28:07 +00008002 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00008003 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
8004
Douglas Katzman78b37b02015-11-17 20:28:07 +00008005 if (isObjCRuntimeLinked(Args) &&
8006 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00008007 // We use arclite library for both ARC and subscripting support.
8008 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
8009
Bob Wilson7dda0cd2012-04-21 00:21:42 +00008010 CmdArgs.push_back("-framework");
8011 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00008012 // Link libobj.
8013 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00008014 }
John McCall31168b02011-06-15 23:02:42 +00008015
Daniel Dunbarc1964212009-03-26 16:23:12 +00008016 if (LinkingOutput) {
8017 CmdArgs.push_back("-arch_multiple");
8018 CmdArgs.push_back("-final_output");
8019 CmdArgs.push_back(LinkingOutput);
8020 }
8021
Daniel Dunbarc1964212009-03-26 16:23:12 +00008022 if (Args.hasArg(options::OPT_fnested_functions))
8023 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00008024
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008025 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
Justin Bognerc7701242015-05-12 05:44:36 +00008026
Douglas Katzman78b37b02015-11-17 20:28:07 +00008027 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008028 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008029 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00008030
Daniel Dunbarc1964212009-03-26 16:23:12 +00008031 // link_ssp spec is empty.
8032
Daniel Dunbar26d482a2009-09-18 08:15:03 +00008033 // Let the tool chain choose which runtime library to link.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008034 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00008035 }
8036
Douglas Katzman78b37b02015-11-17 20:28:07 +00008037 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00008038 // endfile_spec is empty.
8039 }
8040
8041 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8042 Args.AddAllArgs(CmdArgs, options::OPT_F);
8043
Steven Wu3ffb61b2015-02-06 18:08:29 +00008044 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00008045 for (const Arg *A : Args.filtered(options::OPT_iframework))
8046 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00008047
Douglas Katzman78b37b02015-11-17 20:28:07 +00008048 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00008049 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
8050 if (A->getValue() == StringRef("Accelerate")) {
8051 CmdArgs.push_back("-framework");
8052 CmdArgs.push_back("Accelerate");
8053 }
8054 }
8055 }
8056
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008057 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00008058 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00008059 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00008060 Cmd->setInputFileList(std::move(InputFileList));
8061 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00008062}
8063
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00008064void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008065 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00008066 const InputInfoList &Inputs,
8067 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00008068 const char *LinkingOutput) const {
8069 ArgStringList CmdArgs;
8070
8071 CmdArgs.push_back("-create");
8072 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00008073
8074 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00008075 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00008076
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008077 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00008078 assert(II.isFilename() && "Unexpected lipo input.");
8079 CmdArgs.push_back(II.getFilename());
8080 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008081
8082 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008083 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00008084}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008085
Daniel Dunbar88299622010-06-04 18:28:36 +00008086void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00008087 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00008088 const InputInfoList &Inputs,
8089 const ArgList &Args,
8090 const char *LinkingOutput) const {
8091 ArgStringList CmdArgs;
8092
Daniel Dunbareb86b042011-05-09 17:23:16 +00008093 CmdArgs.push_back("-o");
8094 CmdArgs.push_back(Output.getFilename());
8095
Daniel Dunbar88299622010-06-04 18:28:36 +00008096 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
8097 const InputInfo &Input = Inputs[0];
8098 assert(Input.isFilename() && "Unexpected dsymutil input.");
8099 CmdArgs.push_back(Input.getFilename());
8100
Daniel Dunbar88299622010-06-04 18:28:36 +00008101 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008102 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008103 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00008104}
8105
Eric Christopher551ef452011-08-23 17:56:55 +00008106void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00008107 const InputInfo &Output,
8108 const InputInfoList &Inputs,
8109 const ArgList &Args,
8110 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00008111 ArgStringList CmdArgs;
8112 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00008113 CmdArgs.push_back("--debug-info");
8114 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00008115 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00008116
8117 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
8118 const InputInfo &Input = Inputs[0];
8119 assert(Input.isFilename() && "Unexpected verify input");
8120
8121 // Grabbing the output of the earlier dsymutil run.
8122 CmdArgs.push_back(Input.getFilename());
8123
8124 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008125 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008126 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00008127}
8128
Douglas Katzman95354292015-06-23 20:42:09 +00008129void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00008130 const InputInfo &Output,
8131 const InputInfoList &Inputs,
8132 const ArgList &Args,
8133 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008134 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00008135 ArgStringList CmdArgs;
8136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00008138
8139 CmdArgs.push_back("-o");
8140 CmdArgs.push_back(Output.getFilename());
8141
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008142 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00008143 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00008144
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008145 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00008147}
8148
Douglas Katzman95354292015-06-23 20:42:09 +00008149void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8150 const InputInfo &Output,
8151 const InputInfoList &Inputs,
8152 const ArgList &Args,
8153 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00008154 ArgStringList CmdArgs;
8155
David Chisnall272a0712012-02-29 15:06:12 +00008156 // Demangle C++ names in errors
8157 CmdArgs.push_back("-C");
8158
Douglas Katzman78b37b02015-11-17 20:28:07 +00008159 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00008160 CmdArgs.push_back("-e");
8161 CmdArgs.push_back("_start");
8162 }
8163
8164 if (Args.hasArg(options::OPT_static)) {
8165 CmdArgs.push_back("-Bstatic");
8166 CmdArgs.push_back("-dn");
8167 } else {
8168 CmdArgs.push_back("-Bdynamic");
8169 if (Args.hasArg(options::OPT_shared)) {
8170 CmdArgs.push_back("-shared");
8171 } else {
8172 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00008173 CmdArgs.push_back(
8174 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00008175 }
8176 }
8177
8178 if (Output.isFilename()) {
8179 CmdArgs.push_back("-o");
8180 CmdArgs.push_back(Output.getFilename());
8181 } else {
8182 assert(Output.isNothing() && "Invalid output.");
8183 }
8184
Douglas Katzman78b37b02015-11-17 20:28:07 +00008185 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00008186 if (!Args.hasArg(options::OPT_shared))
8187 CmdArgs.push_back(
8188 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8189
8190 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8191 CmdArgs.push_back(
8192 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
8193 CmdArgs.push_back(
8194 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00008195 }
8196
Douglas Katzman6059ef92015-11-17 17:41:23 +00008197 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00008198
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008199 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8200 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00008201
8202 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8203
Douglas Katzman78b37b02015-11-17 20:28:07 +00008204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008205 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00008206 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00008207 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00008208 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00008209 if (!Args.hasArg(options::OPT_shared)) {
8210 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00008211 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00008212 }
David Chisnallf571cde2012-02-15 13:39:01 +00008213 }
8214
Douglas Katzman78b37b02015-11-17 20:28:07 +00008215 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00008216 CmdArgs.push_back(
8217 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00008218 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00008219 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00008220
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008221 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00008222
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008223 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008224 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00008225}
8226
Douglas Katzman95354292015-06-23 20:42:09 +00008227void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8228 const InputInfo &Output,
8229 const InputInfoList &Inputs,
8230 const ArgList &Args,
8231 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008232 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008233 ArgStringList CmdArgs;
8234
Rafael Espindolacc126272014-02-28 01:55:21 +00008235 switch (getToolChain().getArch()) {
8236 case llvm::Triple::x86:
8237 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
8238 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008239 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00008240 break;
8241
8242 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008243 CmdArgs.push_back("-mppc");
8244 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00008245 break;
8246
8247 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008248 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00008249 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008250 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8251 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8252 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00008253 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008254 }
Rafael Espindolacc126272014-02-28 01:55:21 +00008255
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008256 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00008257 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008258 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8259 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8260 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00008261 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008262 }
Rafael Espindolacc126272014-02-28 01:55:21 +00008263
8264 case llvm::Triple::mips64:
8265 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008266 StringRef CPUName;
8267 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008268 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008269
8270 CmdArgs.push_back("-mabi");
8271 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8272
8273 if (getToolChain().getArch() == llvm::Triple::mips64)
8274 CmdArgs.push_back("-EB");
8275 else
8276 CmdArgs.push_back("-EL");
8277
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008278 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00008279 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008280 }
8281
Rafael Espindolacc126272014-02-28 01:55:21 +00008282 default:
8283 break;
8284 }
8285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008286 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008287
8288 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008289 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008290
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008291 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008292 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008293
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008294 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008296}
8297
Douglas Katzman95354292015-06-23 20:42:09 +00008298void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8299 const InputInfo &Output,
8300 const InputInfoList &Inputs,
8301 const ArgList &Args,
8302 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008303 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008304 ArgStringList CmdArgs;
8305
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00008306 // Silence warning for "clang -g foo.o -o foo"
8307 Args.ClaimAllArgs(options::OPT_g_Group);
8308 // and "clang -emit-llvm foo.o -o foo"
8309 Args.ClaimAllArgs(options::OPT_emit_llvm);
8310 // and for "clang -w foo.o -o foo". Other warning options are already
8311 // handled somewhere else.
8312 Args.ClaimAllArgs(options::OPT_w);
8313
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00008314 if (getToolChain().getArch() == llvm::Triple::mips64)
8315 CmdArgs.push_back("-EB");
8316 else if (getToolChain().getArch() == llvm::Triple::mips64el)
8317 CmdArgs.push_back("-EL");
8318
Douglas Katzman78b37b02015-11-17 20:28:07 +00008319 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008320 CmdArgs.push_back("-e");
8321 CmdArgs.push_back("__start");
8322 }
8323
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008324 if (Args.hasArg(options::OPT_static)) {
8325 CmdArgs.push_back("-Bstatic");
8326 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008327 if (Args.hasArg(options::OPT_rdynamic))
8328 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008329 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008330 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008331 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008332 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008333 } else {
8334 CmdArgs.push_back("-dynamic-linker");
8335 CmdArgs.push_back("/usr/libexec/ld.so");
8336 }
8337 }
8338
Rafael Espindola044f7832013-06-05 04:28:55 +00008339 if (Args.hasArg(options::OPT_nopie))
8340 CmdArgs.push_back("-nopie");
8341
Daniel Dunbarb440f562010-08-02 02:38:21 +00008342 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008343 CmdArgs.push_back("-o");
8344 CmdArgs.push_back(Output.getFilename());
8345 } else {
8346 assert(Output.isNothing() && "Invalid output.");
8347 }
8348
Douglas Katzman78b37b02015-11-17 20:28:07 +00008349 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008350 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008351 if (Args.hasArg(options::OPT_pg))
8352 CmdArgs.push_back(
8353 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008354 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008355 CmdArgs.push_back(
8356 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8357 CmdArgs.push_back(
8358 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008359 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008360 CmdArgs.push_back(
8361 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008362 }
8363 }
8364
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008365 std::string Triple = getToolChain().getTripleString();
8366 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008367 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008368 CmdArgs.push_back(
8369 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008370
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008371 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8372 options::OPT_e, options::OPT_s, options::OPT_t,
8373 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008374
Daniel Dunbar54423b22010-09-17 00:24:54 +00008375 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008376
Douglas Katzman78b37b02015-11-17 20:28:07 +00008377 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008378 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008379 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008380 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008381 CmdArgs.push_back("-lm_p");
8382 else
8383 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008384 }
8385
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008386 // FIXME: For some reason GCC passes -lgcc before adding
8387 // the default system libraries. Just mimic this for now.
8388 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008389
Eric Christopher17674ec2012-09-13 06:32:34 +00008390 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008391 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8392 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008393 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008394 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008395 }
8396
Chandler Carruth45661652011-12-17 22:32:42 +00008397 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008398 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008399 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008400 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008401 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008402 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008403
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008404 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008405 }
8406
Douglas Katzman78b37b02015-11-17 20:28:07 +00008407 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008408 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008409 CmdArgs.push_back(
8410 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008411 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008412 CmdArgs.push_back(
8413 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008414 }
8415
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008416 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008418}
Ed Schoutene33194b2009-04-02 19:13:12 +00008419
Douglas Katzman95354292015-06-23 20:42:09 +00008420void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8421 const InputInfo &Output,
8422 const InputInfoList &Inputs,
8423 const ArgList &Args,
8424 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008425 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008426 ArgStringList CmdArgs;
8427
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008429
8430 CmdArgs.push_back("-o");
8431 CmdArgs.push_back(Output.getFilename());
8432
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008433 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008434 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008435
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008436 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008438}
8439
Douglas Katzman95354292015-06-23 20:42:09 +00008440void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8441 const InputInfo &Output,
8442 const InputInfoList &Inputs,
8443 const ArgList &Args,
8444 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008445 const Driver &D = getToolChain().getDriver();
8446 ArgStringList CmdArgs;
8447
Douglas Katzman78b37b02015-11-17 20:28:07 +00008448 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008449 CmdArgs.push_back("-e");
8450 CmdArgs.push_back("__start");
8451 }
8452
8453 if (Args.hasArg(options::OPT_static)) {
8454 CmdArgs.push_back("-Bstatic");
8455 } else {
8456 if (Args.hasArg(options::OPT_rdynamic))
8457 CmdArgs.push_back("-export-dynamic");
8458 CmdArgs.push_back("--eh-frame-hdr");
8459 CmdArgs.push_back("-Bdynamic");
8460 if (Args.hasArg(options::OPT_shared)) {
8461 CmdArgs.push_back("-shared");
8462 } else {
8463 CmdArgs.push_back("-dynamic-linker");
8464 CmdArgs.push_back("/usr/libexec/ld.so");
8465 }
8466 }
8467
8468 if (Output.isFilename()) {
8469 CmdArgs.push_back("-o");
8470 CmdArgs.push_back(Output.getFilename());
8471 } else {
8472 assert(Output.isNothing() && "Invalid output.");
8473 }
8474
Douglas Katzman78b37b02015-11-17 20:28:07 +00008475 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008476 if (!Args.hasArg(options::OPT_shared)) {
8477 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008478 CmdArgs.push_back(
8479 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008480 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008481 CmdArgs.push_back(
8482 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8483 CmdArgs.push_back(
8484 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008485 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008486 CmdArgs.push_back(
8487 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008488 }
8489 }
8490
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008491 Args.AddAllArgs(CmdArgs,
8492 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008493
8494 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8495
Douglas Katzman78b37b02015-11-17 20:28:07 +00008496 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008497 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008498 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8499 if (Args.hasArg(options::OPT_pg))
8500 CmdArgs.push_back("-lm_p");
8501 else
8502 CmdArgs.push_back("-lm");
8503 }
8504
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008505 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008506 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008507 CmdArgs.push_back("-lpthread_p");
8508 else
8509 CmdArgs.push_back("-lpthread");
8510 }
8511
Eli Friedman9fa28852012-08-08 23:57:20 +00008512 if (!Args.hasArg(options::OPT_shared)) {
8513 if (Args.hasArg(options::OPT_pg))
8514 CmdArgs.push_back("-lc_p");
8515 else
8516 CmdArgs.push_back("-lc");
8517 }
8518
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008519 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008520 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008521 case llvm::Triple::arm:
8522 MyArch = "arm";
8523 break;
8524 case llvm::Triple::x86:
8525 MyArch = "i386";
8526 break;
8527 case llvm::Triple::x86_64:
8528 MyArch = "amd64";
8529 break;
8530 default:
8531 llvm_unreachable("Unsupported architecture");
8532 }
8533 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008534 }
8535
Douglas Katzman78b37b02015-11-17 20:28:07 +00008536 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008537 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008538 CmdArgs.push_back(
8539 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008540 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008541 CmdArgs.push_back(
8542 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008543 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008544
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008545 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008547}
8548
Douglas Katzman95354292015-06-23 20:42:09 +00008549void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8550 const InputInfo &Output,
8551 const InputInfoList &Inputs,
8552 const ArgList &Args,
8553 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008554 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008555 ArgStringList CmdArgs;
8556
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008557 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8558 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008559 switch (getToolChain().getArch()) {
8560 default:
8561 break;
8562 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008563 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008564 break;
8565 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008566 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008567 break;
8568 case llvm::Triple::mips:
8569 case llvm::Triple::mipsel:
8570 case llvm::Triple::mips64:
8571 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008572 StringRef CPUName;
8573 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008574 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008575
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008576 CmdArgs.push_back("-march");
8577 CmdArgs.push_back(CPUName.data());
8578
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008579 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008580 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008581
8582 if (getToolChain().getArch() == llvm::Triple::mips ||
8583 getToolChain().getArch() == llvm::Triple::mips64)
8584 CmdArgs.push_back("-EB");
8585 else
8586 CmdArgs.push_back("-EL");
8587
Dimitry Andric46f338c2015-12-27 10:36:44 +00008588 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8589 StringRef v = A->getValue();
8590 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8591 A->claim();
8592 }
8593
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008594 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008595 break;
8596 }
8597 case llvm::Triple::arm:
8598 case llvm::Triple::armeb:
8599 case llvm::Triple::thumb:
8600 case llvm::Triple::thumbeb: {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008601 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008602
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008603 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008604 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008605 else
Renato Golinf4421f72014-02-19 10:44:07 +00008606 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008608 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008609 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008610 case llvm::Triple::GNUEABI:
8611 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008612 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008613 break;
8614
8615 default:
8616 CmdArgs.push_back("-matpcs");
8617 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008618 break;
8619 }
8620 case llvm::Triple::sparc:
8621 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008622 case llvm::Triple::sparcv9: {
8623 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8624 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008625 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008626 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008627 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008628 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008629
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008630 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008631
8632 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008633 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008634
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008635 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008636 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008637
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008638 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008639 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008640}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008641
Douglas Katzman95354292015-06-23 20:42:09 +00008642void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8643 const InputInfo &Output,
8644 const InputInfoList &Inputs,
8645 const ArgList &Args,
8646 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008647 const toolchains::FreeBSD &ToolChain =
8648 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008649 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008650 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008651 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008652 !Args.hasArg(options::OPT_shared) &&
8653 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008654 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008655
8656 // Silence warning for "clang -g foo.o -o foo"
8657 Args.ClaimAllArgs(options::OPT_g_Group);
8658 // and "clang -emit-llvm foo.o -o foo"
8659 Args.ClaimAllArgs(options::OPT_emit_llvm);
8660 // and for "clang -w foo.o -o foo". Other warning options are already
8661 // handled somewhere else.
8662 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008663
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008664 if (!D.SysRoot.empty())
8665 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8666
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008667 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008668 CmdArgs.push_back("-pie");
8669
Ed Maste1bc232d2016-04-12 21:11:46 +00008670 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008671 if (Args.hasArg(options::OPT_static)) {
8672 CmdArgs.push_back("-Bstatic");
8673 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008674 if (Args.hasArg(options::OPT_rdynamic))
8675 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008676 if (Args.hasArg(options::OPT_shared)) {
8677 CmdArgs.push_back("-Bshareable");
8678 } else {
8679 CmdArgs.push_back("-dynamic-linker");
8680 CmdArgs.push_back("/libexec/ld-elf.so.1");
8681 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008682 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008683 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8684 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8685 CmdArgs.push_back("--hash-style=both");
8686 }
8687 }
8688 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008689 }
8690
8691 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8692 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008693 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008694 CmdArgs.push_back("-m");
8695 CmdArgs.push_back("elf_i386_fbsd");
8696 }
8697
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008698 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008699 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008700 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008701 }
8702
Dimitry Andric904895f2015-12-27 06:47:09 +00008703 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8704 if (ToolChain.getArch() == llvm::Triple::mips ||
8705 ToolChain.getArch() == llvm::Triple::mipsel ||
8706 ToolChain.getArch() == llvm::Triple::mips64 ||
8707 ToolChain.getArch() == llvm::Triple::mips64el) {
8708 StringRef v = A->getValue();
8709 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8710 A->claim();
8711 }
8712 }
8713
Daniel Dunbarb440f562010-08-02 02:38:21 +00008714 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008715 CmdArgs.push_back("-o");
8716 CmdArgs.push_back(Output.getFilename());
8717 } else {
8718 assert(Output.isNothing() && "Invalid output.");
8719 }
8720
Douglas Katzman78b37b02015-11-17 20:28:07 +00008721 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008722 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008723 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008724 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008725 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008726 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008727 crt1 = "Scrt1.o";
8728 else
8729 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008730 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008731 if (crt1)
8732 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8733
8734 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8735
Craig Topper92fc2df2014-05-17 16:56:41 +00008736 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008737 if (Args.hasArg(options::OPT_static))
8738 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008739 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008740 crtbegin = "crtbeginS.o";
8741 else
8742 crtbegin = "crtbegin.o";
8743
8744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008745 }
8746
8747 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008748 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008749 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8750 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008751 Args.AddAllArgs(CmdArgs, options::OPT_s);
8752 Args.AddAllArgs(CmdArgs, options::OPT_t);
8753 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8754 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008755
Teresa Johnson945bc502015-10-15 20:35:53 +00008756 if (D.isUsingLTO())
8757 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008758
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008759 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008760 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008761
Douglas Katzman78b37b02015-11-17 20:28:07 +00008762 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008763 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008764 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008765 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008766 if (Args.hasArg(options::OPT_pg))
8767 CmdArgs.push_back("-lm_p");
8768 else
8769 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008770 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008771 if (NeedsSanitizerDeps)
8772 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008773 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8774 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008775 if (Args.hasArg(options::OPT_pg))
8776 CmdArgs.push_back("-lgcc_p");
8777 else
8778 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008779 if (Args.hasArg(options::OPT_static)) {
8780 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008781 } else if (Args.hasArg(options::OPT_pg)) {
8782 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008783 } else {
8784 CmdArgs.push_back("--as-needed");
8785 CmdArgs.push_back("-lgcc_s");
8786 CmdArgs.push_back("--no-as-needed");
8787 }
8788
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008789 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008790 if (Args.hasArg(options::OPT_pg))
8791 CmdArgs.push_back("-lpthread_p");
8792 else
8793 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008794 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008795
Roman Divacky66f22762011-02-10 16:59:40 +00008796 if (Args.hasArg(options::OPT_pg)) {
8797 if (Args.hasArg(options::OPT_shared))
8798 CmdArgs.push_back("-lc");
8799 else
8800 CmdArgs.push_back("-lc_p");
8801 CmdArgs.push_back("-lgcc_p");
8802 } else {
8803 CmdArgs.push_back("-lc");
8804 CmdArgs.push_back("-lgcc");
8805 }
8806
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008807 if (Args.hasArg(options::OPT_static)) {
8808 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008809 } else if (Args.hasArg(options::OPT_pg)) {
8810 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008811 } else {
8812 CmdArgs.push_back("--as-needed");
8813 CmdArgs.push_back("-lgcc_s");
8814 CmdArgs.push_back("--no-as-needed");
8815 }
8816 }
8817
Douglas Katzman78b37b02015-11-17 20:28:07 +00008818 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008819 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008820 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008821 else
8822 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008823 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008824 }
8825
Vedant Kumar5fb00e42016-07-27 23:01:55 +00008826 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008827
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008828 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008829 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008830}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008831
Douglas Katzman95354292015-06-23 20:42:09 +00008832void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008833 const InputInfo &Output,
8834 const InputInfoList &Inputs,
8835 const ArgList &Args,
8836 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008837 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008838 ArgStringList CmdArgs;
8839
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008840 // GNU as needs different flags for creating the correct output format
8841 // on architectures with different ABIs or optional feature sets.
8842 switch (getToolChain().getArch()) {
8843 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008844 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008845 break;
8846 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008847 case llvm::Triple::armeb:
8848 case llvm::Triple::thumb:
8849 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008850 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008851 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8852 std::string Arch =
8853 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008854 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008855 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008856 }
8857
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008858 case llvm::Triple::mips:
8859 case llvm::Triple::mipsel:
8860 case llvm::Triple::mips64:
8861 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008862 StringRef CPUName;
8863 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008864 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008865
8866 CmdArgs.push_back("-march");
8867 CmdArgs.push_back(CPUName.data());
8868
8869 CmdArgs.push_back("-mabi");
8870 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8871
8872 if (getToolChain().getArch() == llvm::Triple::mips ||
8873 getToolChain().getArch() == llvm::Triple::mips64)
8874 CmdArgs.push_back("-EB");
8875 else
8876 CmdArgs.push_back("-EL");
8877
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008878 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008879 break;
8880 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008881
8882 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008883 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008884 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008885 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8886 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008887 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008888 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008889 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008890
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008891 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008892 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008893 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8894 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008895 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008896 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008897 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008898
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008899 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008900 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008901 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008903 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008904
8905 CmdArgs.push_back("-o");
8906 CmdArgs.push_back(Output.getFilename());
8907
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008908 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008909 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008910
David Chisnallddbd68f2011-09-27 22:03:18 +00008911 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008912 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008913}
8914
Douglas Katzman95354292015-06-23 20:42:09 +00008915void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8916 const InputInfo &Output,
8917 const InputInfoList &Inputs,
8918 const ArgList &Args,
8919 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008920 const Driver &D = getToolChain().getDriver();
8921 ArgStringList CmdArgs;
8922
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008923 if (!D.SysRoot.empty())
8924 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8925
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008926 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008927 if (Args.hasArg(options::OPT_static)) {
8928 CmdArgs.push_back("-Bstatic");
8929 } else {
8930 if (Args.hasArg(options::OPT_rdynamic))
8931 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008932 if (Args.hasArg(options::OPT_shared)) {
8933 CmdArgs.push_back("-Bshareable");
8934 } else {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00008935 Args.AddAllArgs(CmdArgs, options::OPT_pie);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008936 CmdArgs.push_back("-dynamic-linker");
8937 CmdArgs.push_back("/libexec/ld.elf_so");
8938 }
8939 }
8940
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008941 // Many NetBSD architectures support more than one ABI.
8942 // Determine the correct emulation for ld.
8943 switch (getToolChain().getArch()) {
8944 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008945 CmdArgs.push_back("-m");
8946 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008947 break;
8948 case llvm::Triple::arm:
8949 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008950 CmdArgs.push_back("-m");
8951 switch (getToolChain().getTriple().getEnvironment()) {
8952 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008953 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008954 CmdArgs.push_back("armelf_nbsd_eabi");
8955 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008956 case llvm::Triple::EABIHF:
8957 case llvm::Triple::GNUEABIHF:
8958 CmdArgs.push_back("armelf_nbsd_eabihf");
8959 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008960 default:
8961 CmdArgs.push_back("armelf_nbsd");
8962 break;
8963 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008964 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008965 case llvm::Triple::armeb:
8966 case llvm::Triple::thumbeb:
Vedant Kumar18286cf2016-07-27 23:02:20 +00008967 arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getEffectiveTriple());
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008968 CmdArgs.push_back("-m");
8969 switch (getToolChain().getTriple().getEnvironment()) {
8970 case llvm::Triple::EABI:
8971 case llvm::Triple::GNUEABI:
8972 CmdArgs.push_back("armelfb_nbsd_eabi");
8973 break;
8974 case llvm::Triple::EABIHF:
8975 case llvm::Triple::GNUEABIHF:
8976 CmdArgs.push_back("armelfb_nbsd_eabihf");
8977 break;
8978 default:
8979 CmdArgs.push_back("armelfb_nbsd");
8980 break;
8981 }
8982 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008983 case llvm::Triple::mips64:
8984 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008985 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008986 CmdArgs.push_back("-m");
8987 if (getToolChain().getArch() == llvm::Triple::mips64)
8988 CmdArgs.push_back("elf32btsmip");
8989 else
8990 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008991 } else if (mips::hasMipsAbiArg(Args, "64")) {
8992 CmdArgs.push_back("-m");
8993 if (getToolChain().getArch() == llvm::Triple::mips64)
8994 CmdArgs.push_back("elf64btsmip");
8995 else
8996 CmdArgs.push_back("elf64ltsmip");
8997 }
8998 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008999 case llvm::Triple::ppc:
9000 CmdArgs.push_back("-m");
9001 CmdArgs.push_back("elf32ppc_nbsd");
9002 break;
9003
9004 case llvm::Triple::ppc64:
9005 case llvm::Triple::ppc64le:
9006 CmdArgs.push_back("-m");
9007 CmdArgs.push_back("elf64ppc");
9008 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00009009
9010 case llvm::Triple::sparc:
9011 CmdArgs.push_back("-m");
9012 CmdArgs.push_back("elf32_sparc");
9013 break;
9014
9015 case llvm::Triple::sparcv9:
9016 CmdArgs.push_back("-m");
9017 CmdArgs.push_back("elf64_sparc");
9018 break;
9019
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00009020 default:
9021 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00009022 }
9023
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009024 if (Output.isFilename()) {
9025 CmdArgs.push_back("-o");
9026 CmdArgs.push_back(Output.getFilename());
9027 } else {
9028 assert(Output.isNothing() && "Invalid output.");
9029 }
9030
Douglas Katzman78b37b02015-11-17 20:28:07 +00009031 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009032 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009033 CmdArgs.push_back(
9034 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00009035 }
9036 CmdArgs.push_back(
9037 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9038 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009039 CmdArgs.push_back(
9040 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00009041 } else {
9042 CmdArgs.push_back(
9043 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009044 }
9045 }
9046
9047 Args.AddAllArgs(CmdArgs, options::OPT_L);
9048 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
9049 Args.AddAllArgs(CmdArgs, options::OPT_e);
9050 Args.AddAllArgs(CmdArgs, options::OPT_s);
9051 Args.AddAllArgs(CmdArgs, options::OPT_t);
9052 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
9053 Args.AddAllArgs(CmdArgs, options::OPT_r);
9054
9055 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9056
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00009057 unsigned Major, Minor, Micro;
9058 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
9059 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00009060 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009061 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00009062 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00009063 case llvm::Triple::arm:
9064 case llvm::Triple::armeb:
9065 case llvm::Triple::thumb:
9066 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00009067 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00009068 case llvm::Triple::ppc64:
9069 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00009070 case llvm::Triple::sparc:
9071 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00009072 case llvm::Triple::x86:
9073 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00009074 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00009075 break;
9076 default:
9077 break;
9078 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00009079 }
9080
Douglas Katzman78b37b02015-11-17 20:28:07 +00009081 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00009082 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00009083 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009084 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
9085 CmdArgs.push_back("-lm");
9086 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009087 if (Args.hasArg(options::OPT_pthread))
9088 CmdArgs.push_back("-lpthread");
9089 CmdArgs.push_back("-lc");
9090
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00009091 if (useLibgcc) {
9092 if (Args.hasArg(options::OPT_static)) {
9093 // libgcc_eh depends on libc, so resolve as much as possible,
9094 // pull in any new requirements from libc and then get the rest
9095 // of libgcc.
9096 CmdArgs.push_back("-lgcc_eh");
9097 CmdArgs.push_back("-lc");
9098 CmdArgs.push_back("-lgcc");
9099 } else {
9100 CmdArgs.push_back("-lgcc");
9101 CmdArgs.push_back("--as-needed");
9102 CmdArgs.push_back("-lgcc_s");
9103 CmdArgs.push_back("--no-as-needed");
9104 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009105 }
9106 }
9107
Douglas Katzman78b37b02015-11-17 20:28:07 +00009108 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00009109 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009110 CmdArgs.push_back(
9111 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Joerg Sonnenbergerb8650ad2016-06-04 20:03:26 +00009112 else
9113 CmdArgs.push_back(
9114 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009115 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009116 }
9117
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009118 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009119
Logan Chieneb9162f2014-06-26 14:23:45 +00009120 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009121 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00009122}
9123
Douglas Katzman95354292015-06-23 20:42:09 +00009124void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9125 const InputInfo &Output,
9126 const InputInfoList &Inputs,
9127 const ArgList &Args,
9128 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009129 claimNoWarnArgs(Args);
9130
Vedant Kumar18286cf2016-07-27 23:02:20 +00009131 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009132
Rafael Espindola92b00932010-08-10 00:25:48 +00009133 ArgStringList CmdArgs;
9134
James Y Knight5bdf7ab2015-08-19 15:12:02 +00009135 llvm::Reloc::Model RelocationModel;
9136 unsigned PICLevel;
9137 bool IsPIE;
9138 std::tie(RelocationModel, PICLevel, IsPIE) =
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009139 ParsePICArgs(getToolChain(), Triple, Args);
James Y Knight5bdf7ab2015-08-19 15:12:02 +00009140
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009141 switch (getToolChain().getArch()) {
9142 default:
9143 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00009144 // Add --32/--64 to make sure we get the format we want.
9145 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009146 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00009147 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009148 break;
9149 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00009150 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
9151 CmdArgs.push_back("--x32");
9152 else
9153 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009154 break;
9155 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00009156 CmdArgs.push_back("-a32");
9157 CmdArgs.push_back("-mppc");
9158 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009159 break;
9160 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00009161 CmdArgs.push_back("-a64");
9162 CmdArgs.push_back("-mppc64");
9163 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009164 break;
9165 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00009166 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00009167 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00009168 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00009169 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009170 break;
9171 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009172 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00009173 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009174 std::string CPU = getCPUName(Args, getToolChain().getTriple());
9175 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
9176 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009177 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009178 }
9179 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00009180 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009181 std::string CPU = getCPUName(Args, getToolChain().getTriple());
9182 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
9183 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009184 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009185 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009186 case llvm::Triple::arm:
9187 case llvm::Triple::armeb:
9188 case llvm::Triple::thumb:
9189 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00009190 const llvm::Triple &Triple2 = getToolChain().getTriple();
9191 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00009192 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00009193 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00009194 break;
9195 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00009196 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00009197 break;
9198 default:
9199 break;
9200 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00009201
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009202 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00009203 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
9204 case arm::FloatABI::Soft:
9205 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
9206 break;
9207 case arm::FloatABI::SoftFP:
9208 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
9209 break;
9210 case arm::FloatABI::Hard:
9211 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
9212 break;
9213 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00009214
9215 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00009216
9217 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00009218 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00009219 // march from being picked in the absence of a cpu flag.
9220 Arg *A;
9221 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Nico Weberebe8d622016-08-26 21:11:43 +00009222 StringRef(A->getValue()).equals_lower("krait"))
Stephen Hinese3f91e32016-03-04 20:57:22 +00009223 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00009224 else
9225 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00009226 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009227 break;
9228 }
9229 case llvm::Triple::mips:
9230 case llvm::Triple::mipsel:
9231 case llvm::Triple::mips64:
9232 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00009233 StringRef CPUName;
9234 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00009235 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00009236 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00009237
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00009238 CmdArgs.push_back("-march");
9239 CmdArgs.push_back(CPUName.data());
9240
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00009241 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00009242 CmdArgs.push_back(ABIName.data());
9243
Daniel Sanders54d8ee62014-07-23 12:06:13 +00009244 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
9245 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00009246 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00009247 CmdArgs.push_back("-mno-shared");
9248
Daniel Sanders379d44b2014-07-16 11:52:23 +00009249 // LLVM doesn't support -mplt yet and acts as if it is always given.
9250 // However, -mplt has no effect with the N64 ABI.
9251 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00009252
9253 if (getToolChain().getArch() == llvm::Triple::mips ||
9254 getToolChain().getArch() == llvm::Triple::mips64)
9255 CmdArgs.push_back("-EB");
9256 else
9257 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00009258
Simon Atanasyan22127ce2013-09-24 09:09:16 +00009259 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
9260 if (StringRef(A->getValue()) == "2008")
9261 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
9262 }
9263
Daniel Sanders379d44b2014-07-16 11:52:23 +00009264 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
9265 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
9266 options::OPT_mfp64)) {
9267 A->claim();
9268 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00009269 } else if (mips::shouldUseFPXX(
9270 Args, getToolChain().getTriple(), CPUName, ABIName,
9271 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00009272 CmdArgs.push_back("-mfpxx");
9273
9274 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
9275 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009276 if (Arg *A =
9277 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00009278 if (A->getOption().matches(options::OPT_mips16)) {
9279 A->claim();
9280 A->render(Args, CmdArgs);
9281 } else {
9282 A->claim();
9283 CmdArgs.push_back("-no-mips16");
9284 }
9285 }
9286
Simon Atanasyan036d16d2013-04-30 07:47:13 +00009287 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
9288 options::OPT_mno_micromips);
9289 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
9290 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
9291
Simon Atanasyanbd986632013-11-26 11:58:04 +00009292 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
9293 // Do not use AddLastArg because not all versions of MIPS assembler
9294 // support -mmsa / -mno-msa options.
9295 if (A->getOption().matches(options::OPT_mmsa))
9296 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
9297 }
9298
Daniel Sanders379d44b2014-07-16 11:52:23 +00009299 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
9300 options::OPT_msoft_float);
9301
Toma Tabacub36d6102015-06-11 12:13:18 +00009302 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
9303 options::OPT_msingle_float);
9304
Daniel Sanders379d44b2014-07-16 11:52:23 +00009305 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
9306 options::OPT_mno_odd_spreg);
9307
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00009308 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009309 break;
9310 }
9311 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009312 // Always pass an -march option, since our default of z10 is later
9313 // than the GNU assembler's default.
9314 StringRef CPUName = getSystemZTargetCPU(Args);
9315 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00009316 break;
9317 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00009318 }
9319
Renato Golina74bbc72015-07-22 15:32:36 +00009320 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009321 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00009322
9323 CmdArgs.push_back("-o");
9324 CmdArgs.push_back(Output.getFilename());
9325
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009326 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00009327 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00009328
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009329 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009330 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00009331
9332 // Handle the debug info splitting at object creation time if we're
9333 // creating an object.
9334 // TODO: Currently only works on linux with newer objcopy.
9335 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00009336 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00009337 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00009338 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009339}
9340
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009341static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009342 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009343 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009344 bool isCygMing = Triple.isOSCygMing();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009345 bool IsIAMCU = Triple.isOSIAMCU();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009346 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9347 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009348 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009349 CmdArgs.push_back("-lgcc");
9350
Logan Chien3d3373c2012-11-19 12:04:11 +00009351 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009352 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009353 CmdArgs.push_back("-lgcc");
9354 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009355 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009356 CmdArgs.push_back("--as-needed");
9357 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009358 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009359 CmdArgs.push_back("--no-as-needed");
9360 }
9361
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009362 if (StaticLibgcc && !isAndroid && !IsIAMCU)
Rafael Espindolacc354322011-10-17 21:39:04 +00009363 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009364 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009365 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009366
9367 // According to Android ABI, we have to link with libdl if we are
9368 // linking with non-static libgcc.
9369 //
9370 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9371 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9372 if (isAndroid && !StaticLibgcc)
9373 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009374}
9375
Renato Golinc4b49242014-02-13 10:01:16 +00009376static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009377 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009378 // Make use of compiler-rt if --rtlib option is used
9379 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9380
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009381 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009382 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009383 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009384 default:
9385 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009386 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009387 case llvm::Triple::Linux:
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009388 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009389 break;
9390 }
Renato Golinc4b49242014-02-13 10:01:16 +00009391 break;
9392 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009393 // Make sure libgcc is not used under MSVC environment by default
9394 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9395 // Issue error diagnostic if libgcc is explicitly specified
9396 // through command line as --rtlib option argument.
9397 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9398 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9399 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9400 }
9401 } else
9402 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009403 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009404 }
9405}
9406
Rafael Espindola1e085772014-08-15 17:14:35 +00009407static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9408 switch (T.getArch()) {
9409 case llvm::Triple::x86:
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009410 if (T.isOSIAMCU())
9411 return "elf_iamcu";
Rafael Espindola1e085772014-08-15 17:14:35 +00009412 return "elf_i386";
9413 case llvm::Triple::aarch64:
9414 return "aarch64linux";
9415 case llvm::Triple::aarch64_be:
9416 return "aarch64_be_linux";
9417 case llvm::Triple::arm:
9418 case llvm::Triple::thumb:
9419 return "armelf_linux_eabi";
9420 case llvm::Triple::armeb:
9421 case llvm::Triple::thumbeb:
Strahinja Petrovicb8598962016-06-10 16:09:20 +00009422 return "armelfb_linux_eabi";
Rafael Espindola1e085772014-08-15 17:14:35 +00009423 case llvm::Triple::ppc:
9424 return "elf32ppclinux";
9425 case llvm::Triple::ppc64:
9426 return "elf64ppc";
9427 case llvm::Triple::ppc64le:
9428 return "elf64lppc";
9429 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009430 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009431 return "elf32_sparc";
9432 case llvm::Triple::sparcv9:
9433 return "elf64_sparc";
9434 case llvm::Triple::mips:
9435 return "elf32btsmip";
9436 case llvm::Triple::mipsel:
9437 return "elf32ltsmip";
9438 case llvm::Triple::mips64:
9439 if (mips::hasMipsAbiArg(Args, "n32"))
9440 return "elf32btsmipn32";
9441 return "elf64btsmip";
9442 case llvm::Triple::mips64el:
9443 if (mips::hasMipsAbiArg(Args, "n32"))
9444 return "elf32ltsmipn32";
9445 return "elf64ltsmip";
9446 case llvm::Triple::systemz:
9447 return "elf64_s390";
9448 case llvm::Triple::x86_64:
9449 if (T.getEnvironment() == llvm::Triple::GNUX32)
9450 return "elf32_x86_64";
9451 return "elf_x86_64";
9452 default:
9453 llvm_unreachable("Unexpected arch");
9454 }
9455}
9456
Douglas Katzman95354292015-06-23 20:42:09 +00009457void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9458 const InputInfo &Output,
9459 const InputInfoList &Inputs,
9460 const ArgList &Args,
9461 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009462 const toolchains::Linux &ToolChain =
9463 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009464 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009465
Vedant Kumar18286cf2016-07-27 23:02:20 +00009466 const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009467
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009468 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009469 const bool isAndroid = ToolChain.getTriple().isAndroid();
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009470 const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009471 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009472 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9473 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009474 const bool HasCRTBeginEndFiles =
9475 ToolChain.getTriple().hasEnvironment() ||
9476 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009477
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009478 ArgStringList CmdArgs;
9479
Rafael Espindolad1002f62010-11-15 18:28:16 +00009480 // Silence warning for "clang -g foo.o -o foo"
9481 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009482 // and "clang -emit-llvm foo.o -o foo"
9483 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009484 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009485 // handled somewhere else.
9486 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009487
Peter Collingbourne39719a72015-11-20 20:49:39 +00009488 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9489 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009490 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009491 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009492 CmdArgs.push_back("-target");
9493 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9494 }
9495
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009496 if (!D.SysRoot.empty())
9497 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009498
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009499 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009500 CmdArgs.push_back("-pie");
9501
Rafael Espindola1c76c592010-11-07 22:57:16 +00009502 if (Args.hasArg(options::OPT_rdynamic))
9503 CmdArgs.push_back("-export-dynamic");
9504
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009505 if (Args.hasArg(options::OPT_s))
9506 CmdArgs.push_back("-s");
9507
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009508 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009509 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009510
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009511 for (const auto &Opt : ToolChain.ExtraOpts)
9512 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009513
9514 if (!Args.hasArg(options::OPT_static)) {
9515 CmdArgs.push_back("--eh-frame-hdr");
9516 }
9517
9518 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009519 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009520
9521 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009522 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9523 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009524 CmdArgs.push_back("-Bstatic");
9525 else
9526 CmdArgs.push_back("-static");
9527 } else if (Args.hasArg(options::OPT_shared)) {
9528 CmdArgs.push_back("-shared");
9529 }
9530
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009531 if (!Args.hasArg(options::OPT_static)) {
9532 if (Args.hasArg(options::OPT_rdynamic))
9533 CmdArgs.push_back("-export-dynamic");
9534
9535 if (!Args.hasArg(options::OPT_shared)) {
9536 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009537 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009538 CmdArgs.push_back("-dynamic-linker");
9539 CmdArgs.push_back(Args.MakeArgString(Loader));
9540 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009541 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009542
9543 CmdArgs.push_back("-o");
9544 CmdArgs.push_back(Output.getFilename());
9545
Douglas Katzman78b37b02015-11-17 20:28:07 +00009546 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009547 if (!isAndroid && !IsIAMCU) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009548 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009549 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009550 if (Args.hasArg(options::OPT_pg))
9551 crt1 = "gcrt1.o";
9552 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009553 crt1 = "Scrt1.o";
9554 else
9555 crt1 = "crt1.o";
9556 }
9557 if (crt1)
9558 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009559
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009560 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9561 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009562
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009563 if (IsIAMCU)
9564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
9565 else {
9566 const char *crtbegin;
9567 if (Args.hasArg(options::OPT_static))
9568 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
9569 else if (Args.hasArg(options::OPT_shared))
9570 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
9571 else if (IsPIE)
9572 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
9573 else
9574 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009575
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009576 if (HasCRTBeginEndFiles)
9577 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9578 }
Benjamin Kramer058666a2012-10-04 19:42:20 +00009579
9580 // Add crtfastmath.o if available and fast math is enabled.
9581 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009582 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009583
9584 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009585 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009586
Douglas Katzman6059ef92015-11-17 17:41:23 +00009587 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009588
Teresa Johnson945bc502015-10-15 20:35:53 +00009589 if (D.isUsingLTO())
9590 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009591
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009592 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9593 CmdArgs.push_back("--no-demangle");
9594
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009595 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
9596 bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009597 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009598 // The profile runtime also needs access to system libraries.
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009599 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009600
Douglas Katzman78b37b02015-11-17 20:28:07 +00009601 if (D.CCCIsCXX() &&
9602 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009603 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009604 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009605 if (OnlyLibstdcxxStatic)
9606 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009607 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009608 if (OnlyLibstdcxxStatic)
9609 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009610 CmdArgs.push_back("-lm");
9611 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009612 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9613 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009614
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009615 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009616 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9617 if (Args.hasArg(options::OPT_static))
9618 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009619
Alexey Samsonov52550342014-09-15 19:58:40 +00009620 if (NeedsSanitizerDeps)
9621 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9622
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00009623 if (NeedsXRayDeps)
Dean Michael Berris39baab92016-07-14 04:58:44 +00009624 linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
Aaron Ballman7d2aecb2016-07-13 22:32:15 +00009625
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009626 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9627 Args.hasArg(options::OPT_pthreads);
9628
9629 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9630 options::OPT_fno_openmp, false)) {
9631 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9632 // FIXME: Does this really make sense for all GNU toolchains?
9633 WantPthread = true;
9634
9635 // Also link the particular OpenMP runtimes.
9636 switch (getOpenMPRuntime(ToolChain, Args)) {
9637 case OMPRT_OMP:
9638 CmdArgs.push_back("-lomp");
9639 break;
9640 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009641 CmdArgs.push_back("-lgomp");
9642
9643 // FIXME: Exclude this for platforms with libgomp that don't require
9644 // librt. Most modern Linux platforms require it, but some may not.
9645 CmdArgs.push_back("-lrt");
9646 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009647 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009648 CmdArgs.push_back("-liomp5");
9649 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009650 case OMPRT_Unknown:
9651 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009652 break;
9653 }
Chandler Carruth01538002013-01-17 13:19:29 +00009654 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009655
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009656 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009657
Richard Smith31d1de22015-05-20 22:48:44 +00009658 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009659 CmdArgs.push_back("-lpthread");
9660
Rafael Espindolab17bc532016-01-25 18:29:16 +00009661 if (Args.hasArg(options::OPT_fsplit_stack))
9662 CmdArgs.push_back("--wrap=pthread_create");
9663
Chandler Carruth94a32012012-05-14 18:31:18 +00009664 CmdArgs.push_back("-lc");
9665
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009666 // Add IAMCU specific libs, if needed.
9667 if (IsIAMCU)
9668 CmdArgs.push_back("-lgloss");
9669
Chandler Carruth94a32012012-05-14 18:31:18 +00009670 if (Args.hasArg(options::OPT_static))
9671 CmdArgs.push_back("--end-group");
9672 else
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009673 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009674
9675 // Add IAMCU specific libs (outside the group), if needed.
9676 if (IsIAMCU) {
9677 CmdArgs.push_back("--as-needed");
9678 CmdArgs.push_back("-lsoftfp");
9679 CmdArgs.push_back("--no-as-needed");
9680 }
Chandler Carruth94a32012012-05-14 18:31:18 +00009681 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009682
Andrey Turetskiyc4105482016-06-16 10:49:27 +00009683 if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) {
Rafael Espindola81937ec2010-12-01 01:52:43 +00009684 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009685 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009686 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009687 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009688 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009689 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009690 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009691
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009692 if (HasCRTBeginEndFiles)
9693 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009694 if (!isAndroid)
9695 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009696 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009697 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009698
Peter Collingbourne39719a72015-11-20 20:49:39 +00009699 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009700}
9701
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009702// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9703// for the various SFI requirements like register masking. The assembly tool
9704// inserts the file containing the macros as an input into all the assembly
9705// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009706void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9707 const InputInfo &Output,
9708 const InputInfoList &Inputs,
9709 const ArgList &Args,
9710 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009711 const toolchains::NaClToolChain &ToolChain =
9712 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009713 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009714 "nacl-arm-macros.s");
9715 InputInfoList NewInputs;
9716 NewInputs.push_back(NaClMacros);
9717 NewInputs.append(Inputs.begin(), Inputs.end());
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009718 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9719 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009720}
9721
Douglas Katzman750cfc52015-06-29 18:42:16 +00009722// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009723// we use static by default, do not yet support sanitizers or LTO, and a few
9724// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009725// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009726void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9727 const InputInfo &Output,
9728 const InputInfoList &Inputs,
9729 const ArgList &Args,
9730 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009731
Douglas Katzman54366072015-07-27 16:53:08 +00009732 const toolchains::NaClToolChain &ToolChain =
9733 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009734 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009735 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009736 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009737 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009738
9739 ArgStringList CmdArgs;
9740
9741 // Silence warning for "clang -g foo.o -o foo"
9742 Args.ClaimAllArgs(options::OPT_g_Group);
9743 // and "clang -emit-llvm foo.o -o foo"
9744 Args.ClaimAllArgs(options::OPT_emit_llvm);
9745 // and for "clang -w foo.o -o foo". Other warning options are already
9746 // handled somewhere else.
9747 Args.ClaimAllArgs(options::OPT_w);
9748
9749 if (!D.SysRoot.empty())
9750 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9751
9752 if (Args.hasArg(options::OPT_rdynamic))
9753 CmdArgs.push_back("-export-dynamic");
9754
9755 if (Args.hasArg(options::OPT_s))
9756 CmdArgs.push_back("-s");
9757
Douglas Katzman54366072015-07-27 16:53:08 +00009758 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9759 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009760 CmdArgs.push_back("--build-id");
9761
9762 if (!IsStatic)
9763 CmdArgs.push_back("--eh-frame-hdr");
9764
9765 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009766 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009767 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009768 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009769 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009770 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009771 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009772 else if (Arch == llvm::Triple::mipsel)
9773 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009774 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009775 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9776 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009777
9778 if (IsStatic)
9779 CmdArgs.push_back("-static");
9780 else if (Args.hasArg(options::OPT_shared))
9781 CmdArgs.push_back("-shared");
9782
9783 CmdArgs.push_back("-o");
9784 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009785 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009786 if (!Args.hasArg(options::OPT_shared))
9787 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9789
9790 const char *crtbegin;
9791 if (IsStatic)
9792 crtbegin = "crtbeginT.o";
9793 else if (Args.hasArg(options::OPT_shared))
9794 crtbegin = "crtbeginS.o";
9795 else
9796 crtbegin = "crtbegin.o";
9797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9798 }
9799
9800 Args.AddAllArgs(CmdArgs, options::OPT_L);
9801 Args.AddAllArgs(CmdArgs, options::OPT_u);
9802
Douglas Katzman6059ef92015-11-17 17:41:23 +00009803 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009804
9805 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9806 CmdArgs.push_back("--no-demangle");
9807
9808 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9809
Douglas Katzman78b37b02015-11-17 20:28:07 +00009810 if (D.CCCIsCXX() &&
9811 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009812 bool OnlyLibstdcxxStatic =
9813 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009814 if (OnlyLibstdcxxStatic)
9815 CmdArgs.push_back("-Bstatic");
9816 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9817 if (OnlyLibstdcxxStatic)
9818 CmdArgs.push_back("-Bdynamic");
9819 CmdArgs.push_back("-lm");
9820 }
9821
9822 if (!Args.hasArg(options::OPT_nostdlib)) {
9823 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9824 // Always use groups, since it has no effect on dynamic libraries.
9825 CmdArgs.push_back("--start-group");
9826 CmdArgs.push_back("-lc");
9827 // NaCl's libc++ currently requires libpthread, so just always include it
9828 // in the group for C++.
9829 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009830 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009831 // Gold, used by Mips, handles nested groups differently than ld, and
9832 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9833 // which is not a desired behaviour here.
9834 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9835 if (getToolChain().getArch() == llvm::Triple::mipsel)
9836 CmdArgs.push_back("-lnacl");
9837
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009838 CmdArgs.push_back("-lpthread");
9839 }
9840
9841 CmdArgs.push_back("-lgcc");
9842 CmdArgs.push_back("--as-needed");
9843 if (IsStatic)
9844 CmdArgs.push_back("-lgcc_eh");
9845 else
9846 CmdArgs.push_back("-lgcc_s");
9847 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009848
9849 // Mips needs to create and use pnacl_legacy library that contains
9850 // definitions from bitcode/pnaclmm.c and definitions for
9851 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9852 if (getToolChain().getArch() == llvm::Triple::mipsel)
9853 CmdArgs.push_back("-lpnacl_legacy");
9854
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009855 CmdArgs.push_back("--end-group");
9856 }
9857
9858 if (!Args.hasArg(options::OPT_nostartfiles)) {
9859 const char *crtend;
9860 if (Args.hasArg(options::OPT_shared))
9861 crtend = "crtendS.o";
9862 else
9863 crtend = "crtend.o";
9864
9865 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9866 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9867 }
9868 }
9869
Peter Collingbourne39719a72015-11-20 20:49:39 +00009870 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009872}
9873
Douglas Katzman95354292015-06-23 20:42:09 +00009874void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9875 const InputInfo &Output,
9876 const InputInfoList &Inputs,
9877 const ArgList &Args,
9878 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009879 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009880 ArgStringList CmdArgs;
9881
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009882 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009883
9884 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009885 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009886
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009887 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009888 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009889
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009890 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009891 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009892}
9893
Douglas Katzman95354292015-06-23 20:42:09 +00009894void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9895 const InputInfo &Output,
9896 const InputInfoList &Inputs,
9897 const ArgList &Args,
9898 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009899 const Driver &D = getToolChain().getDriver();
9900 ArgStringList CmdArgs;
9901
Daniel Dunbarb440f562010-08-02 02:38:21 +00009902 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009903 CmdArgs.push_back("-o");
9904 CmdArgs.push_back(Output.getFilename());
9905 } else {
9906 assert(Output.isNothing() && "Invalid output.");
9907 }
9908
Douglas Katzman78b37b02015-11-17 20:28:07 +00009909 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009910 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9911 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9912 CmdArgs.push_back(
9913 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9914 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009915 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009916
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009917 Args.AddAllArgs(CmdArgs,
9918 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009919
Daniel Dunbar54423b22010-09-17 00:24:54 +00009920 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009921
Vedant Kumar5fb00e42016-07-27 23:01:55 +00009922 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009923
Douglas Katzman78b37b02015-11-17 20:28:07 +00009924 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009925 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009926 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009927 CmdArgs.push_back("-lm");
9928 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009929 }
9930
Douglas Katzman78b37b02015-11-17 20:28:07 +00009931 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009932 if (Args.hasArg(options::OPT_pthread))
9933 CmdArgs.push_back("-lpthread");
9934 CmdArgs.push_back("-lc");
9935 CmdArgs.push_back("-lCompilerRT-Generic");
9936 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9937 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009938 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009939 }
9940
Logan Chieneb9162f2014-06-26 14:23:45 +00009941 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009943}
9944
Daniel Dunbarcc912342009-05-02 18:28:39 +00009945/// DragonFly Tools
9946
9947// For now, DragonFly Assemble does just about the same as for
9948// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009949void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9950 const InputInfo &Output,
9951 const InputInfoList &Inputs,
9952 const ArgList &Args,
9953 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009954 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009955 ArgStringList CmdArgs;
9956
9957 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9958 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009959 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009960 CmdArgs.push_back("--32");
9961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009962 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009963
9964 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009965 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009966
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009967 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009968 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009969
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009970 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009971 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009972}
9973
Douglas Katzman95354292015-06-23 20:42:09 +00009974void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9975 const InputInfo &Output,
9976 const InputInfoList &Inputs,
9977 const ArgList &Args,
9978 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009979 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009980 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009981
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009982 if (!D.SysRoot.empty())
9983 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9984
John McCall65b8da02013-04-11 22:55:55 +00009985 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009986 if (Args.hasArg(options::OPT_static)) {
9987 CmdArgs.push_back("-Bstatic");
9988 } else {
John McCall65b8da02013-04-11 22:55:55 +00009989 if (Args.hasArg(options::OPT_rdynamic))
9990 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009991 if (Args.hasArg(options::OPT_shared))
9992 CmdArgs.push_back("-Bshareable");
9993 else {
9994 CmdArgs.push_back("-dynamic-linker");
9995 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9996 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009997 CmdArgs.push_back("--hash-style=gnu");
9998 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009999 }
10000
10001 // When building 32-bit code on DragonFly/pc64, we have to explicitly
10002 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +000010003 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +000010004 CmdArgs.push_back("-m");
10005 CmdArgs.push_back("elf_i386");
10006 }
10007
Daniel Dunbarb440f562010-08-02 02:38:21 +000010008 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +000010009 CmdArgs.push_back("-o");
10010 CmdArgs.push_back(Output.getFilename());
10011 } else {
10012 assert(Output.isNothing() && "Invalid output.");
10013 }
10014
Douglas Katzman78b37b02015-11-17 20:28:07 +000010015 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +000010016 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +000010017 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010018 CmdArgs.push_back(
10019 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +000010020 else {
10021 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010022 CmdArgs.push_back(
10023 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +000010024 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010025 CmdArgs.push_back(
10026 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +000010027 }
Daniel Dunbarcc912342009-05-02 18:28:39 +000010028 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010029 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +000010030 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010031 CmdArgs.push_back(
10032 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +000010033 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010034 CmdArgs.push_back(
10035 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +000010036 }
10037
Douglas Katzman57a9c7e2015-07-29 18:39:14 +000010038 Args.AddAllArgs(CmdArgs,
10039 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +000010040
Daniel Dunbar54423b22010-09-17 00:24:54 +000010041 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +000010042
Douglas Katzman78b37b02015-11-17 20:28:07 +000010043 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +000010044 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +000010045
10046 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +000010047 CmdArgs.push_back("-rpath");
10048 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +000010049 }
10050
Hans Wennborg70850d82013-07-18 20:29:38 +000010051 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +000010052 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +000010053 CmdArgs.push_back("-lm");
10054 }
10055
Daniel Dunbarcc912342009-05-02 18:28:39 +000010056 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +000010057 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +000010058
10059 if (!Args.hasArg(options::OPT_nolibc)) {
10060 CmdArgs.push_back("-lc");
10061 }
10062
Dimitry Andricf59a2b32015-12-27 10:01:44 +000010063 if (Args.hasArg(options::OPT_static) ||
10064 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +000010065 CmdArgs.push_back("-lgcc");
10066 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +000010067 } else {
10068 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +000010069 CmdArgs.push_back("-lgcc_pic");
10070 if (!Args.hasArg(options::OPT_shared))
10071 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +000010072 } else {
John McCall65b8da02013-04-11 22:55:55 +000010073 CmdArgs.push_back("-lgcc");
10074 CmdArgs.push_back("--as-needed");
10075 CmdArgs.push_back("-lgcc_pic");
10076 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +000010077 }
Daniel Dunbarcc912342009-05-02 18:28:39 +000010078 }
10079 }
10080
Douglas Katzman78b37b02015-11-17 20:28:07 +000010081 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +000010082 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010083 CmdArgs.push_back(
10084 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +000010085 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010086 CmdArgs.push_back(
10087 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
10088 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +000010089 }
10090
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010091 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +000010092
Logan Chieneb9162f2014-06-26 14:23:45 +000010093 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +000010094 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +000010095}
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010096
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010097// Try to find Exe from a Visual Studio distribution. This first tries to find
10098// an installed copy of Visual Studio and, failing that, looks in the PATH,
10099// making sure that whatever executable that's found is not a same-named exe
10100// from clang itself to prevent clang from falling back to itself.
10101static std::string FindVisualStudioExecutable(const ToolChain &TC,
10102 const char *Exe,
10103 const char *ClangProgramPath) {
10104 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
10105 std::string visualStudioBinDir;
10106 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
10107 visualStudioBinDir)) {
10108 SmallString<128> FilePath(visualStudioBinDir);
10109 llvm::sys::path::append(FilePath, Exe);
10110 if (llvm::sys::fs::can_execute(FilePath.c_str()))
10111 return FilePath.str();
10112 }
10113
10114 return Exe;
10115}
10116
Douglas Katzman95354292015-06-23 20:42:09 +000010117void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10118 const InputInfo &Output,
10119 const InputInfoList &Inputs,
10120 const ArgList &Args,
10121 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010122 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010123 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010124
Saleem Abdulrasool9a215462014-12-19 23:56:31 +000010125 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
10126 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010127 CmdArgs.push_back(
10128 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010129
Douglas Katzman78b37b02015-11-17 20:28:07 +000010130 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
10131 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010132 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010133
Zachary Turner10d75b22014-10-22 20:40:43 +000010134 if (!llvm::sys::Process::GetEnv("LIB")) {
10135 // If the VC environment hasn't been configured (perhaps because the user
10136 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +000010137 // the environment variable is set however, assume the user knows what
10138 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +000010139 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010140 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +000010141 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
10142 SmallString<128> LibDir(VisualStudioDir);
10143 llvm::sys::path::append(LibDir, "VC", "lib");
10144 switch (MSVC.getArch()) {
10145 case llvm::Triple::x86:
10146 // x86 just puts the libraries directly in lib
10147 break;
10148 case llvm::Triple::x86_64:
10149 llvm::sys::path::append(LibDir, "amd64");
10150 break;
10151 case llvm::Triple::arm:
10152 llvm::sys::path::append(LibDir, "arm");
10153 break;
10154 default:
10155 break;
10156 }
10157 CmdArgs.push_back(
10158 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +000010159
10160 if (MSVC.useUniversalCRT(VisualStudioDir)) {
10161 std::string UniversalCRTLibPath;
10162 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
10163 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10164 UniversalCRTLibPath.c_str()));
10165 }
Zachary Turner10d75b22014-10-22 20:40:43 +000010166 }
10167
10168 std::string WindowsSdkLibPath;
10169 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
10170 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10171 WindowsSdkLibPath.c_str()));
10172 }
10173
Saleem Abdulrasool1f5ceb02016-07-01 15:36:31 +000010174 if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L))
10175 for (const auto &LibPath : Args.getAllArgValues(options::OPT_L))
10176 CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath));
10177
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010178 CmdArgs.push_back("-nologo");
10179
David Majnemer58fab352016-07-09 21:49:16 +000010180 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7,
10181 options::OPT__SLASH_Zd))
Hans Wennborgbbb5f072014-04-25 16:24:19 +000010182 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +000010183
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010184 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +000010185 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +000010186 if (DLL) {
10187 CmdArgs.push_back(Args.MakeArgString("-dll"));
10188
10189 SmallString<128> ImplibName(Output.getFilename());
10190 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010191 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +000010192 }
10193
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010194 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +000010195 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +000010196 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +000010197 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +000010198 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010199 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +000010200 // Make sure the dynamic runtime thunk is not optimized out at link time
10201 // to ensure proper SEH handling.
10202 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +000010203 } else if (DLL) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010204 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +000010205 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +000010206 for (const auto &Lib : {"asan", "asan_cxx"})
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010207 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +000010208 }
Hans Wennborg65f17522013-08-27 18:10:21 +000010209 }
10210
Hans Wennborg2e274592013-08-13 23:38:57 +000010211 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +000010212
Alexey Bataevc7e84352015-08-19 04:49:01 +000010213 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
10214 options::OPT_fno_openmp, false)) {
10215 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
10216 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
10217 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
10218 TC.getDriver().Dir + "/../lib"));
10219 switch (getOpenMPRuntime(getToolChain(), Args)) {
10220 case OMPRT_OMP:
10221 CmdArgs.push_back("-defaultlib:libomp.lib");
10222 break;
10223 case OMPRT_IOMP5:
10224 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
10225 break;
10226 case OMPRT_GOMP:
10227 break;
10228 case OMPRT_Unknown:
10229 // Already diagnosed.
10230 break;
10231 }
10232 }
10233
Andrey Turetskiya4868572016-03-14 11:19:43 +000010234 // Add compiler-rt lib in case if it was explicitly
10235 // specified as an argument for --rtlib option.
10236 if (!Args.hasArg(options::OPT_nostdlib)) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010237 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
Andrey Turetskiya4868572016-03-14 11:19:43 +000010238 }
10239
Reid Kleckner337188f2014-09-16 19:22:00 +000010240 // Add filenames, libraries, and other linker inputs.
10241 for (const auto &Input : Inputs) {
10242 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010243 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +000010244 continue;
10245 }
10246
10247 const Arg &A = Input.getInputArg();
10248
10249 // Render -l options differently for the MSVC linker.
10250 if (A.getOption().matches(options::OPT_l)) {
10251 StringRef Lib = A.getValue();
10252 const char *LinkLibArg;
10253 if (Lib.endswith(".lib"))
10254 LinkLibArg = Args.MakeArgString(Lib);
10255 else
10256 LinkLibArg = Args.MakeArgString(Lib + ".lib");
10257 CmdArgs.push_back(LinkLibArg);
10258 continue;
10259 }
10260
10261 // Otherwise, this is some other kind of linker input option like -Wl, -z,
10262 // or -L. Render it, even if MSVC doesn't understand it.
10263 A.renderAsInput(Args, CmdArgs);
10264 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010265
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010266 TC.addProfileRTLibs(Args, CmdArgs);
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +000010267
Zachary Turner719f58c2014-12-01 23:06:47 +000010268 // We need to special case some linker paths. In the case of lld, we need to
10269 // translate 'lld' into 'lld-link', and in the case of the regular msvc
10270 // linker, we need to use a special search algorithm.
10271 llvm::SmallString<128> linkPath;
10272 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
10273 if (Linker.equals_lower("lld"))
10274 Linker = "lld-link";
10275
10276 if (Linker.equals_lower("link")) {
10277 // If we're using the MSVC linker, it's not sufficient to just use link
10278 // from the program PATH, because other environments like GnuWin32 install
10279 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010280 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +000010281 C.getDriver().getClangProgramPath());
10282 } else {
10283 linkPath = Linker;
10284 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +000010285 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +000010286 }
10287
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010288 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +000010289 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +000010290}
Hans Wennborg87cfa712013-09-19 20:32:16 +000010291
Douglas Katzman95354292015-06-23 20:42:09 +000010292void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10293 const InputInfo &Output,
10294 const InputInfoList &Inputs,
10295 const ArgList &Args,
10296 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010297 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
10298}
10299
Douglas Katzman95354292015-06-23 20:42:09 +000010300std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +000010301 Compilation &C, const JobAction &JA, const InputInfo &Output,
10302 const InputInfoList &Inputs, const ArgList &Args,
10303 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +000010304 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +000010305 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010306 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010307 CmdArgs.push_back("/W0"); // No warnings.
10308
10309 // The goal is to be able to invoke this tool correctly based on
10310 // any flag accepted by clang-cl.
10311
10312 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +000010313 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010314
10315 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +000010316 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
10317 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
10318 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010319 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
10320 if (A->getOption().getID() == options::OPT_O0) {
10321 CmdArgs.push_back("/Od");
10322 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +000010323 CmdArgs.push_back("/Og");
10324
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010325 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +000010326 if (OptLevel == "s" || OptLevel == "z")
10327 CmdArgs.push_back("/Os");
10328 else
10329 CmdArgs.push_back("/Ot");
10330
10331 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +000010332 }
10333 }
David Majnemer015ce0f2015-07-27 07:32:11 +000010334 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
10335 options::OPT_fno_omit_frame_pointer))
10336 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
10337 ? "/Oy"
10338 : "/Oy-");
10339 if (!Args.hasArg(options::OPT_fwritable_strings))
10340 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010341
Nico Weber3f8dafb2015-03-12 19:37:10 +000010342 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +000010343 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
10344
David Majnemerf6072342014-07-01 22:24:56 +000010345 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
10346 /*default=*/false))
10347 CmdArgs.push_back("/GR-");
Etienne Bergerone28e7f22016-06-15 20:34:33 +000010348
10349 if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS,
10350 /*default=*/false))
10351 CmdArgs.push_back("/GS-");
10352
Hans Wennborg5149a3b2014-03-25 14:48:54 +000010353 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
10354 options::OPT_fno_function_sections))
10355 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10356 ? "/Gy"
10357 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +000010358 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10359 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +000010360 CmdArgs.push_back(
10361 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010362 if (Args.hasArg(options::OPT_fsyntax_only))
10363 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +000010364 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10365 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +000010366 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010367
Nico Weber3f8dafb2015-03-12 19:37:10 +000010368 std::vector<std::string> Includes =
10369 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010370 for (const auto &Include : Includes)
10371 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010372
Hans Wennborg87cfa712013-09-19 20:32:16 +000010373 // Flags that can simply be passed through.
10374 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10375 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010376 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10377 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010378 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010379 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010380
10381 // The order of these flags is relevant, so pick the last one.
10382 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10383 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10384 A->render(Args, CmdArgs);
10385
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010386 // Pass through all unknown arguments so that the fallback command can see
10387 // them too.
10388 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10389
Hans Wennborg87cfa712013-09-19 20:32:16 +000010390 // Input filename.
10391 assert(Inputs.size() == 1);
10392 const InputInfo &II = Inputs[0];
10393 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10394 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10395 if (II.isFilename())
10396 CmdArgs.push_back(II.getFilename());
10397 else
10398 II.getInputArg().renderAsInput(Args, CmdArgs);
10399
10400 // Output filename.
10401 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010402 const char *Fo =
10403 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010404 CmdArgs.push_back(Fo);
10405
Hans Wennborg188382e2013-09-20 18:16:35 +000010406 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010407 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10408 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010409 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010410 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010411}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010412
Yaron Keren1c0070c2015-07-02 04:45:27 +000010413/// MinGW Tools
10414void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10415 const InputInfo &Output,
10416 const InputInfoList &Inputs,
10417 const ArgList &Args,
10418 const char *LinkingOutput) const {
10419 claimNoWarnArgs(Args);
10420 ArgStringList CmdArgs;
10421
10422 if (getToolChain().getArch() == llvm::Triple::x86) {
10423 CmdArgs.push_back("--32");
10424 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10425 CmdArgs.push_back("--64");
10426 }
10427
10428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10429
10430 CmdArgs.push_back("-o");
10431 CmdArgs.push_back(Output.getFilename());
10432
10433 for (const auto &II : Inputs)
10434 CmdArgs.push_back(II.getFilename());
10435
10436 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010438
10439 if (Args.hasArg(options::OPT_gsplit_dwarf))
10440 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10441 SplitDebugName(Args, Inputs[0]));
10442}
10443
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010444void MinGW::Linker::AddLibGCC(const ArgList &Args,
Yaron Keren1c0070c2015-07-02 04:45:27 +000010445 ArgStringList &CmdArgs) const {
10446 if (Args.hasArg(options::OPT_mthreads))
10447 CmdArgs.push_back("-lmingwthrd");
10448 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010449
Yaron Kerenaa281332015-08-09 00:24:07 +000010450 // Make use of compiler-rt if --rtlib option is used
10451 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10452 if (RLT == ToolChain::RLT_Libgcc) {
10453 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10454 Args.hasArg(options::OPT_static);
10455 bool Shared = Args.hasArg(options::OPT_shared);
10456 bool CXX = getToolChain().getDriver().CCCIsCXX();
10457
10458 if (Static || (!CXX && !Shared)) {
10459 CmdArgs.push_back("-lgcc");
10460 CmdArgs.push_back("-lgcc_eh");
10461 } else {
10462 CmdArgs.push_back("-lgcc_s");
10463 CmdArgs.push_back("-lgcc");
10464 }
10465 } else {
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010466 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
Yaron Kerenaa281332015-08-09 00:24:07 +000010467 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010468
Yaron Keren1c0070c2015-07-02 04:45:27 +000010469 CmdArgs.push_back("-lmoldname");
10470 CmdArgs.push_back("-lmingwex");
10471 CmdArgs.push_back("-lmsvcrt");
10472}
10473
10474void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10475 const InputInfo &Output,
10476 const InputInfoList &Inputs,
10477 const ArgList &Args,
10478 const char *LinkingOutput) const {
10479 const ToolChain &TC = getToolChain();
10480 const Driver &D = TC.getDriver();
10481 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10482
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
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010493 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10494 if (LinkerName.equals_lower("lld")) {
10495 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010496 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010497 } else if (!LinkerName.equals_lower("ld")) {
10498 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010499 }
10500
Yaron Keren1c0070c2015-07-02 04:45:27 +000010501 if (!D.SysRoot.empty())
10502 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10503
10504 if (Args.hasArg(options::OPT_s))
10505 CmdArgs.push_back("-s");
10506
10507 CmdArgs.push_back("-m");
10508 if (TC.getArch() == llvm::Triple::x86)
10509 CmdArgs.push_back("i386pe");
10510 if (TC.getArch() == llvm::Triple::x86_64)
10511 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010512 if (TC.getArch() == llvm::Triple::arm)
10513 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010514
10515 if (Args.hasArg(options::OPT_mwindows)) {
10516 CmdArgs.push_back("--subsystem");
10517 CmdArgs.push_back("windows");
10518 } else if (Args.hasArg(options::OPT_mconsole)) {
10519 CmdArgs.push_back("--subsystem");
10520 CmdArgs.push_back("console");
10521 }
10522
10523 if (Args.hasArg(options::OPT_static))
10524 CmdArgs.push_back("-Bstatic");
10525 else {
10526 if (Args.hasArg(options::OPT_mdll))
10527 CmdArgs.push_back("--dll");
10528 else if (Args.hasArg(options::OPT_shared))
10529 CmdArgs.push_back("--shared");
10530 CmdArgs.push_back("-Bdynamic");
10531 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10532 CmdArgs.push_back("-e");
10533 if (TC.getArch() == llvm::Triple::x86)
10534 CmdArgs.push_back("_DllMainCRTStartup@12");
10535 else
10536 CmdArgs.push_back("DllMainCRTStartup");
10537 CmdArgs.push_back("--enable-auto-image-base");
10538 }
10539 }
10540
10541 CmdArgs.push_back("-o");
10542 CmdArgs.push_back(Output.getFilename());
10543
10544 Args.AddAllArgs(CmdArgs, options::OPT_e);
10545 // FIXME: add -N, -n flags
10546 Args.AddLastArg(CmdArgs, options::OPT_r);
10547 Args.AddLastArg(CmdArgs, options::OPT_s);
10548 Args.AddLastArg(CmdArgs, options::OPT_t);
10549 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10550 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10551
Douglas Katzman78b37b02015-11-17 20:28:07 +000010552 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010553 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10554 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10555 } else {
10556 if (Args.hasArg(options::OPT_municode))
10557 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10558 else
10559 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10560 }
10561 if (Args.hasArg(options::OPT_pg))
10562 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10563 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10564 }
10565
10566 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010567 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010568 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10569
10570 // TODO: Add ASan stuff here
10571
10572 // TODO: Add profile stuff here
10573
Douglas Katzman78b37b02015-11-17 20:28:07 +000010574 if (D.CCCIsCXX() &&
10575 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010576 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10577 !Args.hasArg(options::OPT_static);
10578 if (OnlyLibstdcxxStatic)
10579 CmdArgs.push_back("-Bstatic");
10580 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10581 if (OnlyLibstdcxxStatic)
10582 CmdArgs.push_back("-Bdynamic");
10583 }
10584
10585 if (!Args.hasArg(options::OPT_nostdlib)) {
10586 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10587 if (Args.hasArg(options::OPT_static))
10588 CmdArgs.push_back("--start-group");
10589
10590 if (Args.hasArg(options::OPT_fstack_protector) ||
10591 Args.hasArg(options::OPT_fstack_protector_strong) ||
10592 Args.hasArg(options::OPT_fstack_protector_all)) {
10593 CmdArgs.push_back("-lssp_nonshared");
10594 CmdArgs.push_back("-lssp");
10595 }
10596 if (Args.hasArg(options::OPT_fopenmp))
10597 CmdArgs.push_back("-lgomp");
10598
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010599 AddLibGCC(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010600
10601 if (Args.hasArg(options::OPT_pg))
10602 CmdArgs.push_back("-lgmon");
10603
Yaron Kerenadce68e2015-07-06 18:52:19 +000010604 if (Args.hasArg(options::OPT_pthread))
10605 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010606
10607 // add system libraries
10608 if (Args.hasArg(options::OPT_mwindows)) {
10609 CmdArgs.push_back("-lgdi32");
10610 CmdArgs.push_back("-lcomdlg32");
10611 }
10612 CmdArgs.push_back("-ladvapi32");
10613 CmdArgs.push_back("-lshell32");
10614 CmdArgs.push_back("-luser32");
10615 CmdArgs.push_back("-lkernel32");
10616
10617 if (Args.hasArg(options::OPT_static))
10618 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010619 else if (!LinkerName.equals_lower("lld"))
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010620 AddLibGCC(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010621 }
10622
10623 if (!Args.hasArg(options::OPT_nostartfiles)) {
10624 // Add crtfastmath.o if available and fast math is enabled.
10625 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10626
10627 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10628 }
10629 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010630 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010632}
10633
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010634/// XCore Tools
10635// We pass assemble and link construction to the xcc tool.
10636
Douglas Katzman95354292015-06-23 20:42:09 +000010637void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10638 const InputInfo &Output,
10639 const InputInfoList &Inputs,
10640 const ArgList &Args,
10641 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010642 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010643 ArgStringList CmdArgs;
10644
10645 CmdArgs.push_back("-o");
10646 CmdArgs.push_back(Output.getFilename());
10647
10648 CmdArgs.push_back("-c");
10649
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010650 if (Args.hasArg(options::OPT_v))
10651 CmdArgs.push_back("-v");
10652
Robert Lytton894d25c2014-05-02 09:33:25 +000010653 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10654 if (!A->getOption().matches(options::OPT_g0))
10655 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010656
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010657 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10658 false))
10659 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010660
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010661 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010662
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010663 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010664 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010665
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010666 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010667 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010668}
10669
Douglas Katzman95354292015-06-23 20:42:09 +000010670void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10671 const InputInfo &Output,
10672 const InputInfoList &Inputs,
10673 const ArgList &Args,
10674 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010675 ArgStringList CmdArgs;
10676
10677 if (Output.isFilename()) {
10678 CmdArgs.push_back("-o");
10679 CmdArgs.push_back(Output.getFilename());
10680 } else {
10681 assert(Output.isNothing() && "Invalid output.");
10682 }
10683
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010684 if (Args.hasArg(options::OPT_v))
10685 CmdArgs.push_back("-v");
10686
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010687 // Pass -fexceptions through to the linker if it was present.
10688 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10689 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010690 CmdArgs.push_back("-fexceptions");
10691
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010692 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10693
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010694 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010695 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010696}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010697
Douglas Katzman95354292015-06-23 20:42:09 +000010698void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10699 const InputInfo &Output,
10700 const InputInfoList &Inputs,
10701 const ArgList &Args,
10702 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010703 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010704 const auto &TC =
10705 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10706 ArgStringList CmdArgs;
10707 const char *Exec;
10708
10709 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010710 default:
10711 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010712 case llvm::Triple::arm:
10713 case llvm::Triple::thumb:
10714 break;
10715 case llvm::Triple::x86:
10716 CmdArgs.push_back("--32");
10717 break;
10718 case llvm::Triple::x86_64:
10719 CmdArgs.push_back("--64");
10720 break;
10721 }
10722
10723 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10724
10725 CmdArgs.push_back("-o");
10726 CmdArgs.push_back(Output.getFilename());
10727
10728 for (const auto &Input : Inputs)
10729 CmdArgs.push_back(Input.getFilename());
10730
10731 const std::string Assembler = TC.GetProgramPath("as");
10732 Exec = Args.MakeArgString(Assembler);
10733
Justin Bognerd3371d82015-07-17 03:35:54 +000010734 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010735}
10736
Douglas Katzman95354292015-06-23 20:42:09 +000010737void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10738 const InputInfo &Output,
10739 const InputInfoList &Inputs,
10740 const ArgList &Args,
10741 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010742 const auto &TC =
10743 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10744 const llvm::Triple &T = TC.getTriple();
10745 const Driver &D = TC.getDriver();
10746 SmallString<128> EntryPoint;
10747 ArgStringList CmdArgs;
10748 const char *Exec;
10749
10750 // Silence warning for "clang -g foo.o -o foo"
10751 Args.ClaimAllArgs(options::OPT_g_Group);
10752 // and "clang -emit-llvm foo.o -o foo"
10753 Args.ClaimAllArgs(options::OPT_emit_llvm);
10754 // and for "clang -w foo.o -o foo"
10755 Args.ClaimAllArgs(options::OPT_w);
10756 // Other warning options are already handled somewhere else.
10757
10758 if (!D.SysRoot.empty())
10759 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10760
10761 if (Args.hasArg(options::OPT_pie))
10762 CmdArgs.push_back("-pie");
10763 if (Args.hasArg(options::OPT_rdynamic))
10764 CmdArgs.push_back("-export-dynamic");
10765 if (Args.hasArg(options::OPT_s))
10766 CmdArgs.push_back("--strip-all");
10767
10768 CmdArgs.push_back("-m");
10769 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010770 default:
10771 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010772 case llvm::Triple::arm:
10773 case llvm::Triple::thumb:
10774 // FIXME: this is incorrect for WinCE
10775 CmdArgs.push_back("thumb2pe");
10776 break;
10777 case llvm::Triple::x86:
10778 CmdArgs.push_back("i386pe");
10779 EntryPoint.append("_");
10780 break;
10781 case llvm::Triple::x86_64:
10782 CmdArgs.push_back("i386pep");
10783 break;
10784 }
10785
10786 if (Args.hasArg(options::OPT_shared)) {
10787 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010788 default:
10789 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010790 case llvm::Triple::arm:
10791 case llvm::Triple::thumb:
10792 case llvm::Triple::x86_64:
10793 EntryPoint.append("_DllMainCRTStartup");
10794 break;
10795 case llvm::Triple::x86:
10796 EntryPoint.append("_DllMainCRTStartup@12");
10797 break;
10798 }
10799
10800 CmdArgs.push_back("-shared");
10801 CmdArgs.push_back("-Bdynamic");
10802
10803 CmdArgs.push_back("--enable-auto-image-base");
10804
10805 CmdArgs.push_back("--entry");
10806 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10807 } else {
10808 EntryPoint.append("mainCRTStartup");
10809
10810 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10811 : "-Bdynamic");
10812
Douglas Katzman78b37b02015-11-17 20:28:07 +000010813 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010814 CmdArgs.push_back("--entry");
10815 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10816 }
10817
10818 // FIXME: handle subsystem
10819 }
10820
10821 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010822 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010823
10824 CmdArgs.push_back("-o");
10825 CmdArgs.push_back(Output.getFilename());
10826
10827 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10828 SmallString<261> ImpLib(Output.getFilename());
10829 llvm::sys::path::replace_extension(ImpLib, ".lib");
10830
10831 CmdArgs.push_back("--out-implib");
10832 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10833 }
10834
Douglas Katzman78b37b02015-11-17 20:28:07 +000010835 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010836 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10837 const char *CRTBegin;
10838
10839 CRTBegin =
10840 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10841 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10842 }
10843
10844 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010845 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010846 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10847
10848 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10849 !Args.hasArg(options::OPT_nodefaultlibs)) {
10850 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10851 !Args.hasArg(options::OPT_static);
10852 if (StaticCXX)
10853 CmdArgs.push_back("-Bstatic");
10854 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10855 if (StaticCXX)
10856 CmdArgs.push_back("-Bdynamic");
10857 }
10858
10859 if (!Args.hasArg(options::OPT_nostdlib)) {
10860 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10861 // TODO handle /MT[d] /MD[d]
10862 CmdArgs.push_back("-lmsvcrt");
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010863 AddRunTimeLibs(TC, D, CmdArgs, Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010864 }
10865 }
10866
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010867 if (TC.getSanitizerArgs().needsAsanRt()) {
10868 // TODO handle /MT[d] /MD[d]
10869 if (Args.hasArg(options::OPT_shared)) {
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010870 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010871 } else {
10872 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
Vedant Kumar5fb00e42016-07-27 23:01:55 +000010873 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010874 // Make sure the dynamic runtime thunk is not optimized out at link time
10875 // to ensure proper SEH handling.
10876 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10877 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10878 ? "___asan_seh_interceptor"
10879 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010880 }
10881 }
10882
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010883 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010884
Justin Bognerd3371d82015-07-17 03:35:54 +000010885 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010886}
Douglas Katzman84a75642015-06-19 14:55:19 +000010887
Douglas Katzman95354292015-06-23 20:42:09 +000010888void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10889 const InputInfo &Output,
10890 const InputInfoList &Inputs,
10891 const ArgList &Args,
10892 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010893 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010894 assert(Inputs.size() == 1);
10895 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010896 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10897 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010898
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010899 if (JA.getKind() == Action::PreprocessJobClass) {
10900 Args.ClaimAllArgs();
10901 CmdArgs.push_back("-E");
10902 } else {
10903 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10904 CmdArgs.push_back("-S");
10905 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10906 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010907 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010908
Douglas Katzmanf6071112015-08-03 14:34:22 +000010909 // Append all -I, -iquote, -isystem paths, defines/undefines,
10910 // 'f' flags, optimize flags, and warning options.
10911 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010912 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010913 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010914 options::OPT_f_Group, options::OPT_f_clang_Group,
10915 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010916 options::OPT_O_Group, options::OPT_W_Group,
10917 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010918
10919 // If we're producing a dependency file, and assembly is the final action,
10920 // then the name of the target in the dependency file should be the '.o'
10921 // file, not the '.s' file produced by this step. For example, instead of
10922 // /tmp/mumble.s: mumble.c .../someheader.h
10923 // the filename on the lefthand side should be "mumble.o"
10924 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10925 C.getActions().size() == 1 &&
10926 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10927 Arg *A = Args.getLastArg(options::OPT_o);
10928 if (A) {
10929 CmdArgs.push_back("-MT");
10930 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10931 }
10932 }
10933
Douglas Katzman84a75642015-06-19 14:55:19 +000010934 CmdArgs.push_back(II.getFilename());
10935 CmdArgs.push_back("-o");
10936 CmdArgs.push_back(Output.getFilename());
10937
10938 std::string Exec =
10939 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010940 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10941 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010942}
10943
Douglas Katzman95354292015-06-23 20:42:09 +000010944void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10945 const InputInfo &Output,
10946 const InputInfoList &Inputs,
10947 const ArgList &Args,
10948 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010949 ArgStringList CmdArgs;
10950
10951 assert(Inputs.size() == 1);
10952 const InputInfo &II = Inputs[0];
10953 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10954 assert(Output.getType() == types::TY_Object);
10955
10956 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010957 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10958 if (CPUArg)
10959 CmdArgs.push_back(
10960 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010961 CmdArgs.push_back("-noSPrefixing");
10962 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010963 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10964 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10965 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010966 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010967 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010968 }
10969 CmdArgs.push_back("-elf"); // Output format.
10970 CmdArgs.push_back(II.getFilename());
10971 CmdArgs.push_back(
10972 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10973
10974 std::string Exec =
10975 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010976 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10977 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010978}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010979
10980void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10981 const InputInfo &Output,
10982 const InputInfoList &Inputs,
10983 const ArgList &Args,
10984 const char *LinkingOutput) const {
10985 const auto &TC =
10986 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10987 const llvm::Triple &T = TC.getTriple();
10988 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010989 bool UseStartfiles =
10990 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010991 bool UseDefaultLibs =
10992 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010993
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010994 if (T.getArch() == llvm::Triple::sparc)
10995 CmdArgs.push_back("-EB");
10996 else // SHAVE assumes little-endian, and sparcel is expressly so.
10997 CmdArgs.push_back("-EL");
10998
10999 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
11000 // but we never pass through a --sysroot option and various other bits.
11001 // For example, there are no sanitizers (yet) nor gold linker.
11002
11003 // Eat some arguments that may be present but have no effect.
11004 Args.ClaimAllArgs(options::OPT_g_Group);
11005 Args.ClaimAllArgs(options::OPT_w);
11006 Args.ClaimAllArgs(options::OPT_static_libgcc);
11007
11008 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
11009 CmdArgs.push_back("-s");
11010
11011 CmdArgs.push_back("-o");
11012 CmdArgs.push_back(Output.getFilename());
11013
11014 if (UseStartfiles) {
11015 // If you want startfiles, it means you want the builtin crti and crtbegin,
11016 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000011017 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
11018 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000011019 }
11020
11021 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
11022 options::OPT_e, options::OPT_s, options::OPT_t,
11023 options::OPT_Z_Flag, options::OPT_r});
11024
Douglas Katzman674a3122015-11-18 16:24:46 +000011025 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000011026
11027 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
11028
Douglas Katzman9e31cb92015-10-02 18:39:08 +000011029 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000011030 if (C.getDriver().CCCIsCXX())
11031 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000011032 if (T.getOS() == llvm::Triple::RTEMS) {
11033 CmdArgs.push_back("--start-group");
11034 CmdArgs.push_back("-lc");
11035 // You must provide your own "-L" option to enable finding these.
11036 CmdArgs.push_back("-lrtemscpu");
11037 CmdArgs.push_back("-lrtemsbsp");
11038 CmdArgs.push_back("--end-group");
11039 } else {
11040 CmdArgs.push_back("-lc");
11041 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000011042 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000011043 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000011044 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000011045 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
11046 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000011047 }
11048
11049 std::string Exec =
11050 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
11051 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
11052 CmdArgs, Inputs));
11053}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011054
11055void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
11056 const InputInfo &Output,
11057 const InputInfoList &Inputs,
11058 const ArgList &Args,
11059 const char *LinkingOutput) const {
11060 claimNoWarnArgs(Args);
11061 ArgStringList CmdArgs;
11062
11063 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
11064
11065 CmdArgs.push_back("-o");
11066 CmdArgs.push_back(Output.getFilename());
11067
11068 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
11069 const InputInfo &Input = Inputs[0];
11070 assert(Input.isFilename() && "Invalid input.");
11071 CmdArgs.push_back(Input.getFilename());
11072
11073 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000011074 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11076}
11077
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011078static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
11079 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
11080 if (SanArgs.needsUbsanRt()) {
11081 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
11082 }
11083 if (SanArgs.needsAsanRt()) {
11084 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
11085 }
11086}
11087
11088static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
11089 const JobAction &JA, const InputInfo &Output,
11090 const InputInfoList &Inputs,
11091 const ArgList &Args,
11092 const char *LinkingOutput) {
11093 const toolchains::FreeBSD &ToolChain =
11094 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
11095 const Driver &D = ToolChain.getDriver();
11096 ArgStringList CmdArgs;
11097
11098 // Silence warning for "clang -g foo.o -o foo"
11099 Args.ClaimAllArgs(options::OPT_g_Group);
11100 // and "clang -emit-llvm foo.o -o foo"
11101 Args.ClaimAllArgs(options::OPT_emit_llvm);
11102 // and for "clang -w foo.o -o foo". Other warning options are already
11103 // handled somewhere else.
11104 Args.ClaimAllArgs(options::OPT_w);
11105
11106 if (!D.SysRoot.empty())
11107 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
11108
11109 if (Args.hasArg(options::OPT_pie))
11110 CmdArgs.push_back("-pie");
11111
11112 if (Args.hasArg(options::OPT_rdynamic))
11113 CmdArgs.push_back("-export-dynamic");
11114 if (Args.hasArg(options::OPT_shared))
11115 CmdArgs.push_back("--oformat=so");
11116
11117 if (Output.isFilename()) {
11118 CmdArgs.push_back("-o");
11119 CmdArgs.push_back(Output.getFilename());
11120 } else {
11121 assert(Output.isNothing() && "Invalid output.");
11122 }
11123
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000011124 AddPS4SanitizerArgs(ToolChain, CmdArgs);
11125
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011126 Args.AddAllArgs(CmdArgs, options::OPT_L);
11127 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
11128 Args.AddAllArgs(CmdArgs, options::OPT_e);
11129 Args.AddAllArgs(CmdArgs, options::OPT_s);
11130 Args.AddAllArgs(CmdArgs, options::OPT_t);
11131 Args.AddAllArgs(CmdArgs, options::OPT_r);
11132
11133 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
11134 CmdArgs.push_back("--no-demangle");
11135
11136 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
11137
11138 if (Args.hasArg(options::OPT_pthread)) {
11139 CmdArgs.push_back("-lpthread");
11140 }
11141
Paul Robinson9d613612016-05-16 17:22:25 +000011142 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011143
11144 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
11145}
11146
11147static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
11148 const JobAction &JA, const InputInfo &Output,
11149 const InputInfoList &Inputs,
11150 const ArgList &Args,
11151 const char *LinkingOutput) {
11152 const toolchains::FreeBSD &ToolChain =
11153 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
11154 const Driver &D = ToolChain.getDriver();
11155 ArgStringList CmdArgs;
11156
11157 // Silence warning for "clang -g foo.o -o foo"
11158 Args.ClaimAllArgs(options::OPT_g_Group);
11159 // and "clang -emit-llvm foo.o -o foo"
11160 Args.ClaimAllArgs(options::OPT_emit_llvm);
11161 // and for "clang -w foo.o -o foo". Other warning options are already
11162 // handled somewhere else.
11163 Args.ClaimAllArgs(options::OPT_w);
11164
11165 if (!D.SysRoot.empty())
11166 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
11167
11168 if (Args.hasArg(options::OPT_pie))
11169 CmdArgs.push_back("-pie");
11170
11171 if (Args.hasArg(options::OPT_static)) {
11172 CmdArgs.push_back("-Bstatic");
11173 } else {
11174 if (Args.hasArg(options::OPT_rdynamic))
11175 CmdArgs.push_back("-export-dynamic");
11176 CmdArgs.push_back("--eh-frame-hdr");
11177 if (Args.hasArg(options::OPT_shared)) {
11178 CmdArgs.push_back("-Bshareable");
11179 } else {
11180 CmdArgs.push_back("-dynamic-linker");
11181 CmdArgs.push_back("/libexec/ld-elf.so.1");
11182 }
11183 CmdArgs.push_back("--enable-new-dtags");
11184 }
11185
11186 if (Output.isFilename()) {
11187 CmdArgs.push_back("-o");
11188 CmdArgs.push_back(Output.getFilename());
11189 } else {
11190 assert(Output.isNothing() && "Invalid output.");
11191 }
11192
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000011193 AddPS4SanitizerArgs(ToolChain, CmdArgs);
11194
Douglas Katzman78b37b02015-11-17 20:28:07 +000011195 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000011196 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011197 if (!Args.hasArg(options::OPT_shared)) {
11198 if (Args.hasArg(options::OPT_pg))
11199 crt1 = "gcrt1.o";
11200 else if (Args.hasArg(options::OPT_pie))
11201 crt1 = "Scrt1.o";
11202 else
11203 crt1 = "crt1.o";
11204 }
11205 if (crt1)
11206 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
11207
11208 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
11209
Eugene Zelenkod4304d22015-11-04 21:37:17 +000011210 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011211 if (Args.hasArg(options::OPT_static))
11212 crtbegin = "crtbeginT.o";
11213 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11214 crtbegin = "crtbeginS.o";
11215 else
11216 crtbegin = "crtbegin.o";
11217
11218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
11219 }
11220
11221 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000011222 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011223 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
11224 Args.AddAllArgs(CmdArgs, options::OPT_e);
11225 Args.AddAllArgs(CmdArgs, options::OPT_s);
11226 Args.AddAllArgs(CmdArgs, options::OPT_t);
11227 Args.AddAllArgs(CmdArgs, options::OPT_r);
11228
11229 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
11230 CmdArgs.push_back("--no-demangle");
11231
11232 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
11233
Douglas Katzman78b37b02015-11-17 20:28:07 +000011234 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011235 // For PS4, we always want to pass libm, libstdc++ and libkernel
11236 // libraries for both C and C++ compilations.
11237 CmdArgs.push_back("-lkernel");
11238 if (D.CCCIsCXX()) {
11239 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
11240 if (Args.hasArg(options::OPT_pg))
11241 CmdArgs.push_back("-lm_p");
11242 else
11243 CmdArgs.push_back("-lm");
11244 }
11245 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
11246 // the default system libraries. Just mimic this for now.
11247 if (Args.hasArg(options::OPT_pg))
11248 CmdArgs.push_back("-lgcc_p");
11249 else
11250 CmdArgs.push_back("-lcompiler_rt");
11251 if (Args.hasArg(options::OPT_static)) {
11252 CmdArgs.push_back("-lstdc++");
11253 } else if (Args.hasArg(options::OPT_pg)) {
11254 CmdArgs.push_back("-lgcc_eh_p");
11255 } else {
11256 CmdArgs.push_back("--as-needed");
11257 CmdArgs.push_back("-lstdc++");
11258 CmdArgs.push_back("--no-as-needed");
11259 }
11260
11261 if (Args.hasArg(options::OPT_pthread)) {
11262 if (Args.hasArg(options::OPT_pg))
11263 CmdArgs.push_back("-lpthread_p");
11264 else
11265 CmdArgs.push_back("-lpthread");
11266 }
11267
11268 if (Args.hasArg(options::OPT_pg)) {
11269 if (Args.hasArg(options::OPT_shared))
11270 CmdArgs.push_back("-lc");
11271 else {
11272 if (Args.hasArg(options::OPT_static)) {
11273 CmdArgs.push_back("--start-group");
11274 CmdArgs.push_back("-lc_p");
11275 CmdArgs.push_back("-lpthread_p");
11276 CmdArgs.push_back("--end-group");
11277 } else {
11278 CmdArgs.push_back("-lc_p");
11279 }
11280 }
11281 CmdArgs.push_back("-lgcc_p");
11282 } else {
11283 if (Args.hasArg(options::OPT_static)) {
11284 CmdArgs.push_back("--start-group");
11285 CmdArgs.push_back("-lc");
11286 CmdArgs.push_back("-lpthread");
11287 CmdArgs.push_back("--end-group");
11288 } else {
11289 CmdArgs.push_back("-lc");
11290 }
11291 CmdArgs.push_back("-lcompiler_rt");
11292 }
11293
11294 if (Args.hasArg(options::OPT_static)) {
11295 CmdArgs.push_back("-lstdc++");
11296 } else if (Args.hasArg(options::OPT_pg)) {
11297 CmdArgs.push_back("-lgcc_eh_p");
11298 } else {
11299 CmdArgs.push_back("--as-needed");
11300 CmdArgs.push_back("-lstdc++");
11301 CmdArgs.push_back("--no-as-needed");
11302 }
11303 }
11304
Douglas Katzman78b37b02015-11-17 20:28:07 +000011305 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011306 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
11307 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
11308 else
11309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
11310 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
11311 }
11312
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011313 const char *Exec =
11314#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000011315 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011316#else
Paul Robinson9d613612016-05-16 17:22:25 +000011317 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000011318#endif
11319
11320 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
11321}
11322
11323void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
11324 const InputInfo &Output,
11325 const InputInfoList &Inputs,
11326 const ArgList &Args,
11327 const char *LinkingOutput) const {
11328 const toolchains::FreeBSD &ToolChain =
11329 static_cast<const toolchains::FreeBSD &>(getToolChain());
11330 const Driver &D = ToolChain.getDriver();
11331 bool PS4Linker;
11332 StringRef LinkerOptName;
11333 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
11334 LinkerOptName = A->getValue();
11335 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
11336 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
11337 }
11338
11339 if (LinkerOptName == "gold")
11340 PS4Linker = false;
11341 else if (LinkerOptName == "ps4")
11342 PS4Linker = true;
11343 else
11344 PS4Linker = !Args.hasArg(options::OPT_shared);
11345
11346 if (PS4Linker)
11347 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11348 else
11349 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
11350}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011351
11352void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
11353 const InputInfo &Output,
11354 const InputInfoList &Inputs,
11355 const ArgList &Args,
11356 const char *LinkingOutput) const {
11357 const auto &TC =
11358 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011359 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011360
Samuel Antaod06239d2016-07-15 23:13:27 +000011361 // Obtain architecture from the action.
11362 CudaArch gpu_arch = StringToCudaArch(JA.getOffloadingArch());
11363 assert(gpu_arch != CudaArch::UNKNOWN &&
11364 "Device action expected to have an architecture.");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011365
Justin Lebarc43ad9e2016-07-07 18:17:52 +000011366 // Check that our installation's ptxas supports gpu_arch.
Justin Lebarf3997712016-07-07 18:24:28 +000011367 if (!Args.hasArg(options::OPT_no_cuda_version_check)) {
Samuel Antaod06239d2016-07-15 23:13:27 +000011368 TC.cudaInstallation().CheckCudaVersionSupportsArch(gpu_arch);
Justin Lebarc43ad9e2016-07-07 18:17:52 +000011369 }
11370
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011371 ArgStringList CmdArgs;
11372 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000011373 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11374 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000011375 // ptxas does not accept -g option if optimization is enabled, so
11376 // we ignore the compiler's -O* options if we want debug info.
11377 CmdArgs.push_back("-g");
11378 CmdArgs.push_back("--dont-merge-basicblocks");
11379 CmdArgs.push_back("--return-at-end");
11380 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11381 // Map the -O we received to -O{0,1,2,3}.
11382 //
11383 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11384 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011385
Justin Lebar2836dcd2016-01-19 19:52:21 +000011386 // -O3 seems like the least-bad option when -Osomething is specified to
11387 // clang but it isn't handled below.
11388 StringRef OOpt = "3";
11389 if (A->getOption().matches(options::OPT_O4) ||
11390 A->getOption().matches(options::OPT_Ofast))
11391 OOpt = "3";
11392 else if (A->getOption().matches(options::OPT_O0))
11393 OOpt = "0";
11394 else if (A->getOption().matches(options::OPT_O)) {
11395 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11396 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11397 .Case("1", "1")
11398 .Case("2", "2")
11399 .Case("3", "3")
11400 .Case("s", "2")
11401 .Case("z", "2")
11402 .Default("2");
11403 }
11404 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11405 } else {
11406 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11407 // to no optimizations, but ptxas's default is -O3.
11408 CmdArgs.push_back("-O0");
11409 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011410
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011411 CmdArgs.push_back("--gpu-name");
Samuel Antaod06239d2016-07-15 23:13:27 +000011412 CmdArgs.push_back(Args.MakeArgString(CudaArchToString(gpu_arch)));
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011413 CmdArgs.push_back("--output-file");
11414 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11415 for (const auto& II : Inputs)
11416 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11417
11418 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11419 CmdArgs.push_back(Args.MakeArgString(A));
11420
11421 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11422 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11423}
11424
11425// All inputs to this linker must be from CudaDeviceActions, as we need to look
11426// at the Inputs' Actions in order to figure out which GPU architecture they
11427// correspond to.
11428void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11429 const InputInfo &Output,
11430 const InputInfoList &Inputs,
11431 const ArgList &Args,
11432 const char *LinkingOutput) const {
11433 const auto &TC =
11434 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011435 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011436
11437 ArgStringList CmdArgs;
11438 CmdArgs.push_back("--cuda");
11439 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11440 CmdArgs.push_back(Args.MakeArgString("--create"));
11441 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11442
11443 for (const auto& II : Inputs) {
Samuel Antaod06239d2016-07-15 23:13:27 +000011444 auto *A = II.getAction();
11445 assert(A->getInputs().size() == 1 &&
11446 "Device offload action is expected to have a single input");
11447 const char *gpu_arch_str = A->getOffloadingArch();
11448 assert(gpu_arch_str &&
11449 "Device action expected to have associated a GPU architecture!");
11450 CudaArch gpu_arch = StringToCudaArch(gpu_arch_str);
11451
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011452 // We need to pass an Arch of the form "sm_XX" for cubin files and
11453 // "compute_XX" for ptx.
Justin Lebar62907612016-07-06 21:21:39 +000011454 const char *Arch =
11455 (II.getType() == types::TY_PP_Asm)
Samuel Antaod06239d2016-07-15 23:13:27 +000011456 ? CudaVirtualArchToString(VirtualArchForCudaArch(gpu_arch))
11457 : gpu_arch_str;
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011458 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11459 Arch + ",file=" + II.getFilename()));
11460 }
11461
11462 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11463 CmdArgs.push_back(Args.MakeArgString(A));
11464
11465 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11466 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11467}