blob: e72e4bdcb2262d9f9974415b366361cab3ce23cc [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
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
Daniel Dunbar64198ef2009-09-10 01:21:05 +000055/// CheckPreprocessingOptions - Perform some validation of preprocessing
56/// arguments that is shared with gcc.
57static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000058 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
59 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
60 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000061 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000062 << A->getBaseArg().getAsString(Args)
63 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
64 }
65 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000066}
67
Daniel Dunbar4eadb602009-09-10 01:21:12 +000068/// CheckCodeGenerationOptions - Perform some validation of code generation
69/// arguments that is shared with gcc.
70static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
71 // In gcc, only ARM checks this, but it seems reasonable to check universally.
72 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +000073 if (const Arg *A =
74 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
75 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
76 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +000077}
78
Bob Wilsond5aad2a2014-11-04 22:28:48 +000079// Add backslashes to escape spaces and other backslashes.
80// This is used for the space-separated argument list specified with
81// the -dwarf-debug-flags option.
82static void EscapeSpacesAndBackslashes(const char *Arg,
83 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000084 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +000085 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000086 default:
87 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +000088 case ' ':
89 case '\\':
90 Res.push_back('\\');
91 break;
92 }
93 Res.push_back(*Arg);
94 }
95}
96
Chris Lattnerbf2803f2010-03-29 17:55:58 +000097// Quote target names for inclusion in GNU Make dependency files.
98// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +000099static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000100 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
101 switch (Target[i]) {
102 case ' ':
103 case '\t':
104 // Escape the preceding backslashes
105 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
106 Res.push_back('\\');
107
108 // Escape the space/tab
109 Res.push_back('\\');
110 break;
111 case '$':
112 Res.push_back('$');
113 break;
114 case '#':
115 Res.push_back('\\');
116 break;
117 default:
118 break;
119 }
120
121 Res.push_back(Target[i]);
122 }
123}
124
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000125static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
126 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000127 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000128 bool CombinedArg = false;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 if (!DirList)
131 return; // Nothing to do.
132
Chad Rosier616e8a52012-10-30 21:42:09 +0000133 StringRef Name(ArgName);
134 if (Name.equals("-I") || Name.equals("-L"))
135 CombinedArg = true;
136
Bill Wendling281ca292012-03-12 21:22:35 +0000137 StringRef Dirs(DirList);
138 if (Dirs.empty()) // Empty string should not add '.'.
139 return;
140
141 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000142 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000143 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(".");
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000151 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000152 CmdArgs.push_back(
153 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000154 } else {
155 CmdArgs.push_back(ArgName);
156 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
157 }
Bill Wendling281ca292012-03-12 21:22:35 +0000158 }
Nico Weber89355782012-03-19 15:00:03 +0000159 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000160 }
161
162 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 if (CombinedArg) {
164 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
165 } else {
166 CmdArgs.push_back(ArgName);
167 CmdArgs.push_back(".");
168 }
Bill Wendling281ca292012-03-12 21:22:35 +0000169 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000170 if (CombinedArg) {
171 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
172 } else {
173 CmdArgs.push_back(ArgName);
174 CmdArgs.push_back(Args.MakeArgString(Dirs));
175 }
Bill Wendling281ca292012-03-12 21:22:35 +0000176 }
177}
178
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
180 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 const Driver &D = TC.getDriver();
182
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000183 // Add extra linker input arguments which are not treated as inputs
184 // (constructed via -Xarch_).
185 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
186
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000187 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 if (!TC.HasNativeLLVMSupport()) {
189 // Don't try to pass LLVM inputs unless we have native support.
190 if (II.getType() == types::TY_LLVM_IR ||
191 II.getType() == types::TY_LTO_IR ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000192 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
193 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000194 }
195
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000196 // Add filenames immediately.
197 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000198 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000199 continue;
200 }
201
202 // Otherwise, this is a linker input argument.
203 const Arg &A = II.getInputArg();
204
205 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000206 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000207 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000208 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000209 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000210 else if (A.getOption().matches(options::OPT_z)) {
211 // Pass -z prefix for gcc linker compatibility.
212 A.claim();
213 A.render(Args, CmdArgs);
214 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000215 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000216 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000217 }
Bill Wendling281ca292012-03-12 21:22:35 +0000218
219 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000220 // and only supported on native toolchains.
221 if (!TC.isCrossCompiling())
222 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000223}
224
John McCall31168b02011-06-15 23:02:42 +0000225/// \brief Determine whether Objective-C automated reference counting is
226/// enabled.
227static bool isObjCAutoRefCount(const ArgList &Args) {
228 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
229}
230
Ted Kremeneke65b0862012-03-06 20:05:56 +0000231/// \brief Determine whether we are linking the ObjC runtime.
232static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000233 if (isObjCAutoRefCount(Args)) {
234 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000235 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000236 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000237 return Args.hasArg(options::OPT_fobjc_link_runtime);
238}
239
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000240static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000241 // Don't forward inputs from the original command line. They are added from
242 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000243 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000244 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000245}
246
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000247void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
248 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000249 ArgStringList &CmdArgs,
250 const InputInfo &Output,
251 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000253
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000254 CheckPreprocessingOptions(D, Args);
255
256 Args.AddLastArg(CmdArgs, options::OPT_C);
257 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000258
259 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000260 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 (A = Args.getLastArg(options::OPT_MD)) ||
262 (A = Args.getLastArg(options::OPT_MMD))) {
263 // Determine the output location.
264 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000265 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000266 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000267 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000268 } else if (Output.getType() == types::TY_Dependencies) {
269 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000270 } else if (A->getOption().matches(options::OPT_M) ||
271 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 DepFile = "-";
273 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000274 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000275 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 }
277 CmdArgs.push_back("-dependency-file");
278 CmdArgs.push_back(DepFile);
279
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
282 const char *DepTarget;
283
284 // If user provided -o, that is the dependency target, except
285 // when we are only generating a dependency file.
286 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
287 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000288 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 } else {
290 // Otherwise derive from the base input.
291 //
292 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000293 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000294 llvm::sys::path::replace_extension(P, "o");
295 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000296 }
297
298 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000299 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000300 QuoteTarget(DepTarget, Quoted);
301 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 }
303
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000304 if (A->getOption().matches(options::OPT_M) ||
305 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000307 if ((isa<PrecompileJobAction>(JA) &&
308 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
309 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000310 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 }
312
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000313 if (Args.hasArg(options::OPT_MG)) {
314 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000315 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000316 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000317 CmdArgs.push_back("-MG");
318 }
319
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000320 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000321 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322
323 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000324 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000325 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000326
Daniel Dunbara442fd52010-06-11 22:00:13 +0000327 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000328 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000329 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000330 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000331 CmdArgs.push_back(Args.MakeArgString(Quoted));
332
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000333 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000334 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000335 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000336 }
337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338
Douglas Gregor111af7d2009-04-18 00:34:01 +0000339 // Add -i* options, and automatically translate to
340 // -include-pch/-include-pth for transparent PCH support. It's
341 // wonky, but we include looking for .gch so we can support seamless
342 // replacement into a build system already set up to be generating
343 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000345 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000346 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000347 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
348 RenderedImplicitInclude = true;
349
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000350 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000352
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000355 SmallString<128> P(A->getValue());
356 // We want the files to have a name like foo.h.pch. Add a dummy extension
357 // so that replace_extension does the right thing.
358 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000359 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000360 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000361 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000363 }
364
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000366 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000367 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000369 }
370
Douglas Gregor111af7d2009-04-18 00:34:01 +0000371 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000372 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000373 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000374 FoundPCH = UsePCH;
375 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000376 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000377 }
378
379 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000380 if (IsFirstImplicitInclude) {
381 A->claim();
382 if (UsePCH)
383 CmdArgs.push_back("-include-pch");
384 else
385 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000386 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000387 continue;
388 } else {
389 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 D.Diag(diag::warn_drv_pch_not_first_include) << P
391 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000393 }
394 }
395
396 // Not translated, render as usual.
397 A->claim();
398 A->render(Args, CmdArgs);
399 }
400
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000401 Args.AddAllArgs(CmdArgs,
402 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
403 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000404
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000405 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000406
407 // FIXME: There is a very unfortunate problem here, some troubled
408 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
409 // really support that we would have to parse and then translate
410 // those options. :(
411 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
412 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000413
414 // -I- is a deprecated GCC feature, reject it.
415 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000416 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417
418 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
419 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000420 StringRef sysroot = C.getSysRoot();
421 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 if (!Args.hasArg(options::OPT_isysroot)) {
423 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000424 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000425 }
426 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000427
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000429 // FIXME: We should probably sink the logic for handling these from the
430 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // CPATH - included following the user specified includes (but prior to
432 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000434 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000435 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000442
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000443 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000444 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000445 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000446
447 // Add system include arguments.
448 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000449}
450
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000451// FIXME: Move to target hook.
452static bool isSignedCharDefault(const llvm::Triple &Triple) {
453 switch (Triple.getArch()) {
454 default:
455 return true;
456
Tim Northover9bb857a2013-01-31 12:13:10 +0000457 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000458 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000459 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000460 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000461 case llvm::Triple::thumb:
462 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000463 if (Triple.isOSDarwin() || Triple.isOSWindows())
464 return true;
465 return false;
466
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 case llvm::Triple::ppc:
468 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000469 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000470 return true;
471 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000472
David Majnemerdcecd932015-05-23 19:23:55 +0000473 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000474 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000475 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000476 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000477 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000478 }
479}
480
Robert Lytton0e076492013-08-13 09:43:10 +0000481static bool isNoCommonDefault(const llvm::Triple &Triple) {
482 switch (Triple.getArch()) {
483 default:
484 return false;
485
486 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000487 case llvm::Triple::wasm32:
488 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000489 return true;
490 }
491}
492
Renato Goline17c5802015-07-27 23:44:42 +0000493// ARM tools start.
494
495// Get SubArch (vN).
496static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
497 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000498 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000499}
500
501// True if M-profile.
502static bool isARMMProfile(const llvm::Triple &Triple) {
503 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000504 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000505 return Profile == llvm::ARM::PK_M;
506}
507
508// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000509static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
510 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000511 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
512 CPU = A->getValue();
513 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
514 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000515 if (!FromAs)
516 return;
517
518 for (const Arg *A :
519 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
520 StringRef Value = A->getValue();
521 if (Value.startswith("-mcpu="))
522 CPU = Value.substr(6);
523 if (Value.startswith("-march="))
524 Arch = Value.substr(7);
525 }
Renato Goline17c5802015-07-27 23:44:42 +0000526}
527
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000528// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000529// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000530static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000531 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000532 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000533 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
534 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000535 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
536}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000537
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000538// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000539static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000540 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000541 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000542 unsigned FPUID = llvm::ARM::parseFPU(FPU);
543 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000544 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
545}
546
Renato Golin7c542b42015-07-27 23:44:45 +0000547// Check if -march is valid by checking if it can be canonicalised and parsed.
548// getARMArch is used here instead of just checking the -march value in order
549// to handle -march=native correctly.
550static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000551 llvm::StringRef ArchName,
552 const llvm::Triple &Triple) {
553 std::string MArch = arm::getARMArch(ArchName, Triple);
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000554 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID)
Renato Goline17c5802015-07-27 23:44:42 +0000555 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000556}
557
Renato Golin7c542b42015-07-27 23:44:45 +0000558// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
559static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
560 llvm::StringRef CPUName, llvm::StringRef ArchName,
Renato Goline17c5802015-07-27 23:44:42 +0000561 const llvm::Triple &Triple) {
562 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Vladimir Sukharev64f68242015-09-23 09:29:32 +0000563 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000564 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000565}
566
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000567static bool useAAPCSForMachO(const llvm::Triple &T) {
568 // The backend is hardwired to assume AAPCS for M-class processors, ensure
569 // the frontend matches that.
570 return T.getEnvironment() == llvm::Triple::EABI ||
571 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
572}
573
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000574// Select the float ABI as determined by -msoft-float, -mhard-float, and
575// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000576arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
577 const Driver &D = TC.getDriver();
578 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000579 auto SubArch = getARMSubArchVersionNumber(Triple);
580 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000581 if (Arg *A =
582 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
583 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000584 if (A->getOption().matches(options::OPT_msoft_float)) {
585 ABI = FloatABI::Soft;
586 } else if (A->getOption().matches(options::OPT_mhard_float)) {
587 ABI = FloatABI::Hard;
588 } else {
589 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
590 .Case("soft", FloatABI::Soft)
591 .Case("softfp", FloatABI::SoftFP)
592 .Case("hard", FloatABI::Hard)
593 .Default(FloatABI::Invalid);
594 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000595 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000596 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000597 }
598 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000599
600 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
601 // "apcs-gnu".
602 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000603 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000604 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
605 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000606 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 }
608
609 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000610 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000611 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000612 case llvm::Triple::Darwin:
613 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000614 case llvm::Triple::IOS:
615 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000616 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000617 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000618 break;
619 }
Tim Northover756447a2015-10-30 16:30:36 +0000620 case llvm::Triple::WatchOS:
621 ABI = FloatABI::Hard;
622 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000623
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000624 // FIXME: this is invalid for WindowsCE
625 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000626 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000627 break;
628
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000629 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000630 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000631 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000632 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000633 break;
634 default:
635 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000636 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000637 break;
638 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000639 break;
640
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000642 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000643 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000644 case llvm::Triple::EABIHF:
645 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000646 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000648 case llvm::Triple::EABI:
649 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000650 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000652 case llvm::Triple::Android:
653 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000654 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 default:
656 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000657 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000658 if (Triple.getOS() != llvm::Triple::UnknownOS ||
659 !Triple.isOSBinFormatMachO())
660 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000661 break;
662 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000663 }
664 }
665
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000666 assert(ABI != FloatABI::Invalid && "must select an ABI");
667 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000668}
669
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000670static void getARMTargetFeatures(const ToolChain &TC,
671 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000672 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000673 std::vector<const char *> &Features,
674 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000675 const Driver &D = TC.getDriver();
676
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000677 bool KernelOrKext =
678 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000679 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000680 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
681 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
682
Nico Weber6e0ebae2015-04-29 21:16:40 +0000683 if (!ForAS) {
684 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
685 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
686 // stripped out by the ARM target. We should probably pass this a new
687 // -target-option, which is handled by the -cc1/-cc1as invocation.
688 //
689 // FIXME2: For consistency, it would be ideal if we set up the target
690 // machine state the same when using the frontend or the assembler. We don't
691 // currently do that for the assembler, we pass the options directly to the
692 // backend and never even instantiate the frontend TargetInfo. If we did,
693 // and used its handleTargetFeatures hook, then we could ensure the
694 // assembler and the frontend behave the same.
695
696 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000698 Features.push_back("+soft-float");
699
700 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000702 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000703 } else {
704 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
705 // to the assembler correctly.
706 for (const Arg *A :
707 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
708 StringRef Value = A->getValue();
709 if (Value.startswith("-mfpu=")) {
710 WaFPU = A;
711 } else if (Value.startswith("-mcpu=")) {
712 WaCPU = A;
713 } else if (Value.startswith("-mhwdiv=")) {
714 WaHDiv = A;
715 } else if (Value.startswith("-march=")) {
716 WaArch = A;
717 }
718 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000719 }
720
Renato Golin7c542b42015-07-27 23:44:45 +0000721 // Check -march. ClangAs gives preference to -Wa,-march=.
722 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000723 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000724 if (WaArch) {
725 if (ArchArg)
726 D.Diag(clang::diag::warn_drv_unused_argument)
727 << ArchArg->getAsString(Args);
728 ArchName = StringRef(WaArch->getValue()).substr(7);
729 checkARMArchName(D, WaArch, Args, ArchName, Triple);
730 // FIXME: Set Arch.
731 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
732 } else if (ArchArg) {
733 ArchName = ArchArg->getValue();
734 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000735 }
736
Renato Golin7c542b42015-07-27 23:44:45 +0000737 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
738 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000739 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000740 if (WaCPU) {
741 if (CPUArg)
742 D.Diag(clang::diag::warn_drv_unused_argument)
743 << CPUArg->getAsString(Args);
744 CPUName = StringRef(WaCPU->getValue()).substr(6);
745 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
746 } else if (CPUArg) {
747 CPUName = CPUArg->getValue();
748 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000749 }
John Brawna95c1a82015-05-08 12:52:18 +0000750
Renato Golin23459c62015-07-30 16:40:17 +0000751 // Add CPU features for generic CPUs
752 if (CPUName == "native") {
753 llvm::StringMap<bool> HostFeatures;
754 if (llvm::sys::getHostCPUFeatures(HostFeatures))
755 for (auto &F : HostFeatures)
756 Features.push_back(
757 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
758 }
759
760 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
761 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
762 if (WaFPU) {
763 if (FPUArg)
764 D.Diag(clang::diag::warn_drv_unused_argument)
765 << FPUArg->getAsString(Args);
766 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
767 Features);
768 } else if (FPUArg) {
769 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
770 }
771
772 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
773 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
774 if (WaHDiv) {
775 if (HDivArg)
776 D.Diag(clang::diag::warn_drv_unused_argument)
777 << HDivArg->getAsString(Args);
778 getARMHWDivFeatures(D, WaHDiv, Args,
779 StringRef(WaHDiv->getValue()).substr(8), Features);
780 } else if (HDivArg)
781 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
782
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000783 // Setting -msoft-float effectively disables NEON because of the GCC
784 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000786 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000787 // Also need to explicitly disable features which imply NEON.
788 Features.push_back("-crypto");
789 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000790
Eric Christopher269c2a22015-04-04 03:34:43 +0000791 // En/disable crc code generation.
792 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000793 if (A->getOption().matches(options::OPT_mcrc))
794 Features.push_back("+crc");
795 else
796 Features.push_back("-crc");
797 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000798
799 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
800 Features.insert(Features.begin(), "+v8.1a");
801 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000802
Akira Hatanakac2694822015-07-07 08:28:42 +0000803 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
804 // neither options are specified, see if we are compiling for kernel/kext and
805 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000806 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
807 options::OPT_mno_long_calls)) {
808 if (A->getOption().matches(options::OPT_mlong_calls))
809 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000810 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
811 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000812 Features.push_back("+long-calls");
813 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000814
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000815 // Kernel code has more strict alignment requirements.
816 if (KernelOrKext)
817 Features.push_back("+strict-align");
818 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
819 options::OPT_munaligned_access)) {
820 if (A->getOption().matches(options::OPT_munaligned_access)) {
821 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
822 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
823 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
824 } else
825 Features.push_back("+strict-align");
826 } else {
827 // Assume pre-ARMv6 doesn't support unaligned accesses.
828 //
829 // ARMv6 may or may not support unaligned accesses depending on the
830 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
831 // Darwin and NetBSD targets support unaligned accesses, and others don't.
832 //
833 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
834 // which raises an alignment fault on unaligned accesses. Linux
835 // defaults this bit to 0 and handles it as a system-wide (not
836 // per-process) setting. It is therefore safe to assume that ARMv7+
837 // Linux targets support unaligned accesses. The same goes for NaCl.
838 //
839 // The above behavior is consistent with GCC.
840 int VersionNum = getARMSubArchVersionNumber(Triple);
841 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000842 if (VersionNum < 6 ||
843 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000844 Features.push_back("+strict-align");
845 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
846 if (VersionNum < 7)
847 Features.push_back("+strict-align");
848 } else
849 Features.push_back("+strict-align");
850 }
851
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000852 // llvm does not support reserving registers in general. There is support
853 // for reserving r9 on ARM though (defined as a platform-specific register
854 // in ARM EABI).
855 if (Args.hasArg(options::OPT_ffixed_r9))
856 Features.push_back("+reserve-r9");
857
Akira Hatanaka580efb22015-07-16 00:43:00 +0000858 // The kext linker doesn't know how to deal with movw/movt.
859 if (KernelOrKext)
860 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000861}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000862
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000863void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
864 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000865 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000866 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000867 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000868 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000869 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000870 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000871 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000872 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000873 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000874 } else if (Triple.isWatchOS()) {
875 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000876 } else {
877 ABIName = "apcs-gnu";
878 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000879 } else if (Triple.isOSWindows()) {
880 // FIXME: this is invalid for WindowsCE
881 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000882 } else {
883 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000884 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000885 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000886 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000887 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000888 ABIName = "aapcs-linux";
889 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000890 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000891 case llvm::Triple::EABI:
892 ABIName = "aapcs";
893 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000894 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000895 if (Triple.getOS() == llvm::Triple::NetBSD)
896 ABIName = "apcs-gnu";
897 else
898 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000899 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000900 }
901 }
902 CmdArgs.push_back("-target-abi");
903 CmdArgs.push_back(ABIName);
904
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000905 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000906 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000907 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000908 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000909 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000910 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000911 CmdArgs.push_back("-mfloat-abi");
912 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000913 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000914 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000917 } else {
918 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000919 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000920 CmdArgs.push_back("-mfloat-abi");
921 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000922 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000923
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000924 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000925 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
926 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000927 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000928 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000929 CmdArgs.push_back("-arm-global-merge=false");
930 else
931 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000932 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000933
Bob Wilson9c8af452013-04-11 18:53:25 +0000934 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000935 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000936 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000937}
Renato Goline17c5802015-07-27 23:44:42 +0000938// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000939
Tim Northover573cbee2014-05-24 12:52:07 +0000940/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
941/// targeting.
942static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000943 Arg *A;
944 std::string CPU;
945 // If we have -mtune or -mcpu, use that.
946 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000947 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000948 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000949 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000950 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000951 }
952
Kevin Qin110db6f2014-07-18 07:03:22 +0000953 // Handle CPU name is 'native'.
954 if (CPU == "native")
955 return llvm::sys::getHostCPUName();
956 else if (CPU.size())
957 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000958
James Molloy9b1586b2014-04-17 12:51:17 +0000959 // Make sure we pick "cyclone" if -arch is used.
960 // FIXME: Should this be picked by checking the target triple instead?
961 if (Args.getLastArg(options::OPT_arch))
962 return "cyclone";
963
964 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000965}
966
Tim Northover573cbee2014-05-24 12:52:07 +0000967void Clang::AddAArch64TargetArgs(const ArgList &Args,
968 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000969 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
970 llvm::Triple Triple(TripleStr);
971
972 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
973 Args.hasArg(options::OPT_mkernel) ||
974 Args.hasArg(options::OPT_fapple_kext))
975 CmdArgs.push_back("-disable-red-zone");
976
977 if (!Args.hasFlag(options::OPT_mimplicit_float,
978 options::OPT_mno_implicit_float, true))
979 CmdArgs.push_back("-no-implicit-float");
980
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000982 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
983 ABIName = A->getValue();
984 else if (Triple.isOSDarwin())
985 ABIName = "darwinpcs";
986 else
987 ABIName = "aapcs";
988
989 CmdArgs.push_back("-target-abi");
990 CmdArgs.push_back(ABIName);
991
Bradley Smith9ff64332014-10-13 10:16:06 +0000992 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
993 options::OPT_mno_fix_cortex_a53_835769)) {
994 CmdArgs.push_back("-backend-option");
995 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
996 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
997 else
998 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000999 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001000 // Enabled A53 errata (835769) workaround by default on android
1001 CmdArgs.push_back("-backend-option");
1002 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001003 }
1004
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001005 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001006 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1007 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001008 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001009 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-aarch64-global-merge=false");
1011 else
1012 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001013 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001014}
1015
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001016// Get CPU and ABI names. They are not independent
1017// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001018void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1019 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001020 const char *DefMips32CPU = "mips32r2";
1021 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001022
Daniel Sanders2bf13662014-07-10 14:40:57 +00001023 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1024 // default for mips64(el)?-img-linux-gnu.
1025 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1026 Triple.getEnvironment() == llvm::Triple::GNU) {
1027 DefMips32CPU = "mips32r6";
1028 DefMips64CPU = "mips64r6";
1029 }
Renato Golin7c542b42015-07-27 23:44:45 +00001030
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001031 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001032 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001033 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001034
Brad Smithba26f582015-01-06 02:53:17 +00001035 // MIPS3 is the default for mips64*-unknown-openbsd.
1036 if (Triple.getOS() == llvm::Triple::OpenBSD)
1037 DefMips64CPU = "mips3";
1038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001039 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001040 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001041
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001042 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001043 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 // Convert a GNU style Mips ABI name to the name
1045 // accepted by LLVM Mips backend.
1046 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001047 .Case("32", "o32")
1048 .Case("64", "n64")
1049 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001050 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001051
1052 // Setup default CPU and ABI names.
1053 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001054 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001055 default:
1056 llvm_unreachable("Unexpected triple arch name");
1057 case llvm::Triple::mips:
1058 case llvm::Triple::mipsel:
1059 CPUName = DefMips32CPU;
1060 break;
1061 case llvm::Triple::mips64:
1062 case llvm::Triple::mips64el:
1063 CPUName = DefMips64CPU;
1064 break;
1065 }
1066 }
1067
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001068 if (ABIName.empty()) {
1069 // Deduce ABI name from the target triple.
1070 if (Triple.getArch() == llvm::Triple::mips ||
1071 Triple.getArch() == llvm::Triple::mipsel)
1072 ABIName = "o32";
1073 else
1074 ABIName = "n64";
1075 }
1076
1077 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001078 // Deduce CPU name from ABI name.
1079 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001080 .Cases("o32", "eabi", DefMips32CPU)
1081 .Cases("n32", "n64", DefMips64CPU)
1082 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001083 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001084
1085 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001086}
1087
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001088// Convert ABI name to the GNU tools acceptable variant.
1089static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1090 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001091 .Case("o32", "32")
1092 .Case("n64", "64")
1093 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001094}
1095
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001096// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1097// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001098static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1099 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001100 if (Arg *A =
1101 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1102 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001103 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001104 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001105 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001106 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001108 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1109 .Case("soft", mips::FloatABI::Soft)
1110 .Case("hard", mips::FloatABI::Hard)
1111 .Default(mips::FloatABI::Invalid);
1112 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001113 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001114 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001115 }
1116 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
1119 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001120 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001121 // Assume "hard", because it's a default value used by gcc.
1122 // When we start to recognize specific target MIPS processors,
1123 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001124 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001125 }
1126
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001127 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1128 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001129}
1130
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001131static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001132 std::vector<const char *> &Features,
1133 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001134 StringRef FeatureName) {
1135 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001136 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001137 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001138 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001139 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001140 }
1141}
1142
Daniel Sanders379d44b2014-07-16 11:52:23 +00001143static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1144 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001145 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001146 StringRef CPUName;
1147 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001148 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001149 ABIName = getGnuCompatibleMipsABIName(ABIName);
1150
Daniel Sandersfeb61302014-08-08 15:47:17 +00001151 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1152 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001153
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001154 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1155 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001156 // FIXME: Note, this is a hack. We need to pass the selected float
1157 // mode to the MipsTargetInfoBase to define appropriate macros there.
1158 // Now it is the only method.
1159 Features.push_back("+soft-float");
1160 }
1161
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001162 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001163 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001164 if (Val == "2008") {
1165 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1166 Features.push_back("+nan2008");
1167 else {
1168 Features.push_back("-nan2008");
1169 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1170 }
1171 } else if (Val == "legacy") {
1172 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1173 Features.push_back("-nan2008");
1174 else {
1175 Features.push_back("+nan2008");
1176 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1177 }
1178 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001179 D.Diag(diag::err_drv_unsupported_option_argument)
1180 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001181 }
1182
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001183 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1184 options::OPT_mdouble_float, "single-float");
1185 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1186 "mips16");
1187 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1188 options::OPT_mno_micromips, "micromips");
1189 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1190 "dsp");
1191 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1192 "dspr2");
1193 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1194 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001195
1196 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1197 // pass -mfpxx
1198 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1199 options::OPT_mfp64)) {
1200 if (A->getOption().matches(options::OPT_mfp32))
1201 Features.push_back(Args.MakeArgString("-fp64"));
1202 else if (A->getOption().matches(options::OPT_mfpxx)) {
1203 Features.push_back(Args.MakeArgString("+fpxx"));
1204 Features.push_back(Args.MakeArgString("+nooddspreg"));
1205 } else
1206 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001207 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001208 Features.push_back(Args.MakeArgString("+fpxx"));
1209 Features.push_back(Args.MakeArgString("+nooddspreg"));
1210 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001211
Daniel Sanders28e5d392014-07-10 10:39:51 +00001212 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1213 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001214}
1215
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001216void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001217 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001218 const Driver &D = getToolChain().getDriver();
1219 StringRef CPUName;
1220 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001221 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001222 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001223
1224 CmdArgs.push_back("-target-abi");
1225 CmdArgs.push_back(ABIName.data());
1226
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001227 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1228 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001230 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001231 CmdArgs.push_back("-mfloat-abi");
1232 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001233 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001234 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001235 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001236 CmdArgs.push_back("-mfloat-abi");
1237 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001238 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001239
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001240 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1241 if (A->getOption().matches(options::OPT_mxgot)) {
1242 CmdArgs.push_back("-mllvm");
1243 CmdArgs.push_back("-mxgot");
1244 }
1245 }
1246
Simon Atanasyanc580b322013-05-11 06:33:44 +00001247 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1248 options::OPT_mno_ldc1_sdc1)) {
1249 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1250 CmdArgs.push_back("-mllvm");
1251 CmdArgs.push_back("-mno-ldc1-sdc1");
1252 }
1253 }
1254
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001255 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1256 options::OPT_mno_check_zero_division)) {
1257 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1258 CmdArgs.push_back("-mllvm");
1259 CmdArgs.push_back("-mno-check-zero-division");
1260 }
1261 }
1262
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001263 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001264 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001265 CmdArgs.push_back("-mllvm");
1266 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1267 A->claim();
1268 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001269}
1270
Hal Finkel8eb59282012-06-11 22:35:19 +00001271/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1272static std::string getPPCTargetCPU(const ArgList &Args) {
1273 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001274 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001275
1276 if (CPUName == "native") {
1277 std::string CPU = llvm::sys::getHostCPUName();
1278 if (!CPU.empty() && CPU != "generic")
1279 return CPU;
1280 else
1281 return "";
1282 }
1283
1284 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001285 .Case("common", "generic")
1286 .Case("440", "440")
1287 .Case("440fp", "440")
1288 .Case("450", "450")
1289 .Case("601", "601")
1290 .Case("602", "602")
1291 .Case("603", "603")
1292 .Case("603e", "603e")
1293 .Case("603ev", "603ev")
1294 .Case("604", "604")
1295 .Case("604e", "604e")
1296 .Case("620", "620")
1297 .Case("630", "pwr3")
1298 .Case("G3", "g3")
1299 .Case("7400", "7400")
1300 .Case("G4", "g4")
1301 .Case("7450", "7450")
1302 .Case("G4+", "g4+")
1303 .Case("750", "750")
1304 .Case("970", "970")
1305 .Case("G5", "g5")
1306 .Case("a2", "a2")
1307 .Case("a2q", "a2q")
1308 .Case("e500mc", "e500mc")
1309 .Case("e5500", "e5500")
1310 .Case("power3", "pwr3")
1311 .Case("power4", "pwr4")
1312 .Case("power5", "pwr5")
1313 .Case("power5x", "pwr5x")
1314 .Case("power6", "pwr6")
1315 .Case("power6x", "pwr6x")
1316 .Case("power7", "pwr7")
1317 .Case("power8", "pwr8")
1318 .Case("pwr3", "pwr3")
1319 .Case("pwr4", "pwr4")
1320 .Case("pwr5", "pwr5")
1321 .Case("pwr5x", "pwr5x")
1322 .Case("pwr6", "pwr6")
1323 .Case("pwr6x", "pwr6x")
1324 .Case("pwr7", "pwr7")
1325 .Case("pwr8", "pwr8")
1326 .Case("powerpc", "ppc")
1327 .Case("powerpc64", "ppc64")
1328 .Case("powerpc64le", "ppc64le")
1329 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001330 }
1331
1332 return "";
1333}
1334
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001335static void getPPCTargetFeatures(const ArgList &Args,
1336 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001337 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1338 StringRef Name = A->getOption().getName();
1339 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001340
1341 // Skip over "-m".
1342 assert(Name.startswith("m") && "Invalid feature name.");
1343 Name = Name.substr(1);
1344
1345 bool IsNegative = Name.startswith("no-");
1346 if (IsNegative)
1347 Name = Name.substr(3);
1348
1349 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1350 // pass the correct option to the backend while calling the frontend
1351 // option the same.
1352 // TODO: Change the LLVM backend option maybe?
1353 if (Name == "mfcrf")
1354 Name = "mfocrf";
1355
1356 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1357 }
1358
1359 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001360 AddTargetFeature(Args, Features, options::OPT_faltivec,
1361 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001362}
1363
Ulrich Weigand8afad612014-07-28 13:17:52 +00001364void Clang::AddPPCTargetArgs(const ArgList &Args,
1365 ArgStringList &CmdArgs) const {
1366 // Select the ABI to use.
1367 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001368 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001369 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001370 case llvm::Triple::ppc64: {
1371 // When targeting a processor that supports QPX, or if QPX is
1372 // specifically enabled, default to using the ABI that supports QPX (so
1373 // long as it is not specifically disabled).
1374 bool HasQPX = false;
1375 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1376 HasQPX = A->getValue() == StringRef("a2q");
1377 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1378 if (HasQPX) {
1379 ABIName = "elfv1-qpx";
1380 break;
1381 }
1382
Ulrich Weigand8afad612014-07-28 13:17:52 +00001383 ABIName = "elfv1";
1384 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001385 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001386 case llvm::Triple::ppc64le:
1387 ABIName = "elfv2";
1388 break;
1389 default:
1390 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001391 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001392
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001393 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1394 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1395 // the option if given as we don't have backend support for any targets
1396 // that don't use the altivec abi.
1397 if (StringRef(A->getValue()) != "altivec")
1398 ABIName = A->getValue();
1399
Ulrich Weigand8afad612014-07-28 13:17:52 +00001400 if (ABIName) {
1401 CmdArgs.push_back("-target-abi");
1402 CmdArgs.push_back(ABIName);
1403 }
1404}
1405
1406bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1407 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1408 return A && (A->getValue() == StringRef(Value));
1409}
1410
Tom Stellard6674c702013-04-01 20:56:53 +00001411/// Get the (LLVM) name of the R600 gpu we are targeting.
1412static std::string getR600TargetGPU(const ArgList &Args) {
1413 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001414 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001415 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001416 .Cases("rv630", "rv635", "r600")
1417 .Cases("rv610", "rv620", "rs780", "rs880")
1418 .Case("rv740", "rv770")
1419 .Case("palm", "cedar")
1420 .Cases("sumo", "sumo2", "sumo")
1421 .Case("hemlock", "cypress")
1422 .Case("aruba", "cayman")
1423 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001424 }
1425 return "";
1426}
1427
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001428void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001429 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001431 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001432
James Y Knightb2406522015-06-15 20:51:24 +00001433 bool SoftFloatABI = false;
1434 if (Arg *A =
1435 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001436 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001437 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001438 }
1439
James Y Knightb2406522015-06-15 20:51:24 +00001440 // Only the hard-float ABI on Sparc is standardized, and it is the
1441 // default. GCC also supports a nonstandard soft-float ABI mode, and
1442 // perhaps LLVM should implement that, too. However, since llvm
1443 // currently does not support Sparc soft-float, at all, display an
1444 // error if it's requested.
1445 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001446 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1447 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001448 }
1449}
1450
Richard Sandiford4652d892013-07-19 16:51:51 +00001451static const char *getSystemZTargetCPU(const ArgList &Args) {
1452 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1453 return A->getValue();
1454 return "z10";
1455}
1456
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001457static void getSystemZTargetFeatures(const ArgList &Args,
1458 std::vector<const char *> &Features) {
1459 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001460 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001461 if (A->getOption().matches(options::OPT_mhtm))
1462 Features.push_back("+transactional-execution");
1463 else
1464 Features.push_back("-transactional-execution");
1465 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001466 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001467 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001468 if (A->getOption().matches(options::OPT_mvx))
1469 Features.push_back("+vector");
1470 else
1471 Features.push_back("-vector");
1472 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001473}
1474
Chandler Carruth953fb082013-01-13 11:46:33 +00001475static const char *getX86TargetCPU(const ArgList &Args,
1476 const llvm::Triple &Triple) {
1477 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001478 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001479 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001480 return "core-avx2";
1481
Chandler Carruth953fb082013-01-13 11:46:33 +00001482 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001483 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001484
1485 // FIXME: Reject attempts to use -march=native unless the target matches
1486 // the host.
1487 //
1488 // FIXME: We should also incorporate the detected target features for use
1489 // with -native.
1490 std::string CPU = llvm::sys::getHostCPUName();
1491 if (!CPU.empty() && CPU != "generic")
1492 return Args.MakeArgString(CPU);
1493 }
1494
Reid Kleckner3123eff2015-06-30 16:32:04 +00001495 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1496 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1497 StringRef Arch = A->getValue();
1498 const char *CPU;
1499 if (Triple.getArch() == llvm::Triple::x86) {
1500 CPU = llvm::StringSwitch<const char *>(Arch)
1501 .Case("IA32", "i386")
1502 .Case("SSE", "pentium3")
1503 .Case("SSE2", "pentium4")
1504 .Case("AVX", "sandybridge")
1505 .Case("AVX2", "haswell")
1506 .Default(nullptr);
1507 } else {
1508 CPU = llvm::StringSwitch<const char *>(Arch)
1509 .Case("AVX", "sandybridge")
1510 .Case("AVX2", "haswell")
1511 .Default(nullptr);
1512 }
1513 if (CPU)
1514 return CPU;
1515 }
1516
Chandler Carruth953fb082013-01-13 11:46:33 +00001517 // Select the default CPU if none was given (or detection failed).
1518
1519 if (Triple.getArch() != llvm::Triple::x86_64 &&
1520 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001521 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001522
1523 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1524
1525 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001526 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001527 if (Triple.getArchName() == "x86_64h")
1528 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001529 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001530 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001531
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001532 // Set up default CPU name for PS4 compilers.
1533 if (Triple.isPS4CPU())
1534 return "btver2";
1535
Alexey Bataev286d1b92014-01-31 04:07:13 +00001536 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001537 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001538 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001539
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001540 // Everything else goes to x86-64 in 64-bit mode.
1541 if (Is64Bit)
1542 return "x86-64";
1543
1544 switch (Triple.getOS()) {
1545 case llvm::Triple::FreeBSD:
1546 case llvm::Triple::NetBSD:
1547 case llvm::Triple::OpenBSD:
1548 return "i486";
1549 case llvm::Triple::Haiku:
1550 return "i586";
1551 case llvm::Triple::Bitrig:
1552 return "i686";
1553 default:
1554 // Fallback to p4.
1555 return "pentium4";
1556 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001557}
1558
Dan Gohmanc2853072015-09-03 22:51:53 +00001559/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1560static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1561 // If we have -mcpu=, use that.
1562 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1563 StringRef CPU = A->getValue();
1564
1565#ifdef __wasm__
1566 // Handle "native" by examining the host. "native" isn't meaningful when
1567 // cross compiling, so only support this when the host is also WebAssembly.
1568 if (CPU == "native")
1569 return llvm::sys::getHostCPUName();
1570#endif
1571
1572 return CPU;
1573 }
1574
1575 return "generic";
1576}
1577
Renato Golin7c542b42015-07-27 23:44:45 +00001578static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1579 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001580 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001581 default:
1582 return "";
1583
Amara Emerson703da2e2013-10-31 09:32:33 +00001584 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001585 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001586 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001587
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001588 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001589 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001590 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001591 case llvm::Triple::thumbeb: {
1592 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001593 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001594 return arm::getARMTargetCPU(MCPU, MArch, T);
1595 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001596 case llvm::Triple::mips:
1597 case llvm::Triple::mipsel:
1598 case llvm::Triple::mips64:
1599 case llvm::Triple::mips64el: {
1600 StringRef CPUName;
1601 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001602 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001603 return CPUName;
1604 }
1605
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001606 case llvm::Triple::nvptx:
1607 case llvm::Triple::nvptx64:
1608 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1609 return A->getValue();
1610 return "";
1611
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001612 case llvm::Triple::ppc:
1613 case llvm::Triple::ppc64:
1614 case llvm::Triple::ppc64le: {
1615 std::string TargetCPUName = getPPCTargetCPU(Args);
1616 // LLVM may default to generating code for the native CPU,
1617 // but, like gcc, we default to a more generic option for
1618 // each architecture. (except on Darwin)
1619 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1620 if (T.getArch() == llvm::Triple::ppc64)
1621 TargetCPUName = "ppc64";
1622 else if (T.getArch() == llvm::Triple::ppc64le)
1623 TargetCPUName = "ppc64le";
1624 else
1625 TargetCPUName = "ppc";
1626 }
1627 return TargetCPUName;
1628 }
1629
1630 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001631 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001632 case llvm::Triple::sparcv9:
1633 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001634 return A->getValue();
1635 return "";
1636
1637 case llvm::Triple::x86:
1638 case llvm::Triple::x86_64:
1639 return getX86TargetCPU(Args, T);
1640
1641 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001642 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001643
1644 case llvm::Triple::systemz:
1645 return getSystemZTargetCPU(Args);
1646
1647 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001648 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001649 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001650
1651 case llvm::Triple::wasm32:
1652 case llvm::Triple::wasm64:
1653 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001654 }
1655}
1656
Alp Tokerce365ca2013-12-02 12:43:03 +00001657static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001658 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001659 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1660 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1661 // forward.
1662 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001663 std::string Plugin =
1664 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001665 CmdArgs.push_back(Args.MakeArgString(Plugin));
1666
1667 // Try to pass driver level flags relevant to LTO code generation down to
1668 // the plugin.
1669
1670 // Handle flags for selecting CPU variants.
1671 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1672 if (!CPU.empty())
1673 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001674
1675 if (IsThinLTO) CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001676}
1677
Sanjay Patel2987c292015-06-11 14:53:41 +00001678/// This is a helper function for validating the optional refinement step
1679/// parameter in reciprocal argument strings. Return false if there is an error
1680/// parsing the refinement step. Otherwise, return true and set the Position
1681/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001682static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001683 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001684 const char RefinementStepToken = ':';
1685 Position = In.find(RefinementStepToken);
1686 if (Position != StringRef::npos) {
1687 StringRef Option = A.getOption().getName();
1688 StringRef RefStep = In.substr(Position + 1);
1689 // Allow exactly one numeric character for the additional refinement
1690 // step parameter. This is reasonable for all currently-supported
1691 // operations and architectures because we would expect that a larger value
1692 // of refinement steps would cause the estimate "optimization" to
1693 // under-perform the native operation. Also, if the estimate does not
1694 // converge quickly, it probably will not ever converge, so further
1695 // refinement steps will not produce a better answer.
1696 if (RefStep.size() != 1) {
1697 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1698 return false;
1699 }
1700 char RefStepChar = RefStep[0];
1701 if (RefStepChar < '0' || RefStepChar > '9') {
1702 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1703 return false;
1704 }
1705 }
1706 return true;
1707}
1708
1709/// The -mrecip flag requires processing of many optional parameters.
1710static void ParseMRecip(const Driver &D, const ArgList &Args,
1711 ArgStringList &OutStrings) {
1712 StringRef DisabledPrefixIn = "!";
1713 StringRef DisabledPrefixOut = "!";
1714 StringRef EnabledPrefixOut = "";
1715 StringRef Out = "-mrecip=";
1716
1717 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1718 if (!A)
1719 return;
1720
1721 unsigned NumOptions = A->getNumValues();
1722 if (NumOptions == 0) {
1723 // No option is the same as "all".
1724 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1725 return;
1726 }
1727
1728 // Pass through "all", "none", or "default" with an optional refinement step.
1729 if (NumOptions == 1) {
1730 StringRef Val = A->getValue(0);
1731 size_t RefStepLoc;
1732 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1733 return;
1734 StringRef ValBase = Val.slice(0, RefStepLoc);
1735 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1736 OutStrings.push_back(Args.MakeArgString(Out + Val));
1737 return;
1738 }
1739 }
1740
1741 // Each reciprocal type may be enabled or disabled individually.
1742 // Check each input value for validity, concatenate them all back together,
1743 // and pass through.
1744
1745 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001746 OptionStrings.insert(std::make_pair("divd", false));
1747 OptionStrings.insert(std::make_pair("divf", false));
1748 OptionStrings.insert(std::make_pair("vec-divd", false));
1749 OptionStrings.insert(std::make_pair("vec-divf", false));
1750 OptionStrings.insert(std::make_pair("sqrtd", false));
1751 OptionStrings.insert(std::make_pair("sqrtf", false));
1752 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1753 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001754
1755 for (unsigned i = 0; i != NumOptions; ++i) {
1756 StringRef Val = A->getValue(i);
1757
1758 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1759 // Ignore the disablement token for string matching.
1760 if (IsDisabled)
1761 Val = Val.substr(1);
1762
1763 size_t RefStep;
1764 if (!getRefinementStep(Val, D, *A, RefStep))
1765 return;
1766
1767 StringRef ValBase = Val.slice(0, RefStep);
1768 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1769 if (OptionIter == OptionStrings.end()) {
1770 // Try again specifying float suffix.
1771 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1772 if (OptionIter == OptionStrings.end()) {
1773 // The input name did not match any known option string.
1774 D.Diag(diag::err_drv_unknown_argument) << Val;
1775 return;
1776 }
1777 // The option was specified without a float or double suffix.
1778 // Make sure that the double entry was not already specified.
1779 // The float entry will be checked below.
1780 if (OptionStrings[ValBase.str() + 'd']) {
1781 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1782 return;
1783 }
1784 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001785
Sanjay Patel2987c292015-06-11 14:53:41 +00001786 if (OptionIter->second == true) {
1787 // Duplicate option specified.
1788 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1789 return;
1790 }
1791
1792 // Mark the matched option as found. Do not allow duplicate specifiers.
1793 OptionIter->second = true;
1794
1795 // If the precision was not specified, also mark the double entry as found.
1796 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1797 OptionStrings[ValBase.str() + 'd'] = true;
1798
1799 // Build the output string.
1800 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1801 Out = Args.MakeArgString(Out + Prefix + Val);
1802 if (i != NumOptions - 1)
1803 Out = Args.MakeArgString(Out + ",");
1804 }
1805
1806 OutStrings.push_back(Args.MakeArgString(Out));
1807}
1808
Eric Christopherc54920a2015-03-23 19:26:05 +00001809static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001810 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001811 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001812 // If -march=native, autodetect the feature list.
1813 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1814 if (StringRef(A->getValue()) == "native") {
1815 llvm::StringMap<bool> HostFeatures;
1816 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1817 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001818 Features.push_back(
1819 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001820 }
1821 }
1822
Jim Grosbach82eee262013-11-16 00:53:35 +00001823 if (Triple.getArchName() == "x86_64h") {
1824 // x86_64h implies quite a few of the more modern subtarget features
1825 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1826 Features.push_back("-rdrnd");
1827 Features.push_back("-aes");
1828 Features.push_back("-pclmul");
1829 Features.push_back("-rtm");
1830 Features.push_back("-hle");
1831 Features.push_back("-fsgsbase");
1832 }
1833
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001834 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001835 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001836 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001837 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001838 Features.push_back("+sse4.2");
1839 Features.push_back("+popcnt");
1840 } else
1841 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001842 }
1843
Eric Christopherc54920a2015-03-23 19:26:05 +00001844 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001845 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1846 StringRef Arch = A->getValue();
1847 bool ArchUsed = false;
1848 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001849 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001850 if (Arch == "AVX" || Arch == "AVX2") {
1851 ArchUsed = true;
1852 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1853 }
1854 }
1855 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001856 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001857 if (Arch == "IA32") {
1858 ArchUsed = true;
1859 } else if (Arch == "SSE" || Arch == "SSE2") {
1860 ArchUsed = true;
1861 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1862 }
1863 }
1864 if (!ArchUsed)
1865 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1866 }
1867
Jim Grosbach82eee262013-11-16 00:53:35 +00001868 // Now add any that the user explicitly requested on the command line,
1869 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001870 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1871 StringRef Name = A->getOption().getName();
1872 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001873
1874 // Skip over "-m".
1875 assert(Name.startswith("m") && "Invalid feature name.");
1876 Name = Name.substr(1);
1877
1878 bool IsNegative = Name.startswith("no-");
1879 if (IsNegative)
1880 Name = Name.substr(3);
1881
1882 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1883 }
1884}
1885
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001886void Clang::AddX86TargetArgs(const ArgList &Args,
1887 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001888 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001889 Args.hasArg(options::OPT_mkernel) ||
1890 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001891 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001892
Bob Wilson2616e2e2013-02-10 16:01:41 +00001893 // Default to avoid implicit floating-point for kernel/kext code, but allow
1894 // that to be overridden with -mno-soft-float.
1895 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1896 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001897 if (Arg *A = Args.getLastArg(
1898 options::OPT_msoft_float, options::OPT_mno_soft_float,
1899 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001900 const Option &O = A->getOption();
1901 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1902 O.matches(options::OPT_msoft_float));
1903 }
1904 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001905 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001906
1907 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1908 StringRef Value = A->getValue();
1909 if (Value == "intel" || Value == "att") {
1910 CmdArgs.push_back("-mllvm");
1911 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1912 } else {
1913 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1914 << A->getOption().getName() << Value;
1915 }
1916 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001917}
1918
Tony Linthicum76329bf2011-12-12 21:14:55 +00001919void Clang::AddHexagonTargetArgs(const ArgList &Args,
1920 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001921 CmdArgs.push_back("-mqdsp6-compat");
1922 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001923
Douglas Katzman54366072015-07-27 16:53:08 +00001924 if (const char *v =
1925 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001926 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001927 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001929 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001930 }
1931
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001932 if (!Args.hasArg(options::OPT_fno_short_enums))
1933 CmdArgs.push_back("-fshort-enums");
1934 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001935 CmdArgs.push_back("-mllvm");
1936 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001937 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001938 CmdArgs.push_back("-mllvm");
1939 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001940}
1941
Kevin Qin110db6f2014-07-18 07:03:22 +00001942// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001943static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001944 std::vector<const char *> &Features) {
1945 SmallVector<StringRef, 8> Split;
1946 text.split(Split, StringRef("+"), -1, false);
1947
Benjamin Kramer72e64312015-09-24 14:48:49 +00001948 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001949 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001950 .Case("fp", "+fp-armv8")
1951 .Case("simd", "+neon")
1952 .Case("crc", "+crc")
1953 .Case("crypto", "+crypto")
1954 .Case("nofp", "-fp-armv8")
1955 .Case("nosimd", "-neon")
1956 .Case("nocrc", "-crc")
1957 .Case("nocrypto", "-crypto")
1958 .Default(nullptr);
1959 if (result)
1960 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001961 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001962 D.Diag(diag::err_drv_no_neon_modifier);
1963 else
1964 return false;
1965 }
1966 return true;
1967}
1968
1969// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1970// decode CPU and feature.
1971static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1972 std::vector<const char *> &Features) {
1973 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1974 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001975 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1976 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001977 Features.push_back("+neon");
1978 Features.push_back("+crc");
1979 Features.push_back("+crypto");
1980 } else if (CPU == "generic") {
1981 Features.push_back("+neon");
1982 } else {
1983 return false;
1984 }
1985
1986 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1987 return false;
1988
1989 return true;
1990}
1991
1992static bool
1993getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1994 const ArgList &Args,
1995 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001996 std::string MarchLowerCase = March.lower();
1997 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001998
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001999 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002000 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002001 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002002 Features.push_back("+v8.1a");
2003 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002004 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002005 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002006
2007 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2008 return false;
2009
2010 return true;
2011}
2012
2013static bool
2014getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2015 const ArgList &Args,
2016 std::vector<const char *> &Features) {
2017 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002018 std::string McpuLowerCase = Mcpu.lower();
2019 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 return false;
2021
2022 return true;
2023}
2024
2025static bool
2026getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2027 const ArgList &Args,
2028 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002029 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002030 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002031 if (MtuneLowerCase == "native")
2032 MtuneLowerCase = llvm::sys::getHostCPUName();
2033 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002034 Features.push_back("+zcm");
2035 Features.push_back("+zcz");
2036 }
2037 return true;
2038}
2039
2040static bool
2041getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2042 const ArgList &Args,
2043 std::vector<const char *> &Features) {
2044 StringRef CPU;
2045 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002046 std::string McpuLowerCase = Mcpu.lower();
2047 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002048 return false;
2049
2050 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2051}
2052
Akira Hatanaka92500472015-07-27 19:29:04 +00002053static void getAArch64TargetFeatures(const Driver &D,
2054 const llvm::Triple &Triple,
2055 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002056 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002057 Arg *A;
2058 bool success = true;
2059 // Enable NEON by default.
2060 Features.push_back("+neon");
2061 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2062 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2063 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2064 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002065 else if (Args.hasArg(options::OPT_arch))
2066 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2067 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002068
2069 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2070 success =
2071 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2072 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2073 success =
2074 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002075 else if (Args.hasArg(options::OPT_arch))
2076 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2077 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002078
2079 if (!success)
2080 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002081
2082 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2083 Features.push_back("-fp-armv8");
2084 Features.push_back("-crypto");
2085 Features.push_back("-neon");
2086 }
Bradley Smith418c5932014-05-02 15:17:51 +00002087
2088 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002089 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002090 if (A->getOption().matches(options::OPT_mcrc))
2091 Features.push_back("+crc");
2092 else
2093 Features.push_back("-crc");
2094 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002095
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002096 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2097 options::OPT_munaligned_access))
2098 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2099 Features.push_back("+strict-align");
2100
Akira Hatanaka92500472015-07-27 19:29:04 +00002101 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002102 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002103}
2104
Dan Gohmanc2853072015-09-03 22:51:53 +00002105static void getWebAssemblyTargetFeatures(const ArgList &Args,
2106 std::vector<const char *> &Features) {
2107 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2108 StringRef Name = A->getOption().getName();
2109 A->claim();
2110
2111 // Skip over "-m".
2112 assert(Name.startswith("m") && "Invalid feature name.");
2113 Name = Name.substr(1);
2114
2115 bool IsNegative = Name.startswith("no-");
2116 if (IsNegative)
2117 Name = Name.substr(3);
2118
2119 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2120 }
2121}
2122
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002123static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002124 const ArgList &Args, ArgStringList &CmdArgs,
2125 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002126 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002127 std::vector<const char *> Features;
2128 switch (Triple.getArch()) {
2129 default:
2130 break;
2131 case llvm::Triple::mips:
2132 case llvm::Triple::mipsel:
2133 case llvm::Triple::mips64:
2134 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002135 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 break;
2137
2138 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002139 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002140 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002141 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002142 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002143 break;
2144
2145 case llvm::Triple::ppc:
2146 case llvm::Triple::ppc64:
2147 case llvm::Triple::ppc64le:
2148 getPPCTargetFeatures(Args, Features);
2149 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002150 case llvm::Triple::systemz:
2151 getSystemZTargetFeatures(Args, Features);
2152 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002153 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002154 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002155 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002156 break;
2157 case llvm::Triple::x86:
2158 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002159 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002160 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002161 case llvm::Triple::wasm32:
2162 case llvm::Triple::wasm64:
2163 getWebAssemblyTargetFeatures(Args, Features);
2164 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002165 }
Rafael Espindola43964802013-08-21 17:34:32 +00002166
2167 // Find the last of each feature.
2168 llvm::StringMap<unsigned> LastOpt;
2169 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2170 const char *Name = Features[I];
2171 assert(Name[0] == '-' || Name[0] == '+');
2172 LastOpt[Name + 1] = I;
2173 }
2174
2175 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2176 // If this feature was overridden, ignore it.
2177 const char *Name = Features[I];
2178 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2179 assert(LastI != LastOpt.end());
2180 unsigned Last = LastI->second;
2181 if (Last != I)
2182 continue;
2183
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002184 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002185 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002186 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002187}
2188
David Majnemerae394812014-12-09 00:12:30 +00002189static bool
2190shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2191 const llvm::Triple &Triple) {
2192 // We use the zero-cost exception tables for Objective-C if the non-fragile
2193 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2194 // later.
2195 if (runtime.isNonFragile())
2196 return true;
2197
2198 if (!Triple.isMacOSX())
2199 return false;
2200
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002201 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002202 (Triple.getArch() == llvm::Triple::x86_64 ||
2203 Triple.getArch() == llvm::Triple::arm));
2204}
2205
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002206/// Adds exception related arguments to the driver command arguments. There's a
2207/// master flag, -fexceptions and also language specific flags to enable/disable
2208/// C++ and Objective-C exceptions. This makes it possible to for example
2209/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002210static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002211 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002212 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002213 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002214 const Driver &D = TC.getDriver();
2215 const llvm::Triple &Triple = TC.getTriple();
2216
Chad Rosier4fab82c2012-03-26 22:04:46 +00002217 if (KernelOrKext) {
2218 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2219 // arguments now to avoid warnings about unused arguments.
2220 Args.ClaimAllArgs(options::OPT_fexceptions);
2221 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2222 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2223 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2224 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2225 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002226 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002227 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002228
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002229 // See if the user explicitly enabled exceptions.
2230 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2231 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002232
David Majnemerae394812014-12-09 00:12:30 +00002233 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2234 // is not necessarily sensible, but follows GCC.
2235 if (types::isObjC(InputType) &&
2236 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002237 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002238 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002239
David Majnemerae394812014-12-09 00:12:30 +00002240 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002241 }
2242
2243 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002244 // Disable C++ EH by default on XCore, PS4, and MSVC.
2245 // FIXME: Remove MSVC from this list once things work.
2246 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2247 !Triple.isPS4CPU() &&
2248 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002249 Arg *ExceptionArg = Args.getLastArg(
2250 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2251 options::OPT_fexceptions, options::OPT_fno_exceptions);
2252 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002253 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002254 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2255 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002256
2257 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002258 if (Triple.isPS4CPU()) {
2259 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2260 assert(ExceptionArg &&
2261 "On the PS4 exceptions should only be enabled if passing "
2262 "an argument");
2263 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2264 const Arg *RTTIArg = TC.getRTTIArg();
2265 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2266 D.Diag(diag::err_drv_argument_not_allowed_with)
2267 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2268 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2269 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2270 } else
2271 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2272
Anders Carlssone96ab552011-02-28 02:27:16 +00002273 CmdArgs.push_back("-fcxx-exceptions");
2274
David Majnemer8de68642014-12-05 08:11:58 +00002275 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002276 }
2277 }
2278
David Majnemer8de68642014-12-05 08:11:58 +00002279 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002280 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002281}
2282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002283static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002284 bool Default = true;
2285 if (TC.getTriple().isOSDarwin()) {
2286 // The native darwin assembler doesn't support the linker_option directives,
2287 // so we disable them if we think the .s file will be passed to it.
2288 Default = TC.useIntegratedAs();
2289 }
2290 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2291 Default);
2292}
2293
Ted Kremenek62093662013-03-12 17:02:12 +00002294static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2295 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002296 bool UseDwarfDirectory =
2297 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2298 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002299 return !UseDwarfDirectory;
2300}
2301
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002302/// \brief Check whether the given input tree contains any compilation actions.
2303static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002304 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002305 return true;
2306
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002307 for (const auto &Act : *A)
2308 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002309 return true;
2310
2311 return false;
2312}
2313
2314/// \brief Check if -relax-all should be passed to the internal assembler.
2315/// This is done by default when compiling non-assembler source with -O0.
2316static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2317 bool RelaxDefault = true;
2318
2319 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2320 RelaxDefault = A->getOption().matches(options::OPT_O0);
2321
2322 if (RelaxDefault) {
2323 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002324 for (const auto &Act : C.getActions()) {
2325 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002326 RelaxDefault = true;
2327 break;
2328 }
2329 }
2330 }
2331
2332 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002333 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002334}
2335
Douglas Katzman3459ce22015-10-08 04:24:12 +00002336// Extract the integer N from a string spelled "-dwarf-N", returning 0
2337// on mismatch. The StringRef input (rather than an Arg) allows
2338// for use by the "-Xassembler" option parser.
2339static unsigned DwarfVersionNum(StringRef ArgValue) {
2340 return llvm::StringSwitch<unsigned>(ArgValue)
2341 .Case("-gdwarf-2", 2)
2342 .Case("-gdwarf-3", 3)
2343 .Case("-gdwarf-4", 4)
2344 .Default(0);
2345}
2346
2347static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2348 CodeGenOptions::DebugInfoKind DebugInfoKind,
2349 unsigned DwarfVersion) {
2350 switch (DebugInfoKind) {
2351 case CodeGenOptions::DebugLineTablesOnly:
2352 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2353 break;
2354 case CodeGenOptions::LimitedDebugInfo:
2355 CmdArgs.push_back("-debug-info-kind=limited");
2356 break;
2357 case CodeGenOptions::FullDebugInfo:
2358 CmdArgs.push_back("-debug-info-kind=standalone");
2359 break;
2360 default:
2361 break;
2362 }
2363 if (DwarfVersion > 0)
2364 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002365 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002366}
2367
David Blaikie9260ed62013-07-25 21:19:01 +00002368static void CollectArgsForIntegratedAssembler(Compilation &C,
2369 const ArgList &Args,
2370 ArgStringList &CmdArgs,
2371 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002372 if (UseRelaxAll(C, Args))
2373 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002375 // When passing -I arguments to the assembler we sometimes need to
2376 // unconditionally take the next argument. For example, when parsing
2377 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2378 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2379 // arg after parsing the '-I' arg.
2380 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002381
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002382 // When using an integrated assembler, translate -Wa, and -Xassembler
2383 // options.
2384 bool CompressDebugSections = false;
2385 for (const Arg *A :
2386 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2387 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002388
Benjamin Kramer72e64312015-09-24 14:48:49 +00002389 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002390 if (TakeNextArg) {
2391 CmdArgs.push_back(Value.data());
2392 TakeNextArg = false;
2393 continue;
2394 }
David Blaikie9260ed62013-07-25 21:19:01 +00002395
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002396 switch (C.getDefaultToolChain().getArch()) {
2397 default:
2398 break;
2399 case llvm::Triple::mips:
2400 case llvm::Triple::mipsel:
2401 case llvm::Triple::mips64:
2402 case llvm::Triple::mips64el:
2403 if (Value == "--trap") {
2404 CmdArgs.push_back("-target-feature");
2405 CmdArgs.push_back("+use-tcc-in-div");
2406 continue;
2407 }
2408 if (Value == "--break") {
2409 CmdArgs.push_back("-target-feature");
2410 CmdArgs.push_back("-use-tcc-in-div");
2411 continue;
2412 }
2413 if (Value.startswith("-msoft-float")) {
2414 CmdArgs.push_back("-target-feature");
2415 CmdArgs.push_back("+soft-float");
2416 continue;
2417 }
2418 if (Value.startswith("-mhard-float")) {
2419 CmdArgs.push_back("-target-feature");
2420 CmdArgs.push_back("-soft-float");
2421 continue;
2422 }
2423 break;
2424 }
2425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002426 if (Value == "-force_cpusubtype_ALL") {
2427 // Do nothing, this is the default and we don't support anything else.
2428 } else if (Value == "-L") {
2429 CmdArgs.push_back("-msave-temp-labels");
2430 } else if (Value == "--fatal-warnings") {
2431 CmdArgs.push_back("-massembler-fatal-warnings");
2432 } else if (Value == "--noexecstack") {
2433 CmdArgs.push_back("-mnoexecstack");
2434 } else if (Value == "-compress-debug-sections" ||
2435 Value == "--compress-debug-sections") {
2436 CompressDebugSections = true;
2437 } else if (Value == "-nocompress-debug-sections" ||
2438 Value == "--nocompress-debug-sections") {
2439 CompressDebugSections = false;
2440 } else if (Value.startswith("-I")) {
2441 CmdArgs.push_back(Value.data());
2442 // We need to consume the next argument if the current arg is a plain
2443 // -I. The next arg will be the include directory.
2444 if (Value == "-I")
2445 TakeNextArg = true;
2446 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002447 // "-gdwarf-N" options are not cc1as options.
2448 unsigned DwarfVersion = DwarfVersionNum(Value);
2449 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2450 CmdArgs.push_back(Value.data());
2451 } else {
2452 RenderDebugEnablingArgs(
2453 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2454 }
Renato Golin7c542b42015-07-27 23:44:45 +00002455 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2456 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2457 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002458 } else {
2459 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002460 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002461 }
2462 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002463 }
2464 if (CompressDebugSections) {
2465 if (llvm::zlib::isAvailable())
2466 CmdArgs.push_back("-compress-debug-sections");
2467 else
2468 D.Diag(diag::warn_debug_compression_unavailable);
2469 }
David Blaikie9260ed62013-07-25 21:19:01 +00002470}
2471
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002472// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002473// FIXME: Make sure we can also emit shared objects if they're requested
2474// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002475static void addClangRT(const ToolChain &TC, const ArgList &Args,
2476 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002477 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002478}
2479
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002480namespace {
2481enum OpenMPRuntimeKind {
2482 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2483 /// without knowing what runtime to target.
2484 OMPRT_Unknown,
2485
2486 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2487 /// the default for Clang.
2488 OMPRT_OMP,
2489
2490 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2491 /// this runtime but can swallow the pragmas, and find and link against the
2492 /// runtime library itself.
2493 OMPRT_GOMP,
2494
Chandler Carruthc6625c62015-05-28 21:10:31 +00002495 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002496 /// OpenMP runtime. We support this mode for users with existing dependencies
2497 /// on this runtime library name.
2498 OMPRT_IOMP5
2499};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002500}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002501
2502/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002503static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2504 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002505 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2506
2507 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2508 if (A)
2509 RuntimeName = A->getValue();
2510
2511 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002512 .Case("libomp", OMPRT_OMP)
2513 .Case("libgomp", OMPRT_GOMP)
2514 .Case("libiomp5", OMPRT_IOMP5)
2515 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002516
2517 if (RT == OMPRT_Unknown) {
2518 if (A)
2519 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002520 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002521 else
2522 // FIXME: We could use a nicer diagnostic here.
2523 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2524 }
2525
2526 return RT;
2527}
2528
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002529static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2530 const ArgList &Args) {
2531 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2532 options::OPT_fno_openmp, false))
2533 return;
2534
2535 switch (getOpenMPRuntime(TC, Args)) {
2536 case OMPRT_OMP:
2537 CmdArgs.push_back("-lomp");
2538 break;
2539 case OMPRT_GOMP:
2540 CmdArgs.push_back("-lgomp");
2541 break;
2542 case OMPRT_IOMP5:
2543 CmdArgs.push_back("-liomp5");
2544 break;
2545 case OMPRT_Unknown:
2546 // Already diagnosed.
2547 break;
2548 }
2549}
2550
Alexey Samsonov52550342014-09-15 19:58:40 +00002551static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2552 ArgStringList &CmdArgs, StringRef Sanitizer,
2553 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002554 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002555 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002556 if (!IsShared) CmdArgs.push_back("-whole-archive");
2557 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2558 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002559}
2560
Alexey Samsonov52550342014-09-15 19:58:40 +00002561// Tries to use a file with the list of dynamic symbols that need to be exported
2562// from the runtime library. Returns true if the file was found.
2563static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2564 ArgStringList &CmdArgs,
2565 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002566 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002567 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2568 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002569 return true;
2570 }
2571 return false;
2572}
2573
2574static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2575 ArgStringList &CmdArgs) {
2576 // Force linking against the system libraries sanitizers depends on
2577 // (see PR15823 why this is necessary).
2578 CmdArgs.push_back("--no-as-needed");
2579 CmdArgs.push_back("-lpthread");
2580 CmdArgs.push_back("-lrt");
2581 CmdArgs.push_back("-lm");
2582 // There's no libdl on FreeBSD.
2583 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2584 CmdArgs.push_back("-ldl");
2585}
2586
2587static void
2588collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2589 SmallVectorImpl<StringRef> &SharedRuntimes,
2590 SmallVectorImpl<StringRef> &StaticRuntimes,
2591 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2592 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2593 // Collect shared runtimes.
2594 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2595 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002596 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002597
Alexey Samsonov52550342014-09-15 19:58:40 +00002598 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002599 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002600 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002601 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002602 }
2603 if (SanArgs.needsAsanRt()) {
2604 if (SanArgs.needsSharedAsanRt()) {
2605 HelperStaticRuntimes.push_back("asan-preinit");
2606 } else {
2607 StaticRuntimes.push_back("asan");
2608 if (SanArgs.linkCXXRuntimes())
2609 StaticRuntimes.push_back("asan_cxx");
2610 }
2611 }
2612 if (SanArgs.needsDfsanRt())
2613 StaticRuntimes.push_back("dfsan");
2614 if (SanArgs.needsLsanRt())
2615 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002616 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002617 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002618 if (SanArgs.linkCXXRuntimes())
2619 StaticRuntimes.push_back("msan_cxx");
2620 }
2621 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002622 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002623 if (SanArgs.linkCXXRuntimes())
2624 StaticRuntimes.push_back("tsan_cxx");
2625 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002626 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002627 StaticRuntimes.push_back("ubsan_standalone");
2628 if (SanArgs.linkCXXRuntimes())
2629 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002630 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002631 if (SanArgs.needsSafeStackRt())
2632 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002633}
2634
Alexey Samsonov52550342014-09-15 19:58:40 +00002635// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2636// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2637static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002638 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002639 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2640 HelperStaticRuntimes;
2641 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2642 HelperStaticRuntimes);
2643 for (auto RT : SharedRuntimes)
2644 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2645 for (auto RT : HelperStaticRuntimes)
2646 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2647 bool AddExportDynamic = false;
2648 for (auto RT : StaticRuntimes) {
2649 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2650 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2651 }
2652 // If there is a static runtime with no dynamic list, force all the symbols
2653 // to be dynamic to be sure we export sanitizer interface functions.
2654 if (AddExportDynamic)
2655 CmdArgs.push_back("-export-dynamic");
2656 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002657}
2658
Reid Kleckner86ea7702015-02-04 23:45:07 +00002659static bool areOptimizationsEnabled(const ArgList &Args) {
2660 // Find the last -O arg and see if it is non-zero.
2661 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2662 return !A->getOption().matches(options::OPT_O0);
2663 // Defaults to -O0.
2664 return false;
2665}
2666
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002667static bool shouldUseFramePointerForTarget(const ArgList &Args,
2668 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002669 switch (Triple.getArch()) {
2670 case llvm::Triple::xcore:
2671 case llvm::Triple::wasm32:
2672 case llvm::Triple::wasm64:
2673 // XCore never wants frame pointers, regardless of OS.
2674 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002675 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002676 default:
2677 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002678 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002679
2680 if (Triple.isOSLinux()) {
2681 switch (Triple.getArch()) {
2682 // Don't use a frame pointer on linux if optimizing for certain targets.
2683 case llvm::Triple::mips64:
2684 case llvm::Triple::mips64el:
2685 case llvm::Triple::mips:
2686 case llvm::Triple::mipsel:
2687 case llvm::Triple::systemz:
2688 case llvm::Triple::x86:
2689 case llvm::Triple::x86_64:
2690 return !areOptimizationsEnabled(Args);
2691 default:
2692 return true;
2693 }
2694 }
2695
2696 if (Triple.isOSWindows()) {
2697 switch (Triple.getArch()) {
2698 case llvm::Triple::x86:
2699 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002700 case llvm::Triple::arm:
2701 case llvm::Triple::thumb:
2702 // Windows on ARM builds with FPO disabled to aid fast stack walking
2703 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002704 default:
2705 // All other supported Windows ISAs use xdata unwind information, so frame
2706 // pointers are not generally useful.
2707 return false;
2708 }
2709 }
2710
2711 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002712}
2713
Rafael Espindola224dd632011-12-14 21:02:23 +00002714static bool shouldUseFramePointer(const ArgList &Args,
2715 const llvm::Triple &Triple) {
2716 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2717 options::OPT_fomit_frame_pointer))
2718 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2719
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002720 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002721}
2722
Eric Christopherb7d97e92013-04-03 01:58:53 +00002723static bool shouldUseLeafFramePointer(const ArgList &Args,
2724 const llvm::Triple &Triple) {
2725 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2726 options::OPT_momit_leaf_frame_pointer))
2727 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2728
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002729 if (Triple.isPS4CPU())
2730 return false;
2731
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002732 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002733}
2734
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002735/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002736static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002737 SmallString<128> cwd;
2738 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002739 CmdArgs.push_back("-fdebug-compilation-dir");
2740 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002741 }
2742}
2743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002744static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002745 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2746 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2747 SmallString<128> T(FinalOutput->getValue());
2748 llvm::sys::path::replace_extension(T, "dwo");
2749 return Args.MakeArgString(T);
2750 } else {
2751 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002752 SmallString<128> T(
2753 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002754 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002755 llvm::sys::path::replace_extension(F, "dwo");
2756 T += F;
2757 return Args.MakeArgString(F);
2758 }
2759}
2760
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002761static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2762 const JobAction &JA, const ArgList &Args,
2763 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002764 ArgStringList ExtractArgs;
2765 ExtractArgs.push_back("--extract-dwo");
2766
2767 ArgStringList StripArgs;
2768 StripArgs.push_back("--strip-dwo");
2769
2770 // Grabbing the output of the earlier compile step.
2771 StripArgs.push_back(Output.getFilename());
2772 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002773 ExtractArgs.push_back(OutFile);
2774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002775 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002776 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002777
2778 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002779 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002780
2781 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002782 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002783}
2784
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002785/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002786/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2787static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002788 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002789 if (A->getOption().matches(options::OPT_O4) ||
2790 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002791 return true;
2792
2793 if (A->getOption().matches(options::OPT_O0))
2794 return false;
2795
2796 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2797
Rafael Espindola91780de2013-08-26 14:05:41 +00002798 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002799 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002800 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002801 return true;
2802
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002803 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002804 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002805 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002806
2807 unsigned OptLevel = 0;
2808 if (S.getAsInteger(10, OptLevel))
2809 return false;
2810
2811 return OptLevel > 1;
2812 }
2813
2814 return false;
2815}
2816
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002817/// Add -x lang to \p CmdArgs for \p Input.
2818static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2819 ArgStringList &CmdArgs) {
2820 // When using -verify-pch, we don't want to provide the type
2821 // 'precompiled-header' if it was inferred from the file extension
2822 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2823 return;
2824
2825 CmdArgs.push_back("-x");
2826 if (Args.hasArg(options::OPT_rewrite_objc))
2827 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2828 else
2829 CmdArgs.push_back(types::getTypeName(Input.getType()));
2830}
2831
David Majnemerc371ff02015-03-22 08:39:22 +00002832static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002833 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002834 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002835
2836 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002837 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002838
2839 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002840 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002841 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002842 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002843}
2844
Rafael Espindola577637a2015-01-03 00:06:04 +00002845// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002846// options that build systems might add but are unused when assembling or only
2847// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002848static void claimNoWarnArgs(const ArgList &Args) {
2849 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002850 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002851 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002852 Args.ClaimAllArgs(options::OPT_flto);
2853 Args.ClaimAllArgs(options::OPT_fno_lto);
2854}
2855
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002856static void appendUserToPath(SmallVectorImpl<char> &Result) {
2857#ifdef LLVM_ON_UNIX
2858 const char *Username = getenv("LOGNAME");
2859#else
2860 const char *Username = getenv("USERNAME");
2861#endif
2862 if (Username) {
2863 // Validate that LoginName can be used in a path, and get its length.
2864 size_t Len = 0;
2865 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002866 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002867 Username = nullptr;
2868 break;
2869 }
2870 }
2871
2872 if (Username && Len > 0) {
2873 Result.append(Username, Username + Len);
2874 return;
2875 }
2876 }
2877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002878// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002879#ifdef LLVM_ON_UNIX
2880 std::string UID = llvm::utostr(getuid());
2881#else
2882 // FIXME: Windows seems to have an 'SID' that might work.
2883 std::string UID = "9999";
2884#endif
2885 Result.append(UID.begin(), UID.end());
2886}
2887
David Majnemere11d3732015-06-08 00:22:46 +00002888VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2889 const llvm::Triple &Triple,
2890 const llvm::opt::ArgList &Args,
2891 bool IsWindowsMSVC) {
2892 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2893 IsWindowsMSVC) ||
2894 Args.hasArg(options::OPT_fmsc_version) ||
2895 Args.hasArg(options::OPT_fms_compatibility_version)) {
2896 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2897 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002898 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002899
2900 if (MSCVersion && MSCompatibilityVersion) {
2901 if (D)
2902 D->Diag(diag::err_drv_argument_not_allowed_with)
2903 << MSCVersion->getAsString(Args)
2904 << MSCompatibilityVersion->getAsString(Args);
2905 return VersionTuple();
2906 }
2907
2908 if (MSCompatibilityVersion) {
2909 VersionTuple MSVT;
2910 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2911 D->Diag(diag::err_drv_invalid_value)
2912 << MSCompatibilityVersion->getAsString(Args)
2913 << MSCompatibilityVersion->getValue();
2914 return MSVT;
2915 }
2916
2917 if (MSCVersion) {
2918 unsigned Version = 0;
2919 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2920 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2921 << MSCVersion->getValue();
2922 return getMSCompatibilityVersion(Version);
2923 }
2924
2925 unsigned Major, Minor, Micro;
2926 Triple.getEnvironmentVersion(Major, Minor, Micro);
2927 if (Major || Minor || Micro)
2928 return VersionTuple(Major, Minor, Micro);
2929
2930 return VersionTuple(18);
2931 }
2932 return VersionTuple();
2933}
2934
Diego Novilloa0545962015-07-10 18:00:07 +00002935static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2936 const InputInfo &Output, const ArgList &Args,
2937 ArgStringList &CmdArgs) {
2938 auto *ProfileGenerateArg = Args.getLastArg(
2939 options::OPT_fprofile_instr_generate,
2940 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002941 options::OPT_fprofile_generate_EQ,
2942 options::OPT_fno_profile_instr_generate);
2943 if (ProfileGenerateArg &&
2944 ProfileGenerateArg->getOption().matches(
2945 options::OPT_fno_profile_instr_generate))
2946 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002947
2948 auto *ProfileUseArg = Args.getLastArg(
2949 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002950 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2951 options::OPT_fno_profile_instr_use);
2952 if (ProfileUseArg &&
2953 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2954 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002955
2956 if (ProfileGenerateArg && ProfileUseArg)
2957 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002958 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002959
Diego Novillo758f3f52015-08-05 21:49:51 +00002960 if (ProfileGenerateArg) {
2961 if (ProfileGenerateArg->getOption().matches(
2962 options::OPT_fprofile_instr_generate_EQ))
2963 ProfileGenerateArg->render(Args, CmdArgs);
2964 else if (ProfileGenerateArg->getOption().matches(
2965 options::OPT_fprofile_generate_EQ)) {
2966 SmallString<128> Path(ProfileGenerateArg->getValue());
2967 llvm::sys::path::append(Path, "default.profraw");
2968 CmdArgs.push_back(
2969 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2970 } else
2971 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2972 }
Diego Novilloa0545962015-07-10 18:00:07 +00002973
Diego Novillo758f3f52015-08-05 21:49:51 +00002974 if (ProfileUseArg) {
2975 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2976 ProfileUseArg->render(Args, CmdArgs);
2977 else if ((ProfileUseArg->getOption().matches(
2978 options::OPT_fprofile_use_EQ) ||
2979 ProfileUseArg->getOption().matches(
2980 options::OPT_fprofile_instr_use))) {
2981 SmallString<128> Path(
2982 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2983 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2984 llvm::sys::path::append(Path, "default.profdata");
2985 CmdArgs.push_back(
2986 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2987 }
Diego Novilloa0545962015-07-10 18:00:07 +00002988 }
2989
2990 if (Args.hasArg(options::OPT_ftest_coverage) ||
2991 Args.hasArg(options::OPT_coverage))
2992 CmdArgs.push_back("-femit-coverage-notes");
2993 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2994 false) ||
2995 Args.hasArg(options::OPT_coverage))
2996 CmdArgs.push_back("-femit-coverage-data");
2997
Diego Novilloc4b94da2015-08-05 23:27:40 +00002998 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2999 options::OPT_fno_coverage_mapping, false) &&
3000 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003001 D.Diag(diag::err_drv_argument_only_allowed_with)
3002 << "-fcoverage-mapping"
3003 << "-fprofile-instr-generate";
3004
Diego Novilloc4b94da2015-08-05 23:27:40 +00003005 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3006 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003007 CmdArgs.push_back("-fcoverage-mapping");
3008
3009 if (C.getArgs().hasArg(options::OPT_c) ||
3010 C.getArgs().hasArg(options::OPT_S)) {
3011 if (Output.isFilename()) {
3012 CmdArgs.push_back("-coverage-file");
3013 SmallString<128> CoverageFilename;
3014 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3015 CoverageFilename = FinalOutput->getValue();
3016 } else {
3017 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3018 }
3019 if (llvm::sys::path::is_relative(CoverageFilename)) {
3020 SmallString<128> Pwd;
3021 if (!llvm::sys::fs::current_path(Pwd)) {
3022 llvm::sys::path::append(Pwd, CoverageFilename);
3023 CoverageFilename.swap(Pwd);
3024 }
3025 }
3026 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3027 }
3028 }
3029}
3030
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003031/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3032/// smooshes them together with platform defaults, to decide whether
3033/// this compile should be using PIC mode or not. Returns a tuple of
3034/// (RelocationModel, PICLevel, IsPIE).
3035static std::tuple<llvm::Reloc::Model, unsigned, bool>
3036ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3037 const ArgList &Args) {
3038 // FIXME: why does this code...and so much everywhere else, use both
3039 // ToolChain.getTriple() and Triple?
3040 bool PIE = ToolChain.isPIEDefault();
3041 bool PIC = PIE || ToolChain.isPICDefault();
3042 bool IsPICLevelTwo = PIC;
3043
3044 bool KernelOrKext =
3045 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3046
3047 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003048 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003049 switch (ToolChain.getArch()) {
3050 case llvm::Triple::arm:
3051 case llvm::Triple::armeb:
3052 case llvm::Triple::thumb:
3053 case llvm::Triple::thumbeb:
3054 case llvm::Triple::aarch64:
3055 case llvm::Triple::mips:
3056 case llvm::Triple::mipsel:
3057 case llvm::Triple::mips64:
3058 case llvm::Triple::mips64el:
3059 PIC = true; // "-fpic"
3060 break;
3061
3062 case llvm::Triple::x86:
3063 case llvm::Triple::x86_64:
3064 PIC = true; // "-fPIC"
3065 IsPICLevelTwo = true;
3066 break;
3067
3068 default:
3069 break;
3070 }
3071 }
3072
3073 // OpenBSD-specific defaults for PIE
3074 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3075 switch (ToolChain.getArch()) {
3076 case llvm::Triple::mips64:
3077 case llvm::Triple::mips64el:
3078 case llvm::Triple::sparcel:
3079 case llvm::Triple::x86:
3080 case llvm::Triple::x86_64:
3081 IsPICLevelTwo = false; // "-fpie"
3082 break;
3083
3084 case llvm::Triple::ppc:
3085 case llvm::Triple::sparc:
3086 case llvm::Triple::sparcv9:
3087 IsPICLevelTwo = true; // "-fPIE"
3088 break;
3089
3090 default:
3091 break;
3092 }
3093 }
3094
3095 // The last argument relating to either PIC or PIE wins, and no
3096 // other argument is used. If the last argument is any flavor of the
3097 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3098 // option implicitly enables PIC at the same level.
3099 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3100 options::OPT_fpic, options::OPT_fno_pic,
3101 options::OPT_fPIE, options::OPT_fno_PIE,
3102 options::OPT_fpie, options::OPT_fno_pie);
3103 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3104 // is forced, then neither PIC nor PIE flags will have no effect.
3105 if (!ToolChain.isPICDefaultForced()) {
3106 if (LastPICArg) {
3107 Option O = LastPICArg->getOption();
3108 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3109 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3110 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3111 PIC =
3112 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3113 IsPICLevelTwo =
3114 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3115 } else {
3116 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003117 if (Triple.isPS4CPU()) {
3118 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3119 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3120 if (Model != "kernel") {
3121 PIC = true;
3122 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3123 << LastPICArg->getSpelling();
3124 }
3125 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003126 }
3127 }
3128 }
3129
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003130 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3131 // PIC level would've been set to level 1, force it back to level 2 PIC
3132 // instead.
3133 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003134 IsPICLevelTwo |= ToolChain.isPICDefault();
3135
James Y Knightc4015d32015-08-21 04:14:55 +00003136 // This kernel flags are a trump-card: they will disable PIC/PIE
3137 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003138 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3139 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003140 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003141
3142 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3143 // This is a very special mode. It trumps the other modes, almost no one
3144 // uses it, and it isn't even valid on any OS but Darwin.
3145 if (!ToolChain.getTriple().isOSDarwin())
3146 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3147 << A->getSpelling() << ToolChain.getTriple().str();
3148
3149 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3150
3151 // Only a forced PIC mode can cause the actual compile to have PIC defines
3152 // etc., no flags are sufficient. This behavior was selected to closely
3153 // match that of llvm-gcc and Apple GCC before that.
3154 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3155
3156 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3157 }
3158
3159 if (PIC)
3160 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3161
3162 return std::make_tuple(llvm::Reloc::Static, 0, false);
3163}
3164
3165static const char *RelocationModelName(llvm::Reloc::Model Model) {
3166 switch (Model) {
3167 case llvm::Reloc::Default:
3168 return nullptr;
3169 case llvm::Reloc::Static:
3170 return "static";
3171 case llvm::Reloc::PIC_:
3172 return "pic";
3173 case llvm::Reloc::DynamicNoPIC:
3174 return "dynamic-no-pic";
3175 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003176 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003177}
3178
3179static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3180 ArgStringList &CmdArgs) {
3181 llvm::Reloc::Model RelocationModel;
3182 unsigned PICLevel;
3183 bool IsPIE;
3184 std::tie(RelocationModel, PICLevel, IsPIE) =
3185 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3186
3187 if (RelocationModel != llvm::Reloc::Static)
3188 CmdArgs.push_back("-KPIC");
3189}
3190
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003191void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192 const InputInfo &Output, const InputInfoList &Inputs,
3193 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003194 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3195 const llvm::Triple Triple(TripleStr);
3196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003197 bool KernelOrKext =
3198 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003199 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003200 ArgStringList CmdArgs;
3201
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003202 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003203 bool IsWindowsCygnus =
3204 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003205 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003206 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003207
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003208 // Check number of inputs for sanity. We need at least one input.
3209 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003210 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003211 // CUDA compilation may have multiple inputs (source file + results of
3212 // device-side compilations). All other jobs are expected to have exactly one
3213 // input.
3214 bool IsCuda = types::isCuda(Input.getType());
3215 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003216
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003217 // Invoke ourselves in -cc1 mode.
3218 //
3219 // FIXME: Implement custom jobs for internal actions.
3220 CmdArgs.push_back("-cc1");
3221
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003222 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003223 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003224 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003225
James Y Knight2db38f32015-08-15 03:45:25 +00003226 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3227 Triple.getArch() == llvm::Triple::thumb)) {
3228 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003229 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003230 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003231 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003232 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003233 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003234 }
3235
Tim Northover336f1892014-03-29 13:16:12 +00003236 // Push all default warning arguments that are specific to
3237 // the given target. These come before user provided warning options
3238 // are provided.
3239 getToolChain().addClangWarningOptions(CmdArgs);
3240
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003241 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003242 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003243
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003244 if (isa<AnalyzeJobAction>(JA)) {
3245 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3246 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003247 } else if (isa<MigrateJobAction>(JA)) {
3248 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003249 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003250 if (Output.getType() == types::TY_Dependencies)
3251 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003252 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003253 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003254 if (Args.hasArg(options::OPT_rewrite_objc) &&
3255 !Args.hasArg(options::OPT_g_Group))
3256 CmdArgs.push_back("-P");
3257 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003258 } else if (isa<AssembleJobAction>(JA)) {
3259 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003260
David Blaikie9260ed62013-07-25 21:19:01 +00003261 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003262
3263 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003264 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003265 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003266 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003267 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003268
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003269 if (JA.getType() == types::TY_Nothing)
3270 CmdArgs.push_back("-fsyntax-only");
3271 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003272 CmdArgs.push_back("-emit-pch");
3273 else
3274 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003275 } else if (isa<VerifyPCHJobAction>(JA)) {
3276 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003277 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003278 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3279 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003280 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003281 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003282 } else if (JA.getType() == types::TY_LLVM_IR ||
3283 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003284 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003285 } else if (JA.getType() == types::TY_LLVM_BC ||
3286 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003287 CmdArgs.push_back("-emit-llvm-bc");
3288 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003289 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003290 } else if (JA.getType() == types::TY_AST) {
3291 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003292 } else if (JA.getType() == types::TY_ModuleFile) {
3293 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003294 } else if (JA.getType() == types::TY_RewrittenObjC) {
3295 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003296 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003297 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3298 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003299 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003300 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003301 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003303
3304 // Preserve use-list order by default when emitting bitcode, so that
3305 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3306 // same result as running passes here. For LTO, we don't need to preserve
3307 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003308 if (JA.getType() == types::TY_LLVM_BC)
3309 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003310
3311 if (D.isUsingLTO())
3312 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003313 }
3314
Justin Bognera88f0122014-06-20 22:59:50 +00003315 // We normally speed up the clang process a bit by skipping destructors at
3316 // exit, but when we're generating diagnostics we can rely on some of the
3317 // cleanup.
3318 if (!C.isForDiagnostics())
3319 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003320
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003321// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003322#ifdef NDEBUG
3323 CmdArgs.push_back("-disable-llvm-verifier");
3324#endif
3325
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003326 // Set the main file name, so that debug info works even with
3327 // -save-temps.
3328 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003329 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003330
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003331 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003332 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003333 if (Args.hasArg(options::OPT_static))
3334 CmdArgs.push_back("-static-define");
3335
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003336 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003337 // Enable region store model by default.
3338 CmdArgs.push_back("-analyzer-store=region");
3339
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003340 // Treat blocks as analysis entry points.
3341 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3342
Ted Kremenek49c79792011-03-24 00:28:47 +00003343 CmdArgs.push_back("-analyzer-eagerly-assume");
3344
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003345 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003346 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003347 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003348
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003349 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003350 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003351
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003352 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003353 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003354
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003355 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003356
Artem Belevichba558952015-05-06 18:20:23 +00003357 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003358 CmdArgs.push_back("-analyzer-checker=cplusplus");
3359
Nico Webere8e53112014-05-11 01:04:02 +00003360 // Enable the following experimental checkers for testing.
3361 CmdArgs.push_back(
3362 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003363 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3364 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003365 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003366 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3367 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003368
3369 // Default nullability checks.
3370 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3371 CmdArgs.push_back(
3372 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003373 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003374
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003375 // Set the output format. The default is plist, for (lame) historical
3376 // reasons.
3377 CmdArgs.push_back("-analyzer-output");
3378 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003379 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003380 else
3381 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003382
Ted Kremenekfe449a22010-03-22 22:32:05 +00003383 // Disable the presentation of standard compiler warnings when
3384 // using --analyze. We only want to show static analyzer diagnostics
3385 // or frontend errors.
3386 CmdArgs.push_back("-w");
3387
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003388 // Add -Xanalyzer arguments when running as analyzer.
3389 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003390 }
3391
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003392 CheckCodeGenerationOptions(D, Args);
3393
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003394 llvm::Reloc::Model RelocationModel;
3395 unsigned PICLevel;
3396 bool IsPIE;
3397 std::tie(RelocationModel, PICLevel, IsPIE) =
3398 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003399
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003400 const char *RMName = RelocationModelName(RelocationModel);
3401 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003402 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003403 CmdArgs.push_back(RMName);
3404 }
3405 if (PICLevel > 0) {
3406 CmdArgs.push_back("-pic-level");
3407 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3408 if (IsPIE) {
3409 CmdArgs.push_back("-pie-level");
3410 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003411 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003412 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003413
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003414 CmdArgs.push_back("-mthread-model");
3415 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3416 CmdArgs.push_back(A->getValue());
3417 else
3418 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3419
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003420 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3421
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003422 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3423 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003424 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003425
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003426 // LLVM Code Generator Options.
3427
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003428 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3429 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003430 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3431 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003432 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003433 CmdArgs.push_back(A->getValue());
3434 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003435 }
3436 }
3437
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003438 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3439 StringRef v = A->getValue();
3440 CmdArgs.push_back("-mllvm");
3441 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3442 A->claim();
3443 }
3444
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003445 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3446 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003447 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003448 }
3449
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003450 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3451 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003452 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003453 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003454 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003455 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3456 CmdArgs.push_back("-fpcc-struct-return");
3457 } else {
3458 assert(A->getOption().matches(options::OPT_freg_struct_return));
3459 CmdArgs.push_back("-freg-struct-return");
3460 }
3461 }
3462
Roman Divacky65b88cd2011-03-01 17:40:53 +00003463 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3464 CmdArgs.push_back("-mrtd");
3465
Rafael Espindola224dd632011-12-14 21:02:23 +00003466 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003467 CmdArgs.push_back("-mdisable-fp-elim");
3468 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3469 options::OPT_fno_zero_initialized_in_bss))
3470 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003471
3472 bool OFastEnabled = isOptimizationLevelFast(Args);
3473 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3474 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003475 OptSpecifier StrictAliasingAliasOption =
3476 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003477 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3478 // doesn't do any TBAA.
3479 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003480 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003481 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003482 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003483 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3484 options::OPT_fno_struct_path_tbaa))
3485 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003486 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3487 false))
3488 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003489 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3490 options::OPT_fno_strict_vtable_pointers,
3491 false))
3492 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003493 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3494 options::OPT_fno_optimize_sibling_calls))
3495 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003496
Eric Christopher006208c2013-04-04 06:29:47 +00003497 // Handle segmented stacks.
3498 if (Args.hasArg(options::OPT_fsplit_stack))
3499 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003500
3501 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3502 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503 OptSpecifier FastMathAliasOption =
3504 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3505
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003506 // Handle various floating point optimization flags, mapping them to the
3507 // appropriate LLVM code generation flags. The pattern for all of these is to
3508 // default off the codegen optimizations, and if any flag enables them and no
3509 // flag disables them after the flag enabling them, enable the codegen
3510 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 if (Arg *A = Args.getLastArg(
3512 options::OPT_ffast_math, FastMathAliasOption,
3513 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3514 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3515 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003516 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3517 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003518 A->getOption().getID() != options::OPT_fhonor_infinities)
3519 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003520 if (Arg *A = Args.getLastArg(
3521 options::OPT_ffast_math, FastMathAliasOption,
3522 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3523 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3524 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003525 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3526 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003527 A->getOption().getID() != options::OPT_fhonor_nans)
3528 CmdArgs.push_back("-menable-no-nans");
3529
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003530 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3531 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532 if (Arg *A =
3533 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3534 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3535 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003536 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3537 // However, turning *off* -ffast_math merely restores the toolchain default
3538 // (which may be false).
3539 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3540 A->getOption().getID() == options::OPT_ffast_math ||
3541 A->getOption().getID() == options::OPT_Ofast)
3542 MathErrno = false;
3543 else if (A->getOption().getID() == options::OPT_fmath_errno)
3544 MathErrno = true;
3545 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003546 if (MathErrno)
3547 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003548
3549 // There are several flags which require disabling very specific
3550 // optimizations. Any of these being disabled forces us to turn off the
3551 // entire set of LLVM optimizations, so collect them through all the flag
3552 // madness.
3553 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003554 if (Arg *A = Args.getLastArg(
3555 options::OPT_ffast_math, FastMathAliasOption,
3556 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3557 options::OPT_fno_unsafe_math_optimizations,
3558 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003559 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3560 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003561 A->getOption().getID() != options::OPT_fno_associative_math)
3562 AssociativeMath = true;
3563 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003564 if (Arg *A = Args.getLastArg(
3565 options::OPT_ffast_math, FastMathAliasOption,
3566 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3567 options::OPT_fno_unsafe_math_optimizations,
3568 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003569 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3570 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003571 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3572 ReciprocalMath = true;
3573 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003574 if (Arg *A = Args.getLastArg(
3575 options::OPT_ffast_math, FastMathAliasOption,
3576 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3577 options::OPT_fno_unsafe_math_optimizations,
3578 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003579 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3580 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003581 A->getOption().getID() != options::OPT_fsigned_zeros)
3582 SignedZeros = false;
3583 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003584 if (Arg *A = Args.getLastArg(
3585 options::OPT_ffast_math, FastMathAliasOption,
3586 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3587 options::OPT_fno_unsafe_math_optimizations,
3588 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003589 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3590 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003591 A->getOption().getID() != options::OPT_ftrapping_math)
3592 TrappingMath = false;
3593 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3594 !TrappingMath)
3595 CmdArgs.push_back("-menable-unsafe-fp-math");
3596
Sanjay Patel76c9e092015-01-23 16:40:50 +00003597 if (!SignedZeros)
3598 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003599
Sanjay Patel359b1052015-04-09 15:03:23 +00003600 if (ReciprocalMath)
3601 CmdArgs.push_back("-freciprocal-math");
3602
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003603 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003604 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003605 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003606 options::OPT_ffp_contract)) {
3607 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003608 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003609 if (Val == "fast" || Val == "on" || Val == "off") {
3610 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3611 } else {
3612 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003614 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003615 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3616 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003617 // If fast-math is set then set the fp-contract mode to fast.
3618 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3619 }
3620 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003621
Sanjay Patel2987c292015-06-11 14:53:41 +00003622 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003623
Bob Wilson6a039162012-07-19 03:52:53 +00003624 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3625 // and if we find them, tell the frontend to provide the appropriate
3626 // preprocessor macros. This is distinct from enabling any optimizations as
3627 // these options induce language changes which must survive serialization
3628 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003629 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3630 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003631 if (!A->getOption().matches(options::OPT_fno_fast_math))
3632 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003633 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3634 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003635 if (A->getOption().matches(options::OPT_ffinite_math_only))
3636 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003637
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003638 // Decide whether to use verbose asm. Verbose assembly is the default on
3639 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003640 bool IsIntegratedAssemblerDefault =
3641 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003642 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003643 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003644 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003645 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003646
Rafael Espindolab8a12932015-05-22 20:44:03 +00003647 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3648 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003649 CmdArgs.push_back("-no-integrated-as");
3650
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003651 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3652 CmdArgs.push_back("-mdebug-pass");
3653 CmdArgs.push_back("Structure");
3654 }
3655 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3656 CmdArgs.push_back("-mdebug-pass");
3657 CmdArgs.push_back("Arguments");
3658 }
3659
John McCall8517abc2010-02-19 02:45:38 +00003660 // Enable -mconstructor-aliases except on darwin, where we have to
3661 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003662 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003663 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003664
John McCall7ef5cb32011-03-18 02:56:14 +00003665 // Darwin's kernel doesn't support guard variables; just die if we
3666 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003667 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003668 CmdArgs.push_back("-fforbid-guard-variables");
3669
Douglas Gregordbe39272011-02-01 15:15:22 +00003670 if (Args.hasArg(options::OPT_mms_bitfields)) {
3671 CmdArgs.push_back("-mms-bitfields");
3672 }
John McCall8517abc2010-02-19 02:45:38 +00003673
Daniel Dunbar306945d2009-09-16 06:17:29 +00003674 // This is a coarse approximation of what llvm-gcc actually does, both
3675 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3676 // complicated ways.
3677 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003678 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3679 options::OPT_fno_asynchronous_unwind_tables,
3680 (getToolChain().IsUnwindTablesDefault() ||
3681 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3682 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003683 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3684 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003685 CmdArgs.push_back("-munwind-tables");
3686
Chandler Carruth05fb5852012-11-21 23:40:23 +00003687 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003688
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003689 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3690 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003691 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003692 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003693
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003694 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003695 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003696
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003697 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003698 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003699 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003700 }
3701
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003702 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003703 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003704 if (!CPU.empty()) {
3705 CmdArgs.push_back("-target-cpu");
3706 CmdArgs.push_back(Args.MakeArgString(CPU));
3707 }
3708
Rafael Espindolaeb265472013-08-21 21:59:03 +00003709 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3710 CmdArgs.push_back("-mfpmath");
3711 CmdArgs.push_back(A->getValue());
3712 }
3713
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003714 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003715 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003716
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003717 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003718 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003719 default:
3720 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003721
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003722 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003723 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003724 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003725 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003726 // Use the effective triple, which takes into account the deployment target.
3727 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003728 break;
3729
Tim Northover573cbee2014-05-24 12:52:07 +00003730 case llvm::Triple::aarch64:
3731 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003732 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003733 break;
3734
Eric Christopher0b26a612010-03-02 02:41:08 +00003735 case llvm::Triple::mips:
3736 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003737 case llvm::Triple::mips64:
3738 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003739 AddMIPSTargetArgs(Args, CmdArgs);
3740 break;
3741
Ulrich Weigand8afad612014-07-28 13:17:52 +00003742 case llvm::Triple::ppc:
3743 case llvm::Triple::ppc64:
3744 case llvm::Triple::ppc64le:
3745 AddPPCTargetArgs(Args, CmdArgs);
3746 break;
3747
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003748 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003749 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003750 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003751 AddSparcTargetArgs(Args, CmdArgs);
3752 break;
3753
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003754 case llvm::Triple::x86:
3755 case llvm::Triple::x86_64:
3756 AddX86TargetArgs(Args, CmdArgs);
3757 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003758
3759 case llvm::Triple::hexagon:
3760 AddHexagonTargetArgs(Args, CmdArgs);
3761 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003762 }
3763
Douglas Katzman3459ce22015-10-08 04:24:12 +00003764 // The 'g' groups options involve a somewhat intricate sequence of decisions
3765 // about what to pass from the driver to the frontend, but by the time they
3766 // reach cc1 they've been factored into two well-defined orthogonal choices:
3767 // * what level of debug info to generate
3768 // * what dwarf version to write
3769 // This avoids having to monkey around further in cc1 other than to disable
3770 // codeview if not running in a Windows environment. Perhaps even that
3771 // decision should be made in the driver as well though.
3772 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3773 CodeGenOptions::NoDebugInfo;
3774 // These two are potentially updated by AddClangCLArgs.
3775 unsigned DwarfVersion = 0;
3776 bool EmitCodeView = false;
3777
Hans Wennborg75958c42013-08-08 00:17:41 +00003778 // Add clang-cl arguments.
3779 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003780 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003781
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003782 // Pass the linker version in use.
3783 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3784 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003785 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003786 }
3787
Eric Christopherb7d97e92013-04-03 01:58:53 +00003788 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003789 CmdArgs.push_back("-momit-leaf-frame-pointer");
3790
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003791 // Explicitly error on some things we know we don't support and can't just
3792 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003793 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003794 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3795 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003796 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003797 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003798 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3799 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003800 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003801 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003802 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003803 }
3804
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003805 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003806 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003807 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003808 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003809 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3810 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003811 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003812 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003813 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003814
Chad Rosierbe10f982011-08-02 17:58:04 +00003815 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003816 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003817 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3818 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003819 }
3820
Rafael Espindola08a692a2010-03-07 04:46:18 +00003821 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003822 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003823 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003824 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3825 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3826 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003827 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003828 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003829 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003830 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003831 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003832 // Some 'g' group option other than one expressly disabling debug info
3833 // must have been the final (winning) one. They're all equivalent.
3834 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003835 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003836 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003837
Douglas Katzman3459ce22015-10-08 04:24:12 +00003838 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3839 // (because that would mean that "-g0" was the rightmost 'g' group option).
3840 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3841 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3842 // exists of removing the gdwarf options from the g_group.
3843 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3844 options::OPT_gdwarf_4))
3845 DwarfVersion = DwarfVersionNum(A->getSpelling());
3846
Reid Kleckner124955a2015-08-05 18:51:13 +00003847 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003848 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3849 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3850 // DwarfVersion remains at 0 if no explicit choice was made.
3851 CmdArgs.push_back("-gcodeview");
3852 } else if (DwarfVersion == 0 &&
3853 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3854 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3855 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003856
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003857 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3858 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003859
3860 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003861 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003862 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003863 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003864
Eric Christopher138c32b2013-09-13 22:37:55 +00003865 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003866 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003867 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003868 CmdArgs.push_back("-dwarf-ext-refs");
3869 CmdArgs.push_back("-fmodule-format=obj");
3870 }
3871
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003872 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3873 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003874 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003875 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003876 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003877 CmdArgs.push_back("-backend-option");
3878 CmdArgs.push_back("-split-dwarf=Enable");
3879 }
3880
Douglas Katzman3459ce22015-10-08 04:24:12 +00003881 // After we've dealt with all combinations of things that could
3882 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3883 // figure out if we need to "upgrade" it to standalone debug info.
3884 // We parse these two '-f' options whether or not they will be used,
3885 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3886 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3887 options::OPT_fno_standalone_debug,
3888 getToolChain().GetDefaultStandaloneDebug());
3889 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3890 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3891 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3892
Eric Christopher138c32b2013-09-13 22:37:55 +00003893 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3894 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3895 CmdArgs.push_back("-backend-option");
3896 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3897 }
Eric Christophereec89c22013-06-18 00:03:50 +00003898
Eric Christopher0d403d22014-02-14 01:27:03 +00003899 // -gdwarf-aranges turns on the emission of the aranges section in the
3900 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003901 // Always enabled on the PS4.
3902 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003903 CmdArgs.push_back("-backend-option");
3904 CmdArgs.push_back("-generate-arange-section");
3905 }
3906
David Blaikief36d9ba2014-01-27 18:52:43 +00003907 if (Args.hasFlag(options::OPT_fdebug_types_section,
3908 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003909 CmdArgs.push_back("-backend-option");
3910 CmdArgs.push_back("-generate-type-units");
3911 }
Eric Christophereec89c22013-06-18 00:03:50 +00003912
Ed Schouten6e576152015-03-26 17:50:28 +00003913 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3914 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3915
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003916 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003917 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003918 CmdArgs.push_back("-ffunction-sections");
3919 }
3920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003921 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3922 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003923 CmdArgs.push_back("-fdata-sections");
3924 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003925
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003926 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003927 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003928 CmdArgs.push_back("-fno-unique-section-names");
3929
Chris Lattner3c77a352010-06-22 00:03:40 +00003930 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3931
Diego Novilloa0545962015-07-10 18:00:07 +00003932 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003933
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003934 // Pass options for controlling the default header search paths.
3935 if (Args.hasArg(options::OPT_nostdinc)) {
3936 CmdArgs.push_back("-nostdsysteminc");
3937 CmdArgs.push_back("-nobuiltininc");
3938 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003939 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003940 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003941 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3942 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3943 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003944
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003945 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003946 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003947 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003948
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003949 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3950
Ted Kremenekf7639e12012-03-06 20:06:33 +00003951 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003952 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003953 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003954 options::OPT_ccc_arcmt_modify,
3955 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003956 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003957 switch (A->getOption().getID()) {
3958 default:
3959 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003960 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003961 CmdArgs.push_back("-arcmt-check");
3962 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003963 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003964 CmdArgs.push_back("-arcmt-modify");
3965 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003966 case options::OPT_ccc_arcmt_migrate:
3967 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003968 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003969 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003970
3971 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3972 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003973 break;
John McCalld70fb982011-06-15 23:25:17 +00003974 }
3975 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003976 } else {
3977 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3978 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3979 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003980 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003981
Ted Kremenekf7639e12012-03-06 20:06:33 +00003982 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3983 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003984 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3985 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003986 }
3987 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003988 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003989
3990 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003991 options::OPT_objcmt_migrate_subscripting,
3992 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003993 // None specified, means enable them all.
3994 CmdArgs.push_back("-objcmt-migrate-literals");
3995 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003996 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003997 } else {
3998 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3999 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004000 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004001 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004002 } else {
4003 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4004 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4005 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4006 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4007 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4008 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004009 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004010 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4011 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4012 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4013 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4014 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4015 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4016 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004017 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004018 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004019 }
4020
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004021 // Add preprocessing options like -I, -D, etc. if we are using the
4022 // preprocessor.
4023 //
4024 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004025 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00004026 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004027
Rafael Espindolaa7431922011-07-21 23:40:37 +00004028 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4029 // that "The compiler can only warn and ignore the option if not recognized".
4030 // When building with ccache, it will pass -D options to clang even on
4031 // preprocessed inputs and configure concludes that -fPIC is not supported.
4032 Args.ClaimAllArgs(options::OPT_D);
4033
Alp Toker7874bdc2013-11-15 20:40:58 +00004034 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004035 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4036 if (A->getOption().matches(options::OPT_O4)) {
4037 CmdArgs.push_back("-O3");
4038 D.Diag(diag::warn_O4_is_O3);
4039 } else {
4040 A->render(Args, CmdArgs);
4041 }
4042 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004043
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004044 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004045 for (const Arg *A :
4046 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4047 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004048 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004049 }
4050
Rafael Espindola577637a2015-01-03 00:06:04 +00004051 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004052
Richard Smith3be1cb22014-08-07 00:24:21 +00004053 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004054 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004055 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4056 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004057 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004058 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004059
4060 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004061 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004062 //
4063 // If a std is supplied, only add -trigraphs if it follows the
4064 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004065 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004066 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4067 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004068 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004069 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004070 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004071 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004072 else
4073 Std->render(Args, CmdArgs);
4074
Nico Weber00721502014-12-23 22:32:37 +00004075 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004076 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004077 options::OPT_ftrigraphs,
4078 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004079 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004080 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004081 } else {
4082 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004083 //
4084 // FIXME: Clang doesn't correctly handle -std= when the input language
4085 // doesn't match. For the time being just ignore this for C++ inputs;
4086 // eventually we want to do all the standard defaulting here instead of
4087 // splitting it between the driver and clang -cc1.
4088 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004089 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4090 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004091 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004092 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004093
Nico Weber00721502014-12-23 22:32:37 +00004094 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4095 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004096 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004097
Richard Smith282b4492013-09-04 22:50:31 +00004098 // GCC's behavior for -Wwrite-strings is a bit strange:
4099 // * In C, this "warning flag" changes the types of string literals from
4100 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4101 // for the discarded qualifier.
4102 // * In C++, this is just a normal warning flag.
4103 //
4104 // Implementing this warning correctly in C is hard, so we follow GCC's
4105 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4106 // a non-const char* in C, rather than using this crude hack.
4107 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004108 // FIXME: This should behave just like a warning flag, and thus should also
4109 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4110 Arg *WriteStrings =
4111 Args.getLastArg(options::OPT_Wwrite_strings,
4112 options::OPT_Wno_write_strings, options::OPT_w);
4113 if (WriteStrings &&
4114 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004115 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004116 }
4117
Chandler Carruth61fbf622011-04-23 09:27:53 +00004118 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004119 // during C++ compilation, which it is by default. GCC keeps this define even
4120 // in the presence of '-w', match this behavior bug-for-bug.
4121 if (types::isCXX(InputType) &&
4122 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4123 true)) {
4124 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004125 }
4126
Chandler Carruthe0391482010-05-22 02:21:53 +00004127 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4128 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4129 if (Asm->getOption().matches(options::OPT_fasm))
4130 CmdArgs.push_back("-fgnu-keywords");
4131 else
4132 CmdArgs.push_back("-fno-gnu-keywords");
4133 }
4134
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004135 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4136 CmdArgs.push_back("-fno-dwarf-directory-asm");
4137
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004138 if (ShouldDisableAutolink(Args, getToolChain()))
4139 CmdArgs.push_back("-fno-autolink");
4140
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004141 // Add in -fdebug-compilation-dir if necessary.
4142 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004143
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004144 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4145 StringRef Map = A->getValue();
4146 if (Map.find('=') == StringRef::npos)
4147 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4148 else
4149 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4150 A->claim();
4151 }
4152
Richard Smith9a568822011-11-21 19:36:32 +00004153 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4154 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004155 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004156 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004157 }
4158
Richard Smith79c927b2013-11-06 19:31:51 +00004159 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4160 CmdArgs.push_back("-foperator-arrow-depth");
4161 CmdArgs.push_back(A->getValue());
4162 }
4163
Richard Smith9a568822011-11-21 19:36:32 +00004164 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4165 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004166 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004167 }
4168
Richard Smitha3d3bd22013-05-08 02:12:03 +00004169 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4170 CmdArgs.push_back("-fconstexpr-steps");
4171 CmdArgs.push_back(A->getValue());
4172 }
4173
Richard Smithb3a14522013-02-22 01:59:51 +00004174 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4175 CmdArgs.push_back("-fbracket-depth");
4176 CmdArgs.push_back(A->getValue());
4177 }
4178
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004179 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4180 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004181 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004182 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004183 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4184 } else
4185 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004186 }
4187
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004188 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004189 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004190
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004191 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4192 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004193 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004194 }
David Chisnall5778fce2009-08-31 16:41:57 +00004195
Chris Lattnere23003d2010-01-09 21:54:33 +00004196 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4197 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004198 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004199 }
4200
Chris Lattnerb35583d2010-04-07 20:49:23 +00004201 CmdArgs.push_back("-ferror-limit");
4202 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004203 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004204 else
4205 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004206
Chandler Carrutha77a7272010-05-06 04:55:18 +00004207 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4208 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004209 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004210 }
4211
4212 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4213 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004214 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004215 }
4216
Richard Smithf6f003a2011-12-16 19:06:07 +00004217 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4218 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004219 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004220 }
4221
Nick Lewycky24653262014-12-16 21:39:02 +00004222 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4223 CmdArgs.push_back("-fspell-checking-limit");
4224 CmdArgs.push_back(A->getValue());
4225 }
4226
Daniel Dunbar2c978472009-11-04 06:24:47 +00004227 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004228 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004229 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004230 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004231 } else {
4232 // If -fmessage-length=N was not specified, determine whether this is a
4233 // terminal and, if so, implicitly define -fmessage-length appropriately.
4234 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004235 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004236 }
4237
John McCallb4a99d32013-02-19 01:57:35 +00004238 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4239 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4240 options::OPT_fvisibility_ms_compat)) {
4241 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4242 CmdArgs.push_back("-fvisibility");
4243 CmdArgs.push_back(A->getValue());
4244 } else {
4245 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4246 CmdArgs.push_back("-fvisibility");
4247 CmdArgs.push_back("hidden");
4248 CmdArgs.push_back("-ftype-visibility");
4249 CmdArgs.push_back("default");
4250 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004251 }
4252
Douglas Gregor08329632010-06-15 17:05:35 +00004253 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004254
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004255 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4256
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004257 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004258 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4259 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004260 CmdArgs.push_back("-ffreestanding");
4261
Daniel Dunbare357d562009-12-03 18:42:11 +00004262 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004263 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004264 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004265 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004266 // Emulated TLS is enabled by default on Android, and can be enabled manually
4267 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004268 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004269 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4270 EmulatedTLSDefault))
4271 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004272 // AltiVec-like language extensions aren't relevant for assembling.
4273 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004274 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004275 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4276 }
Richard Trieu91844232012-06-26 18:18:47 +00004277 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4278 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004279
Alexey Bataevdb390212015-05-20 04:24:19 +00004280 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004281 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4282 options::OPT_fno_openmp, false))
4283 switch (getOpenMPRuntime(getToolChain(), Args)) {
4284 case OMPRT_OMP:
4285 case OMPRT_IOMP5:
4286 // Clang can generate useful OpenMP code for these two runtime libraries.
4287 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004288
4289 // If no option regarding the use of TLS in OpenMP codegeneration is
4290 // given, decide a default based on the target. Otherwise rely on the
4291 // options and pass the right information to the frontend.
4292 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004293 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004294 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004295 break;
4296 default:
4297 // By default, if Clang doesn't know how to generate useful OpenMP code
4298 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4299 // down to the actual compilation.
4300 // FIXME: It would be better to have a mode which *only* omits IR
4301 // generation based on the OpenMP support so that we get consistent
4302 // semantic analysis, etc.
4303 break;
4304 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004305
Peter Collingbourne32701642013-11-01 18:16:25 +00004306 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004307 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004308
Eric Christopher459d2712013-02-19 06:16:53 +00004309 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004310 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4311 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4312 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4313 Arch == llvm::Triple::ppc64le))
4314 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4315 << "ppc/ppc64/ppc64le";
4316 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004317
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004318 // -fzvector is incompatible with -faltivec.
4319 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4320 if (Args.hasArg(options::OPT_faltivec))
4321 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4322 << "-faltivec";
4323
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004324 if (getToolChain().SupportsProfiling())
4325 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004326
4327 // -flax-vector-conversions is default.
4328 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4329 options::OPT_fno_lax_vector_conversions))
4330 CmdArgs.push_back("-fno-lax-vector-conversions");
4331
John Brawna7b4ec02015-08-10 11:11:28 +00004332 if (Args.getLastArg(options::OPT_fapple_kext) ||
4333 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004334 CmdArgs.push_back("-fapple-kext");
4335
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004336 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004337 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004338 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004339 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4340 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004341
4342 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4343 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004344 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004345 }
4346
Bob Wilson14adb362012-02-03 06:27:22 +00004347 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004348
Chandler Carruth6e501032011-03-27 00:04:55 +00004349 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4350 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004351 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004352 if (A->getOption().matches(options::OPT_fwrapv))
4353 CmdArgs.push_back("-fwrapv");
4354 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4355 options::OPT_fno_strict_overflow)) {
4356 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4357 CmdArgs.push_back("-fwrapv");
4358 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004359
4360 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4361 options::OPT_fno_reroll_loops))
4362 if (A->getOption().matches(options::OPT_freroll_loops))
4363 CmdArgs.push_back("-freroll-loops");
4364
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004365 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004366 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4367 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004368
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004369 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4370
Daniel Dunbar4930e332009-11-17 08:07:36 +00004371 // -stack-protector=0 is default.
4372 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004373 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4374 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4375 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4376 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4377 Args.ClaimAllArgs(options::OPT_fstack_protector);
4378 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004379 options::OPT_fstack_protector_all,
4380 options::OPT_fstack_protector_strong,
4381 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004382 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004383 StackProtectorLevel = std::max<unsigned>(
4384 LangOptions::SSPOn,
4385 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004386 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004387 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004388 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004389 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004390 } else {
4391 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004392 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004393 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004394 if (StackProtectorLevel) {
4395 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004396 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004397 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004398
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004399 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004400 for (const Arg *A : Args.filtered(options::OPT__param)) {
4401 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004402 if (Str.startswith("ssp-buffer-size=")) {
4403 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004404 CmdArgs.push_back("-stack-protector-buffer-size");
4405 // FIXME: Verify the argument is a valid integer.
4406 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004407 }
Sean Silva14facf32015-06-09 01:57:17 +00004408 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004409 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004410 }
4411
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004412 // Translate -mstackrealign
4413 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004414 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004415 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004416
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004417 if (Args.hasArg(options::OPT_mstack_alignment)) {
4418 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4419 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004420 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004421
Hans Wennborg77dc2362015-01-20 19:45:50 +00004422 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4423 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4424
4425 if (!Size.empty())
4426 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4427 else
4428 CmdArgs.push_back("-mstack-probe-size=0");
4429 }
4430
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004431 switch (getToolChain().getArch()) {
4432 case llvm::Triple::aarch64:
4433 case llvm::Triple::aarch64_be:
4434 case llvm::Triple::arm:
4435 case llvm::Triple::armeb:
4436 case llvm::Triple::thumb:
4437 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004438 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004439 break;
4440
4441 default:
4442 break;
4443 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004444
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004445 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4446 options::OPT_mno_restrict_it)) {
4447 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4448 CmdArgs.push_back("-backend-option");
4449 CmdArgs.push_back("-arm-restrict-it");
4450 } else {
4451 CmdArgs.push_back("-backend-option");
4452 CmdArgs.push_back("-arm-no-restrict-it");
4453 }
James Y Knight2db38f32015-08-15 03:45:25 +00004454 } else if (Triple.isOSWindows() &&
4455 (Triple.getArch() == llvm::Triple::arm ||
4456 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004457 // Windows on ARM expects restricted IT blocks
4458 CmdArgs.push_back("-backend-option");
4459 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004460 }
4461
Daniel Dunbard18049a2009-04-07 21:16:11 +00004462 // Forward -f options with positive and negative forms; we translate
4463 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004464 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4465 StringRef fname = A->getValue();
4466 if (!llvm::sys::fs::exists(fname))
4467 D.Diag(diag::err_drv_no_such_file) << fname;
4468 else
4469 A->render(Args, CmdArgs);
4470 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004471
John Brawna7b4ec02015-08-10 11:11:28 +00004472 // -fbuiltin is default unless -mkernel is used
4473 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4474 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004475 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004476
Nuno Lopes13c88c72009-12-16 16:59:22 +00004477 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4478 options::OPT_fno_assume_sane_operator_new))
4479 CmdArgs.push_back("-fno-assume-sane-operator-new");
4480
Daniel Dunbar4930e332009-11-17 08:07:36 +00004481 // -fblocks=0 is default.
4482 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004483 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004484 (Args.hasArg(options::OPT_fgnu_runtime) &&
4485 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4486 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004487 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004488
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004489 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004490 !getToolChain().hasBlocksRuntime())
4491 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004492 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004493
Richard Smith47972af2015-06-16 00:08:24 +00004494 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004495 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004496 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004497 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004498 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004499 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4500 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004501 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004502 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004503 HaveModules = true;
4504 }
4505 }
4506
Richard Smith47972af2015-06-16 00:08:24 +00004507 // -fmodule-maps enables implicit reading of module map files. By default,
4508 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004509 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4510 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004511 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004512 }
4513
Daniel Jasperac42b752013-10-21 06:34:34 +00004514 // -fmodules-decluse checks that modules used are declared so (off by
4515 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004516 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004517 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004518 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004519 }
4520
Daniel Jasper962b38e2014-04-11 11:47:45 +00004521 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4522 // all #included headers are part of modules.
4523 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004524 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004525 CmdArgs.push_back("-fmodules-strict-decluse");
4526 }
4527
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004528 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4529 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4530 options::OPT_fno_implicit_modules)) {
4531 CmdArgs.push_back("-fno-implicit-modules");
4532 }
4533
Daniel Jasperac42b752013-10-21 06:34:34 +00004534 // -fmodule-name specifies the module that is currently being built (or
4535 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004536 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004537
Richard Smith9887d792014-10-17 01:42:53 +00004538 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004539 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004540 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004541
Richard Smithe842a472014-10-22 02:05:46 +00004542 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004543 if (HaveModules)
4544 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4545 else
4546 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004547
4548 // -fmodule-cache-path specifies where our implicitly-built module files
4549 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004550 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004551 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004552 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004553 if (HaveModules) {
4554 if (C.isForDiagnostics()) {
4555 // When generating crash reports, we want to emit the modules along with
4556 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004557 Path = Output.getFilename();
4558 llvm::sys::path::replace_extension(Path, ".cache");
4559 llvm::sys::path::append(Path, "modules");
4560 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004561 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004562 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004563 llvm::sys::path::append(Path, "org.llvm.clang.");
4564 appendUserToPath(Path);
4565 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004566 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004567 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004568 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4569 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004570 }
4571
4572 // When building modules and generating crashdumps, we need to dump a module
4573 // dependency VFS alongside the output.
4574 if (HaveModules && C.isForDiagnostics()) {
4575 SmallString<128> VFSDir(Output.getFilename());
4576 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004577 // Add the cache directory as a temp so the crash diagnostics pick it up.
4578 C.addTempFile(Args.MakeArgString(VFSDir));
4579
Justin Bognera88f0122014-06-20 22:59:50 +00004580 llvm::sys::path::append(VFSDir, "vfs");
4581 CmdArgs.push_back("-module-dependency-dir");
4582 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004583 }
4584
Richard Smith9887d792014-10-17 01:42:53 +00004585 if (HaveModules)
4586 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004587
Douglas Gregor35b04d62013-02-07 19:01:24 +00004588 // Pass through all -fmodules-ignore-macro arguments.
4589 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004590 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4591 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004592
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004593 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4594
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004595 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4596 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4597 D.Diag(diag::err_drv_argument_not_allowed_with)
4598 << A->getAsString(Args) << "-fbuild-session-timestamp";
4599
4600 llvm::sys::fs::file_status Status;
4601 if (llvm::sys::fs::status(A->getValue(), Status))
4602 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004603 CmdArgs.push_back(Args.MakeArgString(
4604 "-fbuild-session-timestamp=" +
4605 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004606 }
4607
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004608 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004609 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4610 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004611 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4612
4613 Args.AddLastArg(CmdArgs,
4614 options::OPT_fmodules_validate_once_per_build_session);
4615 }
4616
Ben Langmuirdcf73862014-03-12 00:06:17 +00004617 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4618
John McCalldfea9982010-04-09 19:12:06 +00004619 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004620 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004621 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004622 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004623
Anders Carlssond470fef2010-11-21 00:09:52 +00004624 // -felide-constructors is the default.
4625 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004626 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004627 CmdArgs.push_back("-fno-elide-constructors");
4628
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004629 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004630
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004631 if (KernelOrKext || (types::isCXX(InputType) &&
4632 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4633 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004634 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004635
Tony Linthicum76329bf2011-12-12 21:14:55 +00004636 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004637 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4638 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004639 CmdArgs.push_back("-fshort-enums");
4640
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004641 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004642 if (Arg *A = Args.getLastArg(
4643 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4644 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4645 if (A->getOption().matches(options::OPT_funsigned_char) ||
4646 A->getOption().matches(options::OPT_fno_signed_char)) {
4647 CmdArgs.push_back("-fno-signed-char");
4648 }
4649 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004650 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004651 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004652
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004653 // -fuse-cxa-atexit is default.
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00004654 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4655 options::OPT_fno_use_cxa_atexit,
4656 !IsWindowsCygnus && !IsWindowsGNU &&
4657 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4658 getToolChain().getArch() != llvm::Triple::hexagon &&
4659 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004660 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004661 CmdArgs.push_back("-fno-use-cxa-atexit");
4662
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004663 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004664 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004665 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004666 CmdArgs.push_back("-fms-extensions");
4667
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004668 // -fno-use-line-directives is default.
4669 if (Args.hasFlag(options::OPT_fuse_line_directives,
4670 options::OPT_fno_use_line_directives, false))
4671 CmdArgs.push_back("-fuse-line-directives");
4672
Francois Pichet1b4f1632011-09-17 04:32:15 +00004673 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004674 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004675 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004676 (IsWindowsMSVC &&
4677 Args.hasFlag(options::OPT_fms_extensions,
4678 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004679 CmdArgs.push_back("-fms-compatibility");
4680
David Majnemerc371ff02015-03-22 08:39:22 +00004681 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004682 VersionTuple MSVT = visualstudio::getMSVCVersion(
4683 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4684 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004685 CmdArgs.push_back(
4686 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004687
David Majnemer8db91762015-05-18 04:49:30 +00004688 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4689 if (ImplyVCPPCXXVer) {
4690 if (IsMSVC2015Compatible)
4691 CmdArgs.push_back("-std=c++14");
4692 else
4693 CmdArgs.push_back("-std=c++11");
4694 }
4695
Eric Christopher5ecce122013-02-18 00:38:31 +00004696 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004697 if (Args.hasFlag(options::OPT_fborland_extensions,
4698 options::OPT_fno_borland_extensions, false))
4699 CmdArgs.push_back("-fborland-extensions");
4700
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004701 // -fno-declspec is default, except for PS4.
4702 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4703 getToolChain().getTriple().isPS4()))
4704 CmdArgs.push_back("-fdeclspec");
4705 else if (Args.hasArg(options::OPT_fno_declspec))
4706 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4707
David Majnemerc371ff02015-03-22 08:39:22 +00004708 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4709 // than 19.
4710 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4711 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004712 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004713 CmdArgs.push_back("-fno-threadsafe-statics");
4714
Francois Pichet02744872011-09-01 16:38:08 +00004715 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4716 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004717 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004718 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004719 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004720
Chandler Carruthe03aa552010-04-17 20:17:31 +00004721 // -fgnu-keywords default varies depending on language; only pass if
4722 // specified.
4723 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004724 options::OPT_fno_gnu_keywords))
4725 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004727 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004728 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004729 CmdArgs.push_back("-fgnu89-inline");
4730
Chad Rosier9c76d242012-03-15 22:31:42 +00004731 if (Args.hasArg(options::OPT_fno_inline))
4732 CmdArgs.push_back("-fno-inline");
4733
Chad Rosier64d6be92012-03-06 21:17:19 +00004734 if (Args.hasArg(options::OPT_fno_inline_functions))
4735 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004736
John McCall5fb5df92012-06-20 06:18:46 +00004737 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004738
John McCall5fb5df92012-06-20 06:18:46 +00004739 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004740 // legacy is the default. Except for deployment taget of 10.5,
4741 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4742 // gets ignored silently.
4743 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004744 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4745 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004746 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004747 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004748 if (getToolChain().UseObjCMixedDispatch())
4749 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4750 else
4751 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4752 }
4753 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004754
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004755 // When ObjectiveC legacy runtime is in effect on MacOSX,
4756 // turn on the option to do Array/Dictionary subscripting
4757 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004758 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004759 getToolChain().getTriple().isMacOSX() &&
4760 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4761 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004762 objcRuntime.isNeXTFamily())
4763 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004764
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004765 // -fencode-extended-block-signature=1 is default.
4766 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4767 CmdArgs.push_back("-fencode-extended-block-signature");
4768 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004769
John McCall24fc0de2011-07-06 00:26:06 +00004770 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4771 // NOTE: This logic is duplicated in ToolChains.cpp.
4772 bool ARC = isObjCAutoRefCount(Args);
4773 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004774 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004775
John McCall24fc0de2011-07-06 00:26:06 +00004776 CmdArgs.push_back("-fobjc-arc");
4777
Chandler Carruth491db322011-11-04 07:34:47 +00004778 // FIXME: It seems like this entire block, and several around it should be
4779 // wrapped in isObjC, but for now we just use it here as this is where it
4780 // was being used previously.
4781 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4782 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4783 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4784 else
4785 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4786 }
4787
John McCall24fc0de2011-07-06 00:26:06 +00004788 // Allow the user to enable full exceptions code emission.
4789 // We define off for Objective-CC, on for Objective-C++.
4790 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4791 options::OPT_fno_objc_arc_exceptions,
4792 /*default*/ types::isCXX(InputType)))
4793 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004794
John McCall24fc0de2011-07-06 00:26:06 +00004795 }
4796
4797 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4798 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004799 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004800 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004801
John McCall24fc0de2011-07-06 00:26:06 +00004802 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4803 // takes precedence.
4804 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4805 if (!GCArg)
4806 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4807 if (GCArg) {
4808 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004809 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004810 } else if (getToolChain().SupportsObjCGC()) {
4811 GCArg->render(Args, CmdArgs);
4812 } else {
4813 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004814 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004815 }
4816 }
4817
Bob Wilsonb111ec92015-03-02 19:01:14 +00004818 if (Args.hasFlag(options::OPT_fapplication_extension,
4819 options::OPT_fno_application_extension, false))
4820 CmdArgs.push_back("-fapplication-extension");
4821
Reid Klecknerc542d372014-06-27 17:02:02 +00004822 // Handle GCC-style exception args.
4823 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004824 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4825 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004826
Tim Northovere931f9f2015-10-30 16:30:41 +00004827 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004828 CmdArgs.push_back("-fsjlj-exceptions");
4829
4830 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004831 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4832 options::OPT_fno_assume_sane_operator_new))
4833 CmdArgs.push_back("-fno-assume-sane-operator-new");
4834
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004835 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4836 // most platforms.
4837 if (Args.hasFlag(options::OPT_fsized_deallocation,
4838 options::OPT_fno_sized_deallocation, false))
4839 CmdArgs.push_back("-fsized-deallocation");
4840
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004841 // -fconstant-cfstrings is default, and may be subject to argument translation
4842 // on Darwin.
4843 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4844 options::OPT_fno_constant_cfstrings) ||
4845 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4846 options::OPT_mno_constant_cfstrings))
4847 CmdArgs.push_back("-fno-constant-cfstrings");
4848
John Thompsoned4e2952009-11-05 20:14:16 +00004849 // -fshort-wchar default varies depending on platform; only
4850 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004851 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4852 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004853 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004854
Hans Wennborg28c96312013-07-31 23:39:13 +00004855 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004856 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004858 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004859
Daniel Dunbar096ed292011-10-05 21:04:55 +00004860 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4861 // -fno-pack-struct doesn't apply to -fpack-struct=.
4862 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004863 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004864 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004865 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004866 } else if (Args.hasFlag(options::OPT_fpack_struct,
4867 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004868 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004869 }
4870
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004871 // Handle -fmax-type-align=N and -fno-type-align
4872 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4873 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4874 if (!SkipMaxTypeAlign) {
4875 std::string MaxTypeAlignStr = "-fmax-type-align=";
4876 MaxTypeAlignStr += A->getValue();
4877 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4878 }
4879 } else if (getToolChain().getTriple().isOSDarwin()) {
4880 if (!SkipMaxTypeAlign) {
4881 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4882 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4883 }
4884 }
4885
John Brawna7b4ec02015-08-10 11:11:28 +00004886 // -fcommon is the default unless compiling kernel code or the target says so
4887 bool NoCommonDefault =
4888 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4889 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4890 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004891 CmdArgs.push_back("-fno-common");
4892
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004893 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004894 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004895 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004896 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004897 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004898 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004899
Daniel Dunbar6358d682010-10-15 22:30:42 +00004900 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004901 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004902 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004904
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004905 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4907 StringRef value = inputCharset->getValue();
4908 if (value != "UTF-8")
4909 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4910 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004911 }
4912
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004913 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004914 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4915 StringRef value = execCharset->getValue();
4916 if (value != "UTF-8")
4917 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4918 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004919 }
4920
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004921 // -fcaret-diagnostics is default.
4922 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4923 options::OPT_fno_caret_diagnostics, true))
4924 CmdArgs.push_back("-fno-caret-diagnostics");
4925
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004926 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004927 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004928 options::OPT_fno_diagnostics_fixit_info))
4929 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004930
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004931 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004932 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004933 options::OPT_fno_diagnostics_show_option))
4934 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004935
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004936 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004938 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004939 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004940 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004942 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004943 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004944 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004945 }
4946
Chandler Carruthb6766f02011-03-27 01:50:55 +00004947 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004948 options::OPT_fdiagnostics_show_note_include_stack,
4949 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004950 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004951 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004952 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4953 else
4954 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4955 }
4956
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004957 // Color diagnostics are the default, unless the terminal doesn't support
4958 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004959 // Support both clang's -f[no-]color-diagnostics and gcc's
4960 // -f[no-]diagnostics-colors[=never|always|auto].
4961 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004962 for (const auto &Arg : Args) {
4963 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004964 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4965 !O.matches(options::OPT_fdiagnostics_color) &&
4966 !O.matches(options::OPT_fno_color_diagnostics) &&
4967 !O.matches(options::OPT_fno_diagnostics_color) &&
4968 !O.matches(options::OPT_fdiagnostics_color_EQ))
4969 continue;
4970
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004971 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004972 if (O.matches(options::OPT_fcolor_diagnostics) ||
4973 O.matches(options::OPT_fdiagnostics_color)) {
4974 ShowColors = Colors_On;
4975 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4976 O.matches(options::OPT_fno_diagnostics_color)) {
4977 ShowColors = Colors_Off;
4978 } else {
4979 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004980 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004981 if (value == "always")
4982 ShowColors = Colors_On;
4983 else if (value == "never")
4984 ShowColors = Colors_Off;
4985 else if (value == "auto")
4986 ShowColors = Colors_Auto;
4987 else
4988 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004989 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004990 }
4991 }
4992 if (ShowColors == Colors_On ||
4993 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004994 CmdArgs.push_back("-fcolor-diagnostics");
4995
Nico Rieck7857d462013-09-11 00:38:02 +00004996 if (Args.hasArg(options::OPT_fansi_escape_codes))
4997 CmdArgs.push_back("-fansi-escape-codes");
4998
Daniel Dunbardb097022009-06-08 21:13:54 +00004999 if (!Args.hasFlag(options::OPT_fshow_source_location,
5000 options::OPT_fno_show_source_location))
5001 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005002
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005003 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005004 true))
5005 CmdArgs.push_back("-fno-show-column");
5006
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005007 if (!Args.hasFlag(options::OPT_fspell_checking,
5008 options::OPT_fno_spell_checking))
5009 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005010
Chad Rosierc8e56e82012-12-05 21:08:21 +00005011 // -fno-asm-blocks is default.
5012 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5013 false))
5014 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005015
Steven Wucb0d13f2015-01-16 23:05:28 +00005016 // -fgnu-inline-asm is default.
5017 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5018 options::OPT_fno_gnu_inline_asm, true))
5019 CmdArgs.push_back("-fno-gnu-inline-asm");
5020
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005021 // Enable vectorization per default according to the optimization level
5022 // selected. For optimization levels that want vectorization we use the alias
5023 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005024 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025 OptSpecifier VectorizeAliasOption =
5026 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005027 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005028 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005029 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005030
Chad Rosier136d67d2014-04-28 19:30:57 +00005031 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005032 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 OptSpecifier SLPVectAliasOption =
5034 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005035 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005036 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005037 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005038
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005039 // -fno-slp-vectorize-aggressive is default.
5040 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005041 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005042 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005043
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005044 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5045 A->render(Args, CmdArgs);
5046
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005047 // -fdollars-in-identifiers default varies depending on platform and
5048 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005049 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005050 options::OPT_fno_dollars_in_identifiers)) {
5051 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005052 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005053 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005054 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005055 }
5056
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005057 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5058 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005059 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005060 options::OPT_fno_unit_at_a_time)) {
5061 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005062 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005063 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005064
Eli Friedman055c9702011-11-02 01:53:16 +00005065 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5066 options::OPT_fno_apple_pragma_pack, false))
5067 CmdArgs.push_back("-fapple-pragma-pack");
5068
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005069 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005070 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5071 // by default.
5072 if (getToolChain().getArch() == llvm::Triple::le32) {
5073 CmdArgs.push_back("-fno-math-builtin");
5074 }
5075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5077//
5078// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005079#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005080 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005081 (getToolChain().getArch() == llvm::Triple::arm ||
5082 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005083 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5084 CmdArgs.push_back("-fno-builtin-strcat");
5085 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5086 CmdArgs.push_back("-fno-builtin-strcpy");
5087 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005088#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005089
Justin Bognera88f0122014-06-20 22:59:50 +00005090 // Enable rewrite includes if the user's asked for it or if we're generating
5091 // diagnostics.
5092 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5093 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005094 if (Args.hasFlag(options::OPT_frewrite_includes,
5095 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005096 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005097 CmdArgs.push_back("-frewrite-includes");
5098
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005099 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005100 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005101 options::OPT_traditional_cpp)) {
5102 if (isa<PreprocessJobAction>(JA))
5103 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005104 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005105 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005106 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005107
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005108 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005109 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005110
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005111 // Handle serialized diagnostics.
5112 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5113 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005114 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005115 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005116
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005117 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5118 CmdArgs.push_back("-fretain-comments-from-system-headers");
5119
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005120 // Forward -fcomment-block-commands to -cc1.
5121 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005122 // Forward -fparse-all-comments to -cc1.
5123 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005124
John Brawnad31ace2015-09-23 13:55:40 +00005125 // Turn -fplugin=name.so into -load name.so
5126 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5127 CmdArgs.push_back("-load");
5128 CmdArgs.push_back(A->getValue());
5129 A->claim();
5130 }
5131
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005132 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5133 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005134 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005135 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5136 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005137
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005138 // We translate this by hand to the -cc1 argument, since nightly test uses
5139 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005140 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005141 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005142 } else
Sean Silva14facf32015-06-09 01:57:17 +00005143 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005144 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005145
Bob Wilson23a55f12014-12-21 07:00:00 +00005146 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005147 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5148 // by the frontend.
5149 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5150 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005151
Daniel Dunbard67a3222009-03-30 06:36:42 +00005152 if (Output.getType() == types::TY_Dependencies) {
5153 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005154 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005155 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005156 CmdArgs.push_back(Output.getFilename());
5157 } else {
5158 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005159 }
5160
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005161 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005162
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005163 if (Input.isFilename())
5164 CmdArgs.push_back(Input.getFilename());
5165 else
5166 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005167
Chris Lattnere9d7d782009-11-03 19:50:27 +00005168 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5169
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005170 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005171
5172 // Optionally embed the -cc1 level arguments into the debug info, for build
5173 // analysis.
5174 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005175 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005176 for (const auto &Arg : Args)
5177 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005178
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005179 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005180 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005181 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005182 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005183 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005184 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005185 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005186 }
5187 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005188 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005189 }
5190
Eric Christopherd3804002013-02-22 20:12:52 +00005191 // Add the split debug info name to the command lines here so we
5192 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005193 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005194 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5195 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005196 const char *SplitDwarfOut;
5197 if (SplitDwarf) {
5198 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005199 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005200 CmdArgs.push_back(SplitDwarfOut);
5201 }
5202
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005203 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5204 // Include them with -fcuda-include-gpubinary.
5205 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005206 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005207 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005208 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005209 }
5210
Eric Christopherd3804002013-02-22 20:12:52 +00005211 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005212 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005213 Output.getType() == types::TY_Object &&
5214 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005215 auto CLCommand =
5216 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005217 C.addCommand(llvm::make_unique<FallbackCommand>(
5218 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005219 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005221 }
5222
Eric Christopherf1545832013-02-22 23:50:16 +00005223 // Handle the debug info splitting at object creation time if we're
5224 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005225 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005226 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005227 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005228
Roman Divacky178e01602011-02-10 16:52:03 +00005229 if (Arg *A = Args.getLastArg(options::OPT_pg))
5230 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005231 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5232 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005233
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005234 // Claim some arguments which clang supports automatically.
5235
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005236 // -fpch-preprocess is used with gcc to add a special marker in the output to
5237 // include the PCH file. Clang's PTH solution is completely transparent, so we
5238 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005239 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005240
Daniel Dunbar17731772009-03-23 19:03:36 +00005241 // Claim some arguments which clang doesn't support, but we don't
5242 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005243 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5244 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005245
Rafael Espindolab0092d72013-09-04 19:37:35 +00005246 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005247 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005248}
5249
John McCall5fb5df92012-06-20 06:18:46 +00005250/// Add options related to the Objective-C runtime/ABI.
5251///
5252/// Returns true if the runtime is non-fragile.
5253ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5254 ArgStringList &cmdArgs,
5255 RewriteKind rewriteKind) const {
5256 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257 Arg *runtimeArg =
5258 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5259 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005260
5261 // Just forward -fobjc-runtime= to the frontend. This supercedes
5262 // options about fragility.
5263 if (runtimeArg &&
5264 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5265 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005266 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005267 if (runtime.tryParse(value)) {
5268 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005269 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005270 }
5271
5272 runtimeArg->render(args, cmdArgs);
5273 return runtime;
5274 }
5275
5276 // Otherwise, we'll need the ABI "version". Version numbers are
5277 // slightly confusing for historical reasons:
5278 // 1 - Traditional "fragile" ABI
5279 // 2 - Non-fragile ABI, version 1
5280 // 3 - Non-fragile ABI, version 2
5281 unsigned objcABIVersion = 1;
5282 // If -fobjc-abi-version= is present, use that to set the version.
5283 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005284 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005285 if (value == "1")
5286 objcABIVersion = 1;
5287 else if (value == "2")
5288 objcABIVersion = 2;
5289 else if (value == "3")
5290 objcABIVersion = 3;
5291 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005292 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005293 } else {
5294 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005295 bool nonFragileABIIsDefault =
5296 (rewriteKind == RK_NonFragile ||
5297 (rewriteKind == RK_None &&
5298 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005299 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5300 options::OPT_fno_objc_nonfragile_abi,
5301 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005303#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5304 unsigned nonFragileABIVersion = 1;
5305#else
5306 unsigned nonFragileABIVersion = 2;
5307#endif
5308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005309 if (Arg *abiArg =
5310 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005311 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005312 if (value == "1")
5313 nonFragileABIVersion = 1;
5314 else if (value == "2")
5315 nonFragileABIVersion = 2;
5316 else
5317 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005318 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005319 }
5320
5321 objcABIVersion = 1 + nonFragileABIVersion;
5322 } else {
5323 objcABIVersion = 1;
5324 }
5325 }
5326
5327 // We don't actually care about the ABI version other than whether
5328 // it's non-fragile.
5329 bool isNonFragile = objcABIVersion != 1;
5330
5331 // If we have no runtime argument, ask the toolchain for its default runtime.
5332 // However, the rewriter only really supports the Mac runtime, so assume that.
5333 ObjCRuntime runtime;
5334 if (!runtimeArg) {
5335 switch (rewriteKind) {
5336 case RK_None:
5337 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5338 break;
5339 case RK_Fragile:
5340 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5341 break;
5342 case RK_NonFragile:
5343 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5344 break;
5345 }
5346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005348 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5349 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005350 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005351 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005353 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005354 } else {
5355 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5356 }
5357
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005359 } else {
5360 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005361 // Legacy behaviour is to target the gnustep runtime if we are i
5362 // non-fragile mode or the GCC runtime in fragile mode.
5363 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005365 else
5366 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005367 }
5368
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005369 cmdArgs.push_back(
5370 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005371 return runtime;
5372}
5373
Reid Klecknerc542d372014-06-27 17:02:02 +00005374static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5375 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5376 I += HaveDash;
5377 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005378}
Reid Klecknerc542d372014-06-27 17:02:02 +00005379
Benjamin Kramere003ca22015-10-28 13:54:16 +00005380namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005381struct EHFlags {
5382 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5383 bool Synch;
5384 bool Asynch;
5385 bool NoExceptC;
5386};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005387} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005388
5389/// /EH controls whether to run destructor cleanups when exceptions are
5390/// thrown. There are three modifiers:
5391/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5392/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5393/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5394/// - c: Assume that extern "C" functions are implicitly noexcept. This
5395/// modifier is an optimization, so we ignore it for now.
5396/// The default is /EHs-c-, meaning cleanups are disabled.
5397static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5398 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005400 std::vector<std::string> EHArgs =
5401 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005402 for (auto EHVal : EHArgs) {
5403 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5404 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005405 case 'a':
5406 EH.Asynch = maybeConsumeDash(EHVal, I);
5407 continue;
5408 case 'c':
5409 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5410 continue;
5411 case 's':
5412 EH.Synch = maybeConsumeDash(EHVal, I);
5413 continue;
5414 default:
5415 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005416 }
5417 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5418 break;
5419 }
5420 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005421
Reid Klecknerc542d372014-06-27 17:02:02 +00005422 return EH;
5423}
5424
Douglas Katzman3459ce22015-10-08 04:24:12 +00005425void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5426 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5427 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005428 unsigned RTOptionID = options::OPT__SLASH_MT;
5429
Hans Wennborgf1a74252013-09-10 20:18:04 +00005430 if (Args.hasArg(options::OPT__SLASH_LDd))
5431 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5432 // but defining _DEBUG is sticky.
5433 RTOptionID = options::OPT__SLASH_MTd;
5434
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005435 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005436 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005437
David Majnemere2afb472015-07-24 06:49:13 +00005438 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005439 switch (RTOptionID) {
5440 case options::OPT__SLASH_MD:
5441 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005442 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443 CmdArgs.push_back("-D_MT");
5444 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005445 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005446 break;
5447 case options::OPT__SLASH_MDd:
5448 CmdArgs.push_back("-D_DEBUG");
5449 CmdArgs.push_back("-D_MT");
5450 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005451 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 break;
5453 case options::OPT__SLASH_MT:
5454 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005455 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005456 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005457 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005458 break;
5459 case options::OPT__SLASH_MTd:
5460 CmdArgs.push_back("-D_DEBUG");
5461 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005462 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005463 break;
5464 default:
5465 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005466 }
5467
David Majnemere2afb472015-07-24 06:49:13 +00005468 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5469 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5470 } else {
5471 CmdArgs.push_back(FlagForCRT.data());
5472
5473 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5474 // users want. The /Za flag to cl.exe turns this off, but it's not
5475 // implemented in clang.
5476 CmdArgs.push_back("--dependent-lib=oldnames");
5477 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005478
Hans Wennborg8858a032014-07-21 23:42:07 +00005479 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5480 // would produce interleaved output, so ignore /showIncludes in such cases.
5481 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5482 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5483 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005484
David Majnemerf6072342014-07-01 22:24:56 +00005485 // This controls whether or not we emit RTTI data for polymorphic types.
5486 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5487 /*default=*/false))
5488 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005489
Reid Kleckner124955a2015-08-05 18:51:13 +00005490 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005491 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005492 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5493 // If we are emitting CV but not DWARF, don't build information that LLVM
5494 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005495 if (*EmitCodeView && !EmitDwarf)
5496 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5497 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005498 CmdArgs.push_back("-gcodeview");
5499
Reid Klecknerc542d372014-06-27 17:02:02 +00005500 const Driver &D = getToolChain().getDriver();
5501 EHFlags EH = parseClangCLEHFlags(D, Args);
5502 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005503 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005504 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005505 CmdArgs.push_back("-fexceptions");
5506 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005507
Hans Wennborge50cec32014-06-13 20:59:54 +00005508 // /EP should expand to -E -P.
5509 if (Args.hasArg(options::OPT__SLASH_EP)) {
5510 CmdArgs.push_back("-E");
5511 CmdArgs.push_back("-P");
5512 }
5513
David Majnemera5b195a2015-02-14 01:35:12 +00005514 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005515 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5516 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005517 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5518 else
5519 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5520
5521 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5522 VolatileOptionID = A->getOption().getID();
5523
5524 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5525 CmdArgs.push_back("-fms-volatile");
5526
David Majnemer86c318f2014-02-11 21:05:00 +00005527 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5528 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5529 if (MostGeneralArg && BestCaseArg)
5530 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5531 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5532
5533 if (MostGeneralArg) {
5534 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5535 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5536 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5537
5538 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5539 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5540 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5541 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5542 << FirstConflict->getAsString(Args)
5543 << SecondConflict->getAsString(Args);
5544
5545 if (SingleArg)
5546 CmdArgs.push_back("-fms-memptr-rep=single");
5547 else if (MultipleArg)
5548 CmdArgs.push_back("-fms-memptr-rep=multiple");
5549 else
5550 CmdArgs.push_back("-fms-memptr-rep=virtual");
5551 }
5552
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005553 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5554 A->render(Args, CmdArgs);
5555
Hans Wennborg81f74482013-09-10 01:07:07 +00005556 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5557 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005558 if (Args.hasArg(options::OPT__SLASH_fallback))
5559 CmdArgs.push_back("msvc-fallback");
5560 else
5561 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005562 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005563}
5564
Douglas Katzman95354292015-06-23 20:42:09 +00005565visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005566 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005567 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005568 return CLFallback.get();
5569}
5570
Daniel Sanders7f933f42015-01-30 17:35:23 +00005571void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5572 ArgStringList &CmdArgs) const {
5573 StringRef CPUName;
5574 StringRef ABIName;
5575 const llvm::Triple &Triple = getToolChain().getTriple();
5576 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5577
5578 CmdArgs.push_back("-target-abi");
5579 CmdArgs.push_back(ABIName.data());
5580}
5581
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005582void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005583 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005584 const ArgList &Args,
5585 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005586 ArgStringList CmdArgs;
5587
5588 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5589 const InputInfo &Input = Inputs[0];
5590
James Y Knight2db38f32015-08-15 03:45:25 +00005591 std::string TripleStr =
5592 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5593 const llvm::Triple Triple(TripleStr);
5594
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005595 // Don't warn about "clang -w -c foo.s"
5596 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005597 // and "clang -emit-llvm -c foo.s"
5598 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005599
Rafael Espindola577637a2015-01-03 00:06:04 +00005600 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005601
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005602 // Invoke ourselves in -cc1as mode.
5603 //
5604 // FIXME: Implement custom jobs for internal actions.
5605 CmdArgs.push_back("-cc1as");
5606
5607 // Add the "effective" target triple.
5608 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005609 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5610
5611 // Set the output mode, we currently only expect to be used as a real
5612 // assembler.
5613 CmdArgs.push_back("-filetype");
5614 CmdArgs.push_back("obj");
5615
Eric Christopher45f2e712012-12-18 00:31:10 +00005616 // Set the main file name, so that debug info works even with
5617 // -save-temps or preprocessed assembly.
5618 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005619 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005620
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005621 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005622 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005623 if (!CPU.empty()) {
5624 CmdArgs.push_back("-target-cpu");
5625 CmdArgs.push_back(Args.MakeArgString(CPU));
5626 }
5627
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005628 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005629 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005630
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005631 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005632 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005633
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005634 // Pass along any -I options so we get proper .include search paths.
5635 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5636
Eric Christopherfc3ee562012-01-10 00:38:01 +00005637 // Determine the original source input.
5638 const Action *SourceAction = &JA;
5639 while (SourceAction->getKind() != Action::InputClass) {
5640 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5641 SourceAction = SourceAction->getInputs()[0];
5642 }
5643
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005644 // Forward -g and handle debug info related flags, assuming we are dealing
5645 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005646 if (SourceAction->getType() == types::TY_Asm ||
5647 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005648 bool WantDebug = false;
5649 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005650 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005651 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5652 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005653 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005654 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005655 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005656 if (DwarfVersion == 0)
5657 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005658 RenderDebugEnablingArgs(Args, CmdArgs,
5659 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5660 : CodeGenOptions::NoDebugInfo),
5661 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005662
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005663 // Add the -fdebug-compilation-dir flag if needed.
5664 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005665
5666 // Set the AT_producer to the clang version when using the integrated
5667 // assembler on assembly source files.
5668 CmdArgs.push_back("-dwarf-debug-producer");
5669 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005670
5671 // And pass along -I options
5672 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005673 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005674
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005675 // Handle -fPIC et al -- the relocation-model affects the assembler
5676 // for some targets.
5677 llvm::Reloc::Model RelocationModel;
5678 unsigned PICLevel;
5679 bool IsPIE;
5680 std::tie(RelocationModel, PICLevel, IsPIE) =
5681 ParsePICArgs(getToolChain(), Triple, Args);
5682
5683 const char *RMName = RelocationModelName(RelocationModel);
5684 if (RMName) {
5685 CmdArgs.push_back("-mrelocation-model");
5686 CmdArgs.push_back(RMName);
5687 }
5688
Kevin Enderby292dc082011-12-22 19:31:58 +00005689 // Optionally embed the -cc1as level arguments into the debug info, for build
5690 // analysis.
5691 if (getToolChain().UseDwarfDebugFlags()) {
5692 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005693 for (const auto &Arg : Args)
5694 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005695
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005696 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005697 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5698 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005699 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005700 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005701 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005702 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005703 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005704 }
5705 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005706 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005707 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005708
5709 // FIXME: Add -static support, once we have it.
5710
Daniel Sanders7f933f42015-01-30 17:35:23 +00005711 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005712 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005713 default:
5714 break;
5715
5716 case llvm::Triple::mips:
5717 case llvm::Triple::mipsel:
5718 case llvm::Triple::mips64:
5719 case llvm::Triple::mips64el:
5720 AddMIPSTargetArgs(Args, CmdArgs);
5721 break;
5722 }
5723
David Blaikie372d9502014-01-17 03:17:40 +00005724 // Consume all the warning flags. Usually this would be handled more
5725 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5726 // doesn't handle that so rather than warning about unused flags that are
5727 // actually used, we'll lie by omission instead.
5728 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005729 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5730 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005731
David Blaikie9260ed62013-07-25 21:19:01 +00005732 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5733 getToolChain().getDriver());
5734
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005735 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005736
5737 assert(Output.isFilename() && "Unexpected lipo output.");
5738 CmdArgs.push_back("-o");
5739 CmdArgs.push_back(Output.getFilename());
5740
Daniel Dunbarb440f562010-08-02 02:38:21 +00005741 assert(Input.isFilename() && "Invalid input.");
5742 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005743
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005744 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005745 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005746
5747 // Handle the debug info splitting at object creation time if we're
5748 // creating an object.
5749 // TODO: Currently only works on linux with newer objcopy.
5750 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005751 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005752 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005753 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005754}
5755
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005756void GnuTool::anchor() {}
5757
Daniel Dunbara3246a02009-03-18 08:07:30 +00005758void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005759 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005760 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005761 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005762 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005763 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005764
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005765 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005766 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005767 // Don't forward any -g arguments to assembly steps.
5768 if (isa<AssembleJobAction>(JA) &&
5769 A->getOption().matches(options::OPT_g_Group))
5770 continue;
5771
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005772 // Don't forward any -W arguments to assembly and link steps.
5773 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5774 A->getOption().matches(options::OPT_W_Group))
5775 continue;
5776
Daniel Dunbar2da02722009-03-19 07:55:12 +00005777 // It is unfortunate that we have to claim here, as this means
5778 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005779 // platforms using a generic gcc, even if we are just using gcc
5780 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005781 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005782 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005783 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005784 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005785
Daniel Dunbar4e295052010-01-25 22:35:08 +00005786 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005787
5788 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005789 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005790 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005791 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005792 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005793 }
5794
Daniel Dunbar5716d872009-05-02 21:41:52 +00005795 // Try to force gcc to match the tool chain we want, if we recognize
5796 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005797 //
5798 // FIXME: The triple class should directly provide the information we want
5799 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005800 switch (getToolChain().getArch()) {
5801 default:
5802 break;
5803 case llvm::Triple::x86:
5804 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005805 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005806 break;
5807 case llvm::Triple::x86_64:
5808 case llvm::Triple::ppc64:
5809 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005810 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005811 break;
5812 case llvm::Triple::sparcel:
5813 CmdArgs.push_back("-EL");
5814 break;
5815 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005816
Daniel Dunbarb440f562010-08-02 02:38:21 +00005817 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005818 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005819 CmdArgs.push_back(Output.getFilename());
5820 } else {
5821 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005822 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005823 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005825 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005826
5827 // Only pass -x if gcc will understand it; otherwise hope gcc
5828 // understands the suffix correctly. The main use case this would go
5829 // wrong in is for linker inputs if they happened to have an odd
5830 // suffix; really the only way to get this to happen is a command
5831 // like '-x foobar a.c' which will treat a.c like a linker input.
5832 //
5833 // FIXME: For the linker case specifically, can we safely convert
5834 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005835 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005836 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005837 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5838 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005839 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005840 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005841 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005843 else if (II.getType() == types::TY_ModuleFile)
5844 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005845 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005846
Daniel Dunbara3246a02009-03-18 08:07:30 +00005847 if (types::canTypeBeUserSpecified(II.getType())) {
5848 CmdArgs.push_back("-x");
5849 CmdArgs.push_back(types::getTypeName(II.getType()));
5850 }
5851
Daniel Dunbarb440f562010-08-02 02:38:21 +00005852 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005853 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005854 else {
5855 const Arg &A = II.getInputArg();
5856
5857 // Reverse translate some rewritten options.
5858 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5859 CmdArgs.push_back("-lstdc++");
5860 continue;
5861 }
5862
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005863 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005864 A.render(Args, CmdArgs);
5865 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005866 }
5867
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005868 const std::string customGCCName = D.getCCCGenericGCCName();
5869 const char *GCCName;
5870 if (!customGCCName.empty())
5871 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005872 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005873 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005874 } else
5875 GCCName = "gcc";
5876
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005877 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005878 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005879}
5880
Douglas Katzman95354292015-06-23 20:42:09 +00005881void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5882 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005883 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005884}
5885
Douglas Katzman95354292015-06-23 20:42:09 +00005886void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5887 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005888 const Driver &D = getToolChain().getDriver();
5889
Eric Christophercc7ff502015-01-29 00:56:17 +00005890 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005891 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005892 case types::TY_LLVM_IR:
5893 case types::TY_LTO_IR:
5894 case types::TY_LLVM_BC:
5895 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005896 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005897 break;
5898 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005899 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005900 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005901 case types::TY_Nothing:
5902 CmdArgs.push_back("-fsyntax-only");
5903 break;
5904 default:
5905 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005906 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005907}
5908
Douglas Katzman95354292015-06-23 20:42:09 +00005909void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5910 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005911 // The types are (hopefully) good enough.
5912}
5913
Tony Linthicum76329bf2011-12-12 21:14:55 +00005914// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005915void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5916 ArgStringList &CmdArgs) const {}
5917void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5918 const InputInfo &Output,
5919 const InputInfoList &Inputs,
5920 const ArgList &Args,
5921 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005922 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005923
5924 const Driver &D = getToolChain().getDriver();
5925 ArgStringList CmdArgs;
5926
5927 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005928 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005929 CmdArgs.push_back(Args.MakeArgString(MarchString));
5930
5931 RenderExtraToolArgs(JA, CmdArgs);
5932
5933 if (Output.isFilename()) {
5934 CmdArgs.push_back("-o");
5935 CmdArgs.push_back(Output.getFilename());
5936 } else {
5937 assert(Output.isNothing() && "Unexpected output");
5938 CmdArgs.push_back("-fsyntax-only");
5939 }
5940
Douglas Katzman54366072015-07-27 16:53:08 +00005941 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005942 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005944 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005945
Tony Linthicum76329bf2011-12-12 21:14:55 +00005946 // Only pass -x if gcc will understand it; otherwise hope gcc
5947 // understands the suffix correctly. The main use case this would go
5948 // wrong in is for linker inputs if they happened to have an odd
5949 // suffix; really the only way to get this to happen is a command
5950 // like '-x foobar a.c' which will treat a.c like a linker input.
5951 //
5952 // FIXME: For the linker case specifically, can we safely convert
5953 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005954 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005955 // Don't try to pass LLVM or AST inputs to a generic gcc.
5956 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5957 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5958 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005959 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005960 else if (II.getType() == types::TY_AST)
5961 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005962 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005963 else if (II.getType() == types::TY_ModuleFile)
5964 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005965 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005966
5967 if (II.isFilename())
5968 CmdArgs.push_back(II.getFilename());
5969 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005970 // Don't render as input, we need gcc to do the translations.
5971 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005972 II.getInputArg().render(Args, CmdArgs);
5973 }
5974
5975 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005976 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005978}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005979
Douglas Katzman95354292015-06-23 20:42:09 +00005980void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5981 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005982 // The types are (hopefully) good enough.
5983}
5984
Douglas Katzman54366072015-07-27 16:53:08 +00005985static void
5986constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5987 const toolchains::HexagonToolChain &ToolChain,
5988 const InputInfo &Output, const InputInfoList &Inputs,
5989 const ArgList &Args, ArgStringList &CmdArgs,
5990 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005991
Matthew Curtise689b052012-12-06 15:46:07 +00005992 const Driver &D = ToolChain.getDriver();
5993
Matthew Curtise689b052012-12-06 15:46:07 +00005994 //----------------------------------------------------------------------------
5995 //
5996 //----------------------------------------------------------------------------
5997 bool hasStaticArg = Args.hasArg(options::OPT_static);
5998 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005999 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006000 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6001 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6002 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006003 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006004 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006005
Matthew Curtise689b052012-12-06 15:46:07 +00006006 //----------------------------------------------------------------------------
6007 // Silence warnings for various options
6008 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006009
Matthew Curtise689b052012-12-06 15:46:07 +00006010 Args.ClaimAllArgs(options::OPT_g_Group);
6011 Args.ClaimAllArgs(options::OPT_emit_llvm);
6012 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6013 // handled somewhere else.
6014 Args.ClaimAllArgs(options::OPT_static_libgcc);
6015
6016 //----------------------------------------------------------------------------
6017 //
6018 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006019 for (const auto &Opt : ToolChain.ExtraOpts)
6020 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006021
Douglas Katzman54366072015-07-27 16:53:08 +00006022 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006023 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006024
Matthew Curtise689b052012-12-06 15:46:07 +00006025 if (buildingLib) {
6026 CmdArgs.push_back("-shared");
6027 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6028 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006029 }
6030
Matthew Curtise689b052012-12-06 15:46:07 +00006031 if (hasStaticArg)
6032 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006033
Matthew Curtise8f80a12012-12-06 17:49:03 +00006034 if (buildPIE && !buildingLib)
6035 CmdArgs.push_back("-pie");
6036
Douglas Katzman54366072015-07-27 16:53:08 +00006037 if (const char *v =
6038 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006039 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006040 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006041 }
6042
Matthew Curtise689b052012-12-06 15:46:07 +00006043 //----------------------------------------------------------------------------
6044 //
6045 //----------------------------------------------------------------------------
6046 CmdArgs.push_back("-o");
6047 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006048
Matthew Curtise689b052012-12-06 15:46:07 +00006049 const std::string MarchSuffix = "/" + MarchString;
6050 const std::string G0Suffix = "/G0";
6051 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006052 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006053 const std::string StartFilesDir =
6054 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006055
6056 //----------------------------------------------------------------------------
6057 // moslib
6058 //----------------------------------------------------------------------------
6059 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006060 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006061
Sean Silva14facf32015-06-09 01:57:17 +00006062 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6063 A->claim();
6064 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006065 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006066 }
Matthew Curtise689b052012-12-06 15:46:07 +00006067 if (oslibs.empty()) {
6068 oslibs.push_back("standalone");
6069 hasStandalone = true;
6070 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006071
Matthew Curtise689b052012-12-06 15:46:07 +00006072 //----------------------------------------------------------------------------
6073 // Start Files
6074 //----------------------------------------------------------------------------
6075 if (incStdLib && incStartFiles) {
6076
6077 if (!buildingLib) {
6078 if (hasStandalone) {
6079 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006080 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006081 }
6082 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6083 }
6084 std::string initObj = useShared ? "/initS.o" : "/init.o";
6085 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6086 }
6087
6088 //----------------------------------------------------------------------------
6089 // Library Search Paths
6090 //----------------------------------------------------------------------------
6091 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006092 for (const auto &LibPath : LibPaths)
6093 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006094
6095 //----------------------------------------------------------------------------
6096 //
6097 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006098 Args.AddAllArgs(CmdArgs,
6099 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6100 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006101
6102 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6103
6104 //----------------------------------------------------------------------------
6105 // Libraries
6106 //----------------------------------------------------------------------------
6107 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006108 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006109 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6110 CmdArgs.push_back("-lm");
6111 }
6112
6113 CmdArgs.push_back("--start-group");
6114
6115 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006116 for (const std::string &Lib : oslibs)
6117 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006118 CmdArgs.push_back("-lc");
6119 }
6120 CmdArgs.push_back("-lgcc");
6121
6122 CmdArgs.push_back("--end-group");
6123 }
6124
6125 //----------------------------------------------------------------------------
6126 // End files
6127 //----------------------------------------------------------------------------
6128 if (incStdLib && incStartFiles) {
6129 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6130 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6131 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006132}
6133
Douglas Katzman95354292015-06-23 20:42:09 +00006134void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6135 const InputInfo &Output,
6136 const InputInfoList &Inputs,
6137 const ArgList &Args,
6138 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006139
Douglas Katzman54366072015-07-27 16:53:08 +00006140 const toolchains::HexagonToolChain &ToolChain =
6141 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006142
6143 ArgStringList CmdArgs;
6144 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6145 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006146
6147 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006148 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006149 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150}
6151// Hexagon tools end.
6152
Tom Stellard8fa33092015-07-18 01:49:05 +00006153void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6154 const InputInfo &Output,
6155 const InputInfoList &Inputs,
6156 const ArgList &Args,
6157 const char *LinkingOutput) const {
6158
6159 std::string Linker = getToolChain().GetProgramPath(getShortName());
6160 ArgStringList CmdArgs;
6161 CmdArgs.push_back("-flavor");
6162 CmdArgs.push_back("gnu");
6163 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006164 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006165 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6166 CmdArgs.push_back("-o");
6167 CmdArgs.push_back(Output.getFilename());
6168 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6169 CmdArgs, Inputs));
6170}
6171// AMDGPU tools end.
6172
Renato Golin7c542b42015-07-27 23:44:45 +00006173const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006174 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006175 if (!Arch.empty())
6176 MArch = Arch;
6177 else
Bernard Ogden31561762013-12-12 13:27:11 +00006178 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006179 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006180
6181 // Handle -march=native.
6182 if (MArch == "native") {
6183 std::string CPU = llvm::sys::getHostCPUName();
6184 if (CPU != "generic") {
6185 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006186 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006187 // If there is no valid architecture suffix for this CPU we don't know how
6188 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006189 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006190 MArch = "";
6191 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006192 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006193 }
6194 }
6195
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006196 return MArch;
6197}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006198
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006199/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006200StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006201 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006202 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6203 // here means an -march=native that we can't handle, so instead return no CPU.
6204 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006205 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006206
John Brawna95c1a82015-05-08 12:52:18 +00006207 // We need to return an empty string here on invalid MArch values as the
6208 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006209 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006210}
6211
6212/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006213std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006214 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006215 // FIXME: Warn on inconsistent use of -mcpu and -march.
6216 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006217 if (!CPU.empty()) {
6218 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006219 // Handle -mcpu=native.
6220 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006221 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006222 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006223 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006224 }
6225
Renato Goline17c5802015-07-27 23:44:42 +00006226 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006227}
6228
6229/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006230/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006231// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006232StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6233 const llvm::Triple &Triple) {
6234 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006235 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006236 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006237 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006238 if (ArchKind == llvm::ARM::AK_INVALID)
6239 // In case of generic Arch, i.e. "arm",
6240 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006241 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006242 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006243 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6244 // armv7k triple if it's actually been specified via "-arch armv7k".
6245 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
6246 ? llvm::ARM::AK_ARMV7K
6247 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006248 }
Renato Golin3c007252015-05-28 15:05:53 +00006249 if (ArchKind == llvm::ARM::AK_INVALID)
6250 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006251 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006252}
6253
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006254void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006255 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006256 if (Args.hasArg(options::OPT_r))
6257 return;
6258
John Brawn94fd9632015-05-21 12:19:49 +00006259 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6260 // to generate BE-8 executables.
6261 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6262 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006263}
6264
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006265mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006266 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6267 // was first introduced in Release 3. However, other compilers have
6268 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006269 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6270 .Case("mips1", NanLegacy)
6271 .Case("mips2", NanLegacy)
6272 .Case("mips3", NanLegacy)
6273 .Case("mips4", NanLegacy)
6274 .Case("mips5", NanLegacy)
6275 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006276 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006277 .Case("mips32r3", NanLegacy | Nan2008)
6278 .Case("mips32r5", NanLegacy | Nan2008)
6279 .Case("mips32r6", Nan2008)
6280 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006281 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006282 .Case("mips64r3", NanLegacy | Nan2008)
6283 .Case("mips64r5", NanLegacy | Nan2008)
6284 .Case("mips64r6", Nan2008)
6285 .Default(NanLegacy);
6286}
6287
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006288bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6289 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6290 return A && (A->getValue() == StringRef(Value));
6291}
6292
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006293bool mips::isUCLibc(const ArgList &Args) {
6294 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006295 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006296}
6297
Daniel Sanders2bf13662014-07-10 14:40:57 +00006298bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006299 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6300 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006301 .Case("2008", true)
6302 .Case("legacy", false)
6303 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006304
6305 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006306 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006307 .Cases("mips32r6", "mips64r6", true)
6308 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006309
6310 return false;
6311}
6312
Daniel Sanders379d44b2014-07-16 11:52:23 +00006313bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006314 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006315 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006316 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006317 return false;
6318
6319 if (ABIName != "32")
6320 return false;
6321
Toma Tabacu94ea6862015-06-16 13:54:13 +00006322 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6323 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006324 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006325 return false;
6326
Daniel Sanders379d44b2014-07-16 11:52:23 +00006327 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006328 .Cases("mips2", "mips3", "mips4", "mips5", true)
6329 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6330 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6331 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006332}
6333
Toma Tabacu94ea6862015-06-16 13:54:13 +00006334bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6335 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006336 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006337 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6338
6339 // FPXX shouldn't be used if -msingle-float is present.
6340 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6341 options::OPT_mdouble_float))
6342 if (A->getOption().matches(options::OPT_msingle_float))
6343 UseFPXX = false;
6344
6345 return UseFPXX;
6346}
6347
Tim Northover157d9112014-01-16 08:48:16 +00006348llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006349 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6350 // archs which Darwin doesn't use.
6351
6352 // The matching this routine does is fairly pointless, since it is neither the
6353 // complete architecture list, nor a reasonable subset. The problem is that
6354 // historically the driver driver accepts this and also ties its -march=
6355 // handling to the architecture name, so we need to be careful before removing
6356 // support for it.
6357
6358 // This code must be kept in sync with Clang's Darwin specific argument
6359 // translation.
6360
6361 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006362 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6363 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6364 .Case("ppc64", llvm::Triple::ppc64)
6365 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6366 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6367 llvm::Triple::x86)
6368 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6369 // This is derived from the driver driver.
6370 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6371 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6372 .Cases("armv7s", "xscale", llvm::Triple::arm)
6373 .Case("arm64", llvm::Triple::aarch64)
6374 .Case("r600", llvm::Triple::r600)
6375 .Case("amdgcn", llvm::Triple::amdgcn)
6376 .Case("nvptx", llvm::Triple::nvptx)
6377 .Case("nvptx64", llvm::Triple::nvptx64)
6378 .Case("amdil", llvm::Triple::amdil)
6379 .Case("spir", llvm::Triple::spir)
6380 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006381}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006382
Tim Northover157d9112014-01-16 08:48:16 +00006383void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006384 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006385 T.setArch(Arch);
6386
6387 if (Str == "x86_64h")
6388 T.setArchName(Str);
6389 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6390 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006391 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006392 }
6393}
6394
Bob Wilsondecc03e2012-11-23 06:14:39 +00006395const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006396 const InputInfo &Input) {
6397 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006398}
6399
Bob Wilsondecc03e2012-11-23 06:14:39 +00006400const char *Clang::getBaseInputStem(const ArgList &Args,
6401 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006402 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006403
Chris Lattner906bb902011-01-16 08:14:11 +00006404 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006405 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006406
6407 return Str;
6408}
6409
Bob Wilsondecc03e2012-11-23 06:14:39 +00006410const char *Clang::getDependencyFileName(const ArgList &Args,
6411 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006412 // FIXME: Think about this more.
6413 std::string Res;
6414
6415 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006416 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006417 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006418 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006419 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006420 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006421 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006422}
6423
Douglas Katzman95354292015-06-23 20:42:09 +00006424void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6425 const InputInfo &Output,
6426 const InputInfoList &Inputs,
6427 const ArgList &Args,
6428 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006429 const ToolChain &ToolChain = getToolChain();
6430 const Driver &D = ToolChain.getDriver();
6431 ArgStringList CmdArgs;
6432
6433 // Silence warning for "clang -g foo.o -o foo"
6434 Args.ClaimAllArgs(options::OPT_g_Group);
6435 // and "clang -emit-llvm foo.o -o foo"
6436 Args.ClaimAllArgs(options::OPT_emit_llvm);
6437 // and for "clang -w foo.o -o foo". Other warning options are already
6438 // handled somewhere else.
6439 Args.ClaimAllArgs(options::OPT_w);
6440
6441 if (!D.SysRoot.empty())
6442 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6443
6444 // CloudABI only supports static linkage.
6445 CmdArgs.push_back("-Bstatic");
6446 CmdArgs.push_back("--eh-frame-hdr");
6447 CmdArgs.push_back("--gc-sections");
6448
6449 if (Output.isFilename()) {
6450 CmdArgs.push_back("-o");
6451 CmdArgs.push_back(Output.getFilename());
6452 } else {
6453 assert(Output.isNothing() && "Invalid output.");
6454 }
6455
6456 if (!Args.hasArg(options::OPT_nostdlib) &&
6457 !Args.hasArg(options::OPT_nostartfiles)) {
6458 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6459 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6460 }
6461
6462 Args.AddAllArgs(CmdArgs, options::OPT_L);
6463 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6464 for (const auto &Path : Paths)
6465 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006466 Args.AddAllArgs(CmdArgs,
6467 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6468 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006469
Teresa Johnson945bc502015-10-15 20:35:53 +00006470 if (D.isUsingLTO())
6471 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006472
6473 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6474
6475 if (!Args.hasArg(options::OPT_nostdlib) &&
6476 !Args.hasArg(options::OPT_nodefaultlibs)) {
6477 if (D.CCCIsCXX())
6478 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6479 CmdArgs.push_back("-lc");
6480 CmdArgs.push_back("-lcompiler_rt");
6481 }
6482
6483 if (!Args.hasArg(options::OPT_nostdlib) &&
6484 !Args.hasArg(options::OPT_nostartfiles))
6485 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6486
6487 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006488 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006489}
6490
Douglas Katzman95354292015-06-23 20:42:09 +00006491void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6492 const InputInfo &Output,
6493 const InputInfoList &Inputs,
6494 const ArgList &Args,
6495 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006496 ArgStringList CmdArgs;
6497
6498 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6499 const InputInfo &Input = Inputs[0];
6500
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006501 // Determine the original source input.
6502 const Action *SourceAction = &JA;
6503 while (SourceAction->getKind() != Action::InputClass) {
6504 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6505 SourceAction = SourceAction->getInputs()[0];
6506 }
6507
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006508 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006509 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006510 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6511 // FIXME: at run-time detect assembler capabilities or rely on version
6512 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006513 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006514 const llvm::Triple &T(getToolChain().getTriple());
6515 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006516 CmdArgs.push_back("-Q");
6517 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006518
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006519 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006520 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006521 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006522 if (Args.hasArg(options::OPT_gstabs))
6523 CmdArgs.push_back("--gstabs");
6524 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006525 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006526 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006527
Daniel Dunbarbe220842009-03-20 16:06:39 +00006528 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006529 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006530
Daniel Dunbar6d484762010-07-22 01:47:22 +00006531 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006532 if (getToolChain().getArch() == llvm::Triple::x86 ||
6533 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006534 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6535 CmdArgs.push_back("-force_cpusubtype_ALL");
6536
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006537 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006538 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006539 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006540 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006541 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006542 CmdArgs.push_back("-static");
6543
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006544 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006545
6546 assert(Output.isFilename() && "Unexpected lipo output.");
6547 CmdArgs.push_back("-o");
6548 CmdArgs.push_back(Output.getFilename());
6549
Daniel Dunbarb440f562010-08-02 02:38:21 +00006550 assert(Input.isFilename() && "Invalid input.");
6551 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006552
6553 // asm_final spec is empty.
6554
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006555 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006557}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006558
Tim Northover157d9112014-01-16 08:48:16 +00006559void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006560
Tim Northover157d9112014-01-16 08:48:16 +00006561void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6562 ArgStringList &CmdArgs) const {
6563 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006564
Daniel Dunbarc1964212009-03-26 16:23:12 +00006565 // Derived from darwin_arch spec.
6566 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006567 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006568
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006569 // FIXME: Is this needed anymore?
6570 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006571 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006572}
6573
Douglas Katzman95354292015-06-23 20:42:09 +00006574bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006575 // We only need to generate a temp path for LTO if we aren't compiling object
6576 // files. When compiling source files, we run 'dsymutil' after linking. We
6577 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006578 for (const auto &Input : Inputs)
6579 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006580 return true;
6581
6582 return false;
6583}
6584
Douglas Katzman95354292015-06-23 20:42:09 +00006585void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6586 ArgStringList &CmdArgs,
6587 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006588 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006589 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006591 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006592 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6593 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006594 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6595 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006596 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006597 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006598 }
6599
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006600 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006601 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006602 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6603 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006604
Bob Wilson3d27dad2013-08-02 22:25:34 +00006605 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6606 CmdArgs.push_back("-export_dynamic");
6607
Bob Wilsonb111ec92015-03-02 19:01:14 +00006608 // If we are using App Extension restrictions, pass a flag to the linker
6609 // telling it that the compiled code has been audited.
6610 if (Args.hasFlag(options::OPT_fapplication_extension,
6611 options::OPT_fno_application_extension, false))
6612 CmdArgs.push_back("-application_extension");
6613
Teresa Johnson945bc502015-10-15 20:35:53 +00006614 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006615 // If we are using LTO, then automatically create a temporary file path for
6616 // the linker to use, so that it's lifetime will extend past a possible
6617 // dsymutil step.
6618 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6619 const char *TmpPath = C.getArgs().MakeArgString(
6620 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6621 C.addTempFile(TmpPath);
6622 CmdArgs.push_back("-object_path_lto");
6623 CmdArgs.push_back(TmpPath);
6624 }
6625
6626 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6627 // it in clang installed libraries. If not found, the option is not used
6628 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6629 if (Version[0] >= 133) {
6630 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6631 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6632 SmallString<128> LibLTOPath(P);
6633 llvm::sys::path::append(LibLTOPath, "lib");
6634 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6635 if (llvm::sys::fs::exists(LibLTOPath)) {
6636 CmdArgs.push_back("-lto_library");
6637 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6638 } else {
6639 D.Diag(diag::warn_drv_lto_libpath);
6640 }
6641 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006642 }
6643
Daniel Dunbarc1964212009-03-26 16:23:12 +00006644 // Derived from the "link" spec.
6645 Args.AddAllArgs(CmdArgs, options::OPT_static);
6646 if (!Args.hasArg(options::OPT_static))
6647 CmdArgs.push_back("-dynamic");
6648 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6649 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6650 // here. How do we wish to handle such things?
6651 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006652
Daniel Dunbarc1964212009-03-26 16:23:12 +00006653 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006654 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006655 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006656 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006657
6658 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6659 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6660 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6661
6662 Arg *A;
6663 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6664 (A = Args.getLastArg(options::OPT_current__version)) ||
6665 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006666 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6667 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006668
6669 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6670 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6671 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6672 } else {
6673 CmdArgs.push_back("-dylib");
6674
6675 Arg *A;
6676 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6677 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6678 (A = Args.getLastArg(options::OPT_client__name)) ||
6679 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6680 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6681 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006682 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6683 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006684
Daniel Dunbarc1964212009-03-26 16:23:12 +00006685 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6686 "-dylib_compatibility_version");
6687 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6688 "-dylib_current_version");
6689
Tim Northover157d9112014-01-16 08:48:16 +00006690 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006691
6692 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6693 "-dylib_install_name");
6694 }
6695
6696 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6697 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6698 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006699 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006700 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006701 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6702 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6703 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6704 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6705 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6706 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006707 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006708 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6709 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6710 Args.AddAllArgs(CmdArgs, options::OPT_init);
6711
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006712 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006713 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006714
Daniel Dunbarc1964212009-03-26 16:23:12 +00006715 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6716 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6717 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6718 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6719 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006721 if (const Arg *A =
6722 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6723 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006724 if (A->getOption().matches(options::OPT_fpie) ||
6725 A->getOption().matches(options::OPT_fPIE))
6726 CmdArgs.push_back("-pie");
6727 else
6728 CmdArgs.push_back("-no_pie");
6729 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006730
6731 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6732 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6733 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6734 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6735 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6736 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6737 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6738 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6739 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6740 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6741 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6742 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6743 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6744 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6745 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6746 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006747
Daniel Dunbar84384642011-05-02 21:03:47 +00006748 // Give --sysroot= preference, over the Apple specific behavior to also use
6749 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006750 StringRef sysroot = C.getSysRoot();
6751 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006752 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006753 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006754 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6755 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006756 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006757 }
6758
Daniel Dunbarc1964212009-03-26 16:23:12 +00006759 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6760 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6761 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6762 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6763 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006764 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006765 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6766 Args.AddAllArgs(CmdArgs, options::OPT_y);
6767 Args.AddLastArg(CmdArgs, options::OPT_w);
6768 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6769 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6770 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6771 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6772 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6773 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6774 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6775 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6776 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6777 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6778 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6779 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6780}
6781
Douglas Katzman95354292015-06-23 20:42:09 +00006782void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6783 const InputInfo &Output,
6784 const InputInfoList &Inputs,
6785 const ArgList &Args,
6786 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006787 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006788
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006789 // If the number of arguments surpasses the system limits, we will encode the
6790 // input files in a separate file, shortening the command line. To this end,
6791 // build a list of input file names that can be passed via a file with the
6792 // -filelist linker option.
6793 llvm::opt::ArgStringList InputFileList;
6794
Daniel Dunbarc1964212009-03-26 16:23:12 +00006795 // The logic here is derived from gcc's behavior; most of which
6796 // comes from specs (starting with link_command). Consult gcc for
6797 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006798 ArgStringList CmdArgs;
6799
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006800 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6801 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6802 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006803 for (const auto &Arg : Args)
6804 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006805 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006806 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006807 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006808 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006809 return;
6810 }
6811
Daniel Dunbarc1964212009-03-26 16:23:12 +00006812 // I'm not sure why this particular decomposition exists in gcc, but
6813 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006814 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006815
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006816 // It seems that the 'e' option is completely ignored for dynamic executables
6817 // (the default), and with static executables, the last one wins, as expected.
6818 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6819 options::OPT_Z_Flag, options::OPT_u_Group,
6820 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006821
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006822 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6823 // members of static archive libraries which implement Objective-C classes or
6824 // categories.
6825 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6826 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006827
Daniel Dunbarc1964212009-03-26 16:23:12 +00006828 CmdArgs.push_back("-o");
6829 CmdArgs.push_back(Output.getFilename());
6830
Chad Rosier06fd3c62012-05-16 23:45:12 +00006831 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006832 !Args.hasArg(options::OPT_nostartfiles))
6833 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006834
Peter Collingbournec4122c12015-06-15 21:08:13 +00006835 // SafeStack requires its own runtime libraries
6836 // These libraries should be linked first, to make sure the
6837 // __safestack_init constructor executes before everything else
6838 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6839 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6840 "libclang_rt.safestack_osx.a",
6841 /*AlwaysLink=*/true);
6842 }
6843
Daniel Dunbarc1964212009-03-26 16:23:12 +00006844 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006845
Douglas Gregor9295df02012-05-15 21:00:27 +00006846 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006847 // Build the input file for -filelist (list of linker input files) in case we
6848 // need it later
6849 for (const auto &II : Inputs) {
6850 if (!II.isFilename()) {
6851 // This is a linker input argument.
6852 // We cannot mix input arguments and file names in a -filelist input, thus
6853 // we prematurely stop our list (remaining files shall be passed as
6854 // arguments).
6855 if (InputFileList.size() > 0)
6856 break;
6857
6858 continue;
6859 }
6860
6861 InputFileList.push_back(II.getFilename());
6862 }
6863
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006864 if (!Args.hasArg(options::OPT_nostdlib) &&
6865 !Args.hasArg(options::OPT_nodefaultlibs))
6866 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006868 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006869 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006870 // We use arclite library for both ARC and subscripting support.
6871 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6872
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006873 CmdArgs.push_back("-framework");
6874 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006875 // Link libobj.
6876 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006877 }
John McCall31168b02011-06-15 23:02:42 +00006878
Daniel Dunbarc1964212009-03-26 16:23:12 +00006879 if (LinkingOutput) {
6880 CmdArgs.push_back("-arch_multiple");
6881 CmdArgs.push_back("-final_output");
6882 CmdArgs.push_back(LinkingOutput);
6883 }
6884
Daniel Dunbarc1964212009-03-26 16:23:12 +00006885 if (Args.hasArg(options::OPT_fnested_functions))
6886 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006887
Justin Bognerc7701242015-05-12 05:44:36 +00006888 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6889
Daniel Dunbarc1964212009-03-26 16:23:12 +00006890 if (!Args.hasArg(options::OPT_nostdlib) &&
6891 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006892 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006893 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006894
Daniel Dunbarc1964212009-03-26 16:23:12 +00006895 // link_ssp spec is empty.
6896
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006897 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006898 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006899 }
6900
Chad Rosier06fd3c62012-05-16 23:45:12 +00006901 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006902 !Args.hasArg(options::OPT_nostartfiles)) {
6903 // endfile_spec is empty.
6904 }
6905
6906 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6907 Args.AddAllArgs(CmdArgs, options::OPT_F);
6908
Steven Wu3ffb61b2015-02-06 18:08:29 +00006909 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006910 for (const Arg *A : Args.filtered(options::OPT_iframework))
6911 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006912
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006913 if (!Args.hasArg(options::OPT_nostdlib) &&
6914 !Args.hasArg(options::OPT_nodefaultlibs)) {
6915 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6916 if (A->getValue() == StringRef("Accelerate")) {
6917 CmdArgs.push_back("-framework");
6918 CmdArgs.push_back("Accelerate");
6919 }
6920 }
6921 }
6922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006923 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006924 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006925 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006926 Cmd->setInputFileList(std::move(InputFileList));
6927 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006928}
6929
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006930void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006931 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006932 const InputInfoList &Inputs,
6933 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006934 const char *LinkingOutput) const {
6935 ArgStringList CmdArgs;
6936
6937 CmdArgs.push_back("-create");
6938 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006939
6940 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006941 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006942
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006943 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006944 assert(II.isFilename() && "Unexpected lipo input.");
6945 CmdArgs.push_back(II.getFilename());
6946 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006947
6948 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006949 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006950}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006951
Daniel Dunbar88299622010-06-04 18:28:36 +00006952void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006953 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006954 const InputInfoList &Inputs,
6955 const ArgList &Args,
6956 const char *LinkingOutput) const {
6957 ArgStringList CmdArgs;
6958
Daniel Dunbareb86b042011-05-09 17:23:16 +00006959 CmdArgs.push_back("-o");
6960 CmdArgs.push_back(Output.getFilename());
6961
Daniel Dunbar88299622010-06-04 18:28:36 +00006962 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6963 const InputInfo &Input = Inputs[0];
6964 assert(Input.isFilename() && "Unexpected dsymutil input.");
6965 CmdArgs.push_back(Input.getFilename());
6966
Daniel Dunbar88299622010-06-04 18:28:36 +00006967 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006968 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006969 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006970}
6971
Eric Christopher551ef452011-08-23 17:56:55 +00006972void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006973 const InputInfo &Output,
6974 const InputInfoList &Inputs,
6975 const ArgList &Args,
6976 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006977 ArgStringList CmdArgs;
6978 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006979 CmdArgs.push_back("--debug-info");
6980 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006981 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006982
6983 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6984 const InputInfo &Input = Inputs[0];
6985 assert(Input.isFilename() && "Unexpected verify input");
6986
6987 // Grabbing the output of the earlier dsymutil run.
6988 CmdArgs.push_back(Input.getFilename());
6989
6990 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006991 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006993}
6994
Douglas Katzman95354292015-06-23 20:42:09 +00006995void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006996 const InputInfo &Output,
6997 const InputInfoList &Inputs,
6998 const ArgList &Args,
6999 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007000 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007001 ArgStringList CmdArgs;
7002
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007003 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007004
7005 CmdArgs.push_back("-o");
7006 CmdArgs.push_back(Output.getFilename());
7007
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007008 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007009 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007010
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007011 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007012 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007013}
7014
Douglas Katzman95354292015-06-23 20:42:09 +00007015void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7016 const InputInfo &Output,
7017 const InputInfoList &Inputs,
7018 const ArgList &Args,
7019 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007020 ArgStringList CmdArgs;
7021
David Chisnall272a0712012-02-29 15:06:12 +00007022 // Demangle C++ names in errors
7023 CmdArgs.push_back("-C");
7024
David Chisnallf571cde2012-02-15 13:39:01 +00007025 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7026 (!Args.hasArg(options::OPT_shared))) {
7027 CmdArgs.push_back("-e");
7028 CmdArgs.push_back("_start");
7029 }
7030
7031 if (Args.hasArg(options::OPT_static)) {
7032 CmdArgs.push_back("-Bstatic");
7033 CmdArgs.push_back("-dn");
7034 } else {
7035 CmdArgs.push_back("-Bdynamic");
7036 if (Args.hasArg(options::OPT_shared)) {
7037 CmdArgs.push_back("-shared");
7038 } else {
7039 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007040 CmdArgs.push_back(
7041 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007042 }
7043 }
7044
7045 if (Output.isFilename()) {
7046 CmdArgs.push_back("-o");
7047 CmdArgs.push_back(Output.getFilename());
7048 } else {
7049 assert(Output.isNothing() && "Invalid output.");
7050 }
7051
7052 if (!Args.hasArg(options::OPT_nostdlib) &&
7053 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007054 if (!Args.hasArg(options::OPT_shared))
7055 CmdArgs.push_back(
7056 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7057
7058 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7059 CmdArgs.push_back(
7060 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7061 CmdArgs.push_back(
7062 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007063 }
7064
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007065 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
7066 for (const auto &Path : Paths)
7067 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00007068
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007069 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7070 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007071
7072 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7073
7074 if (!Args.hasArg(options::OPT_nostdlib) &&
7075 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007076 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007077 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007078 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007079 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007080 if (!Args.hasArg(options::OPT_shared)) {
7081 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007082 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007083 }
David Chisnallf571cde2012-02-15 13:39:01 +00007084 }
7085
7086 if (!Args.hasArg(options::OPT_nostdlib) &&
7087 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007088 CmdArgs.push_back(
7089 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007090 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007091 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007092
Xinliang David Li69306c02015-10-22 06:15:31 +00007093 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007095 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007096 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007097}
7098
Douglas Katzman95354292015-06-23 20:42:09 +00007099void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7100 const InputInfo &Output,
7101 const InputInfoList &Inputs,
7102 const ArgList &Args,
7103 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007104 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007105 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007106 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007107
Rafael Espindolacc126272014-02-28 01:55:21 +00007108 switch (getToolChain().getArch()) {
7109 case llvm::Triple::x86:
7110 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7111 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007112 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007113 break;
7114
7115 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007116 CmdArgs.push_back("-mppc");
7117 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007118 break;
7119
7120 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007121 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007122 CmdArgs.push_back("-32");
7123 NeedsKPIC = true;
7124 break;
7125
7126 case llvm::Triple::sparcv9:
7127 CmdArgs.push_back("-64");
7128 CmdArgs.push_back("-Av9a");
7129 NeedsKPIC = true;
7130 break;
7131
7132 case llvm::Triple::mips64:
7133 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007134 StringRef CPUName;
7135 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007136 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007137
7138 CmdArgs.push_back("-mabi");
7139 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7140
7141 if (getToolChain().getArch() == llvm::Triple::mips64)
7142 CmdArgs.push_back("-EB");
7143 else
7144 CmdArgs.push_back("-EL");
7145
Rafael Espindolacc126272014-02-28 01:55:21 +00007146 NeedsKPIC = true;
7147 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007148 }
7149
Rafael Espindolacc126272014-02-28 01:55:21 +00007150 default:
7151 break;
7152 }
7153
7154 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007155 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007157 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007158
7159 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007160 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007161
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007162 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007163 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007164
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007165 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007166 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007167}
7168
Douglas Katzman95354292015-06-23 20:42:09 +00007169void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7170 const InputInfo &Output,
7171 const InputInfoList &Inputs,
7172 const ArgList &Args,
7173 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007174 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007175 ArgStringList CmdArgs;
7176
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007177 // Silence warning for "clang -g foo.o -o foo"
7178 Args.ClaimAllArgs(options::OPT_g_Group);
7179 // and "clang -emit-llvm foo.o -o foo"
7180 Args.ClaimAllArgs(options::OPT_emit_llvm);
7181 // and for "clang -w foo.o -o foo". Other warning options are already
7182 // handled somewhere else.
7183 Args.ClaimAllArgs(options::OPT_w);
7184
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007185 if (getToolChain().getArch() == llvm::Triple::mips64)
7186 CmdArgs.push_back("-EB");
7187 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7188 CmdArgs.push_back("-EL");
7189
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007190 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007191 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007192 CmdArgs.push_back("-e");
7193 CmdArgs.push_back("__start");
7194 }
7195
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007196 if (Args.hasArg(options::OPT_static)) {
7197 CmdArgs.push_back("-Bstatic");
7198 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007199 if (Args.hasArg(options::OPT_rdynamic))
7200 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007201 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007202 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007203 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007204 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007205 } else {
7206 CmdArgs.push_back("-dynamic-linker");
7207 CmdArgs.push_back("/usr/libexec/ld.so");
7208 }
7209 }
7210
Rafael Espindola044f7832013-06-05 04:28:55 +00007211 if (Args.hasArg(options::OPT_nopie))
7212 CmdArgs.push_back("-nopie");
7213
Daniel Dunbarb440f562010-08-02 02:38:21 +00007214 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007215 CmdArgs.push_back("-o");
7216 CmdArgs.push_back(Output.getFilename());
7217 } else {
7218 assert(Output.isNothing() && "Invalid output.");
7219 }
7220
7221 if (!Args.hasArg(options::OPT_nostdlib) &&
7222 !Args.hasArg(options::OPT_nostartfiles)) {
7223 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007224 if (Args.hasArg(options::OPT_pg))
7225 CmdArgs.push_back(
7226 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007227 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007228 CmdArgs.push_back(
7229 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7230 CmdArgs.push_back(
7231 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007232 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007233 CmdArgs.push_back(
7234 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007235 }
7236 }
7237
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007238 std::string Triple = getToolChain().getTripleString();
7239 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007240 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007241 CmdArgs.push_back(
7242 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007243
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007244 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7245 options::OPT_e, options::OPT_s, options::OPT_t,
7246 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007247
Daniel Dunbar54423b22010-09-17 00:24:54 +00007248 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007249
7250 if (!Args.hasArg(options::OPT_nostdlib) &&
7251 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007252 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007253 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007254 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007255 CmdArgs.push_back("-lm_p");
7256 else
7257 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007258 }
7259
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007260 // FIXME: For some reason GCC passes -lgcc before adding
7261 // the default system libraries. Just mimic this for now.
7262 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007263
Eric Christopher17674ec2012-09-13 06:32:34 +00007264 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007265 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7266 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007267 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007268 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007269 }
7270
Chandler Carruth45661652011-12-17 22:32:42 +00007271 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007272 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007273 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007274 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007275 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007276 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007277
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007278 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007279 }
7280
7281 if (!Args.hasArg(options::OPT_nostdlib) &&
7282 !Args.hasArg(options::OPT_nostartfiles)) {
7283 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007284 CmdArgs.push_back(
7285 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007286 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007287 CmdArgs.push_back(
7288 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007289 }
7290
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007291 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007292 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007293}
Ed Schoutene33194b2009-04-02 19:13:12 +00007294
Douglas Katzman95354292015-06-23 20:42:09 +00007295void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7296 const InputInfo &Output,
7297 const InputInfoList &Inputs,
7298 const ArgList &Args,
7299 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007300 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007301 ArgStringList CmdArgs;
7302
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007303 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007304
7305 CmdArgs.push_back("-o");
7306 CmdArgs.push_back(Output.getFilename());
7307
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007308 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007309 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007310
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007311 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007312 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007313}
7314
Douglas Katzman95354292015-06-23 20:42:09 +00007315void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7316 const InputInfo &Output,
7317 const InputInfoList &Inputs,
7318 const ArgList &Args,
7319 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007320 const Driver &D = getToolChain().getDriver();
7321 ArgStringList CmdArgs;
7322
7323 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7324 (!Args.hasArg(options::OPT_shared))) {
7325 CmdArgs.push_back("-e");
7326 CmdArgs.push_back("__start");
7327 }
7328
7329 if (Args.hasArg(options::OPT_static)) {
7330 CmdArgs.push_back("-Bstatic");
7331 } else {
7332 if (Args.hasArg(options::OPT_rdynamic))
7333 CmdArgs.push_back("-export-dynamic");
7334 CmdArgs.push_back("--eh-frame-hdr");
7335 CmdArgs.push_back("-Bdynamic");
7336 if (Args.hasArg(options::OPT_shared)) {
7337 CmdArgs.push_back("-shared");
7338 } else {
7339 CmdArgs.push_back("-dynamic-linker");
7340 CmdArgs.push_back("/usr/libexec/ld.so");
7341 }
7342 }
7343
7344 if (Output.isFilename()) {
7345 CmdArgs.push_back("-o");
7346 CmdArgs.push_back(Output.getFilename());
7347 } else {
7348 assert(Output.isNothing() && "Invalid output.");
7349 }
7350
7351 if (!Args.hasArg(options::OPT_nostdlib) &&
7352 !Args.hasArg(options::OPT_nostartfiles)) {
7353 if (!Args.hasArg(options::OPT_shared)) {
7354 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007355 CmdArgs.push_back(
7356 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007357 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007358 CmdArgs.push_back(
7359 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7360 CmdArgs.push_back(
7361 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007362 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007363 CmdArgs.push_back(
7364 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007365 }
7366 }
7367
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007368 Args.AddAllArgs(CmdArgs,
7369 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007370
7371 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7372
7373 if (!Args.hasArg(options::OPT_nostdlib) &&
7374 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007375 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007376 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7377 if (Args.hasArg(options::OPT_pg))
7378 CmdArgs.push_back("-lm_p");
7379 else
7380 CmdArgs.push_back("-lm");
7381 }
7382
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007383 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007384 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007385 CmdArgs.push_back("-lpthread_p");
7386 else
7387 CmdArgs.push_back("-lpthread");
7388 }
7389
Eli Friedman9fa28852012-08-08 23:57:20 +00007390 if (!Args.hasArg(options::OPT_shared)) {
7391 if (Args.hasArg(options::OPT_pg))
7392 CmdArgs.push_back("-lc_p");
7393 else
7394 CmdArgs.push_back("-lc");
7395 }
7396
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007397 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007398 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007399 case llvm::Triple::arm:
7400 MyArch = "arm";
7401 break;
7402 case llvm::Triple::x86:
7403 MyArch = "i386";
7404 break;
7405 case llvm::Triple::x86_64:
7406 MyArch = "amd64";
7407 break;
7408 default:
7409 llvm_unreachable("Unsupported architecture");
7410 }
7411 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007412 }
7413
7414 if (!Args.hasArg(options::OPT_nostdlib) &&
7415 !Args.hasArg(options::OPT_nostartfiles)) {
7416 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007417 CmdArgs.push_back(
7418 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007419 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007420 CmdArgs.push_back(
7421 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007422 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007423
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007424 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007425 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007426}
7427
Douglas Katzman95354292015-06-23 20:42:09 +00007428void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7429 const InputInfo &Output,
7430 const InputInfoList &Inputs,
7431 const ArgList &Args,
7432 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007433 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007434 ArgStringList CmdArgs;
7435
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007436 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7437 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007438 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007439 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007440 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007441 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007442 else if (getToolChain().getArch() == llvm::Triple::mips ||
7443 getToolChain().getArch() == llvm::Triple::mipsel ||
7444 getToolChain().getArch() == llvm::Triple::mips64 ||
7445 getToolChain().getArch() == llvm::Triple::mips64el) {
7446 StringRef CPUName;
7447 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007448 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007449
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007450 CmdArgs.push_back("-march");
7451 CmdArgs.push_back(CPUName.data());
7452
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007453 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007454 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007455
7456 if (getToolChain().getArch() == llvm::Triple::mips ||
7457 getToolChain().getArch() == llvm::Triple::mips64)
7458 CmdArgs.push_back("-EB");
7459 else
7460 CmdArgs.push_back("-EL");
7461
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007462 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007463 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007464 getToolChain().getArch() == llvm::Triple::armeb ||
7465 getToolChain().getArch() == llvm::Triple::thumb ||
7466 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007467 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007468
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007469 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007470 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007471 else
Renato Golinf4421f72014-02-19 10:44:07 +00007472 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007475 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007476 case llvm::Triple::GNUEABI:
7477 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007478 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007479 break;
7480
7481 default:
7482 CmdArgs.push_back("-matpcs");
7483 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007484 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007485 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007486 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007487 if (getToolChain().getArch() == llvm::Triple::sparc)
7488 CmdArgs.push_back("-Av8plusa");
7489 else
7490 CmdArgs.push_back("-Av9a");
7491
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007492 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007493 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007494
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007495 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007496
7497 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007498 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007499
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007500 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007501 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007503 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007504 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007505}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007506
Douglas Katzman95354292015-06-23 20:42:09 +00007507void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7508 const InputInfo &Output,
7509 const InputInfoList &Inputs,
7510 const ArgList &Args,
7511 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007512 const toolchains::FreeBSD &ToolChain =
7513 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007514 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007515 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007516 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007517 !Args.hasArg(options::OPT_shared) &&
7518 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007519 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007520
7521 // Silence warning for "clang -g foo.o -o foo"
7522 Args.ClaimAllArgs(options::OPT_g_Group);
7523 // and "clang -emit-llvm foo.o -o foo"
7524 Args.ClaimAllArgs(options::OPT_emit_llvm);
7525 // and for "clang -w foo.o -o foo". Other warning options are already
7526 // handled somewhere else.
7527 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007528
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007529 if (!D.SysRoot.empty())
7530 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7531
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007532 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007533 CmdArgs.push_back("-pie");
7534
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007535 if (Args.hasArg(options::OPT_static)) {
7536 CmdArgs.push_back("-Bstatic");
7537 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007538 if (Args.hasArg(options::OPT_rdynamic))
7539 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007540 CmdArgs.push_back("--eh-frame-hdr");
7541 if (Args.hasArg(options::OPT_shared)) {
7542 CmdArgs.push_back("-Bshareable");
7543 } else {
7544 CmdArgs.push_back("-dynamic-linker");
7545 CmdArgs.push_back("/libexec/ld-elf.so.1");
7546 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007547 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007548 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7549 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7550 CmdArgs.push_back("--hash-style=both");
7551 }
7552 }
7553 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007554 }
7555
7556 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7557 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007558 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007559 CmdArgs.push_back("-m");
7560 CmdArgs.push_back("elf_i386_fbsd");
7561 }
7562
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007563 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007564 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007565 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007566 }
7567
Daniel Dunbarb440f562010-08-02 02:38:21 +00007568 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007569 CmdArgs.push_back("-o");
7570 CmdArgs.push_back(Output.getFilename());
7571 } else {
7572 assert(Output.isNothing() && "Invalid output.");
7573 }
7574
7575 if (!Args.hasArg(options::OPT_nostdlib) &&
7576 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007577 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007578 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007579 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007580 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007581 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007582 crt1 = "Scrt1.o";
7583 else
7584 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007585 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007586 if (crt1)
7587 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7588
7589 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7590
Craig Topper92fc2df2014-05-17 16:56:41 +00007591 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007592 if (Args.hasArg(options::OPT_static))
7593 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007594 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007595 crtbegin = "crtbeginS.o";
7596 else
7597 crtbegin = "crtbegin.o";
7598
7599 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007600 }
7601
7602 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007603 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007604 for (const auto &Path : Paths)
7605 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007606 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7607 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007608 Args.AddAllArgs(CmdArgs, options::OPT_s);
7609 Args.AddAllArgs(CmdArgs, options::OPT_t);
7610 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7611 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007612
Teresa Johnson945bc502015-10-15 20:35:53 +00007613 if (D.isUsingLTO())
7614 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007615
Alexey Samsonov52550342014-09-15 19:58:40 +00007616 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007617 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007618
7619 if (!Args.hasArg(options::OPT_nostdlib) &&
7620 !Args.hasArg(options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007621 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007622 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007623 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007624 if (Args.hasArg(options::OPT_pg))
7625 CmdArgs.push_back("-lm_p");
7626 else
7627 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007628 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007629 if (NeedsSanitizerDeps)
7630 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007631 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7632 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007633 if (Args.hasArg(options::OPT_pg))
7634 CmdArgs.push_back("-lgcc_p");
7635 else
7636 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007637 if (Args.hasArg(options::OPT_static)) {
7638 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007639 } else if (Args.hasArg(options::OPT_pg)) {
7640 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007641 } else {
7642 CmdArgs.push_back("--as-needed");
7643 CmdArgs.push_back("-lgcc_s");
7644 CmdArgs.push_back("--no-as-needed");
7645 }
7646
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007647 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007648 if (Args.hasArg(options::OPT_pg))
7649 CmdArgs.push_back("-lpthread_p");
7650 else
7651 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007652 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007653
Roman Divacky66f22762011-02-10 16:59:40 +00007654 if (Args.hasArg(options::OPT_pg)) {
7655 if (Args.hasArg(options::OPT_shared))
7656 CmdArgs.push_back("-lc");
7657 else
7658 CmdArgs.push_back("-lc_p");
7659 CmdArgs.push_back("-lgcc_p");
7660 } else {
7661 CmdArgs.push_back("-lc");
7662 CmdArgs.push_back("-lgcc");
7663 }
7664
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007665 if (Args.hasArg(options::OPT_static)) {
7666 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007667 } else if (Args.hasArg(options::OPT_pg)) {
7668 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007669 } else {
7670 CmdArgs.push_back("--as-needed");
7671 CmdArgs.push_back("-lgcc_s");
7672 CmdArgs.push_back("--no-as-needed");
7673 }
7674 }
7675
7676 if (!Args.hasArg(options::OPT_nostdlib) &&
7677 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007678 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007679 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007680 else
7681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007682 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007683 }
7684
Xinliang David Li69306c02015-10-22 06:15:31 +00007685 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007686
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007687 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007688 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007689}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007690
Douglas Katzman95354292015-06-23 20:42:09 +00007691void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007692 const InputInfo &Output,
7693 const InputInfoList &Inputs,
7694 const ArgList &Args,
7695 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007696 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007697 ArgStringList CmdArgs;
7698
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007699 // GNU as needs different flags for creating the correct output format
7700 // on architectures with different ABIs or optional feature sets.
7701 switch (getToolChain().getArch()) {
7702 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007703 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007704 break;
7705 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007706 case llvm::Triple::armeb:
7707 case llvm::Triple::thumb:
7708 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007709 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007710 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7711 std::string Arch =
7712 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007713 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007714 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007715 }
7716
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007717 case llvm::Triple::mips:
7718 case llvm::Triple::mipsel:
7719 case llvm::Triple::mips64:
7720 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007721 StringRef CPUName;
7722 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007723 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007724
7725 CmdArgs.push_back("-march");
7726 CmdArgs.push_back(CPUName.data());
7727
7728 CmdArgs.push_back("-mabi");
7729 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7730
7731 if (getToolChain().getArch() == llvm::Triple::mips ||
7732 getToolChain().getArch() == llvm::Triple::mips64)
7733 CmdArgs.push_back("-EB");
7734 else
7735 CmdArgs.push_back("-EL");
7736
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007737 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007738 break;
7739 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007740
7741 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007742 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007743 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007744 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007745 break;
7746
7747 case llvm::Triple::sparcv9:
7748 CmdArgs.push_back("-64");
7749 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007750 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007751 break;
7752
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007753 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007754 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007755 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007757 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007758
7759 CmdArgs.push_back("-o");
7760 CmdArgs.push_back(Output.getFilename());
7761
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007762 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007763 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007764
David Chisnallddbd68f2011-09-27 22:03:18 +00007765 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007766 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007767}
7768
Douglas Katzman95354292015-06-23 20:42:09 +00007769void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7770 const InputInfo &Output,
7771 const InputInfoList &Inputs,
7772 const ArgList &Args,
7773 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007774 const Driver &D = getToolChain().getDriver();
7775 ArgStringList CmdArgs;
7776
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007777 if (!D.SysRoot.empty())
7778 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7779
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007780 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007781 if (Args.hasArg(options::OPT_static)) {
7782 CmdArgs.push_back("-Bstatic");
7783 } else {
7784 if (Args.hasArg(options::OPT_rdynamic))
7785 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007786 if (Args.hasArg(options::OPT_shared)) {
7787 CmdArgs.push_back("-Bshareable");
7788 } else {
7789 CmdArgs.push_back("-dynamic-linker");
7790 CmdArgs.push_back("/libexec/ld.elf_so");
7791 }
7792 }
7793
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007794 // Many NetBSD architectures support more than one ABI.
7795 // Determine the correct emulation for ld.
7796 switch (getToolChain().getArch()) {
7797 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007798 CmdArgs.push_back("-m");
7799 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007800 break;
7801 case llvm::Triple::arm:
7802 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007803 CmdArgs.push_back("-m");
7804 switch (getToolChain().getTriple().getEnvironment()) {
7805 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007806 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007807 CmdArgs.push_back("armelf_nbsd_eabi");
7808 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007809 case llvm::Triple::EABIHF:
7810 case llvm::Triple::GNUEABIHF:
7811 CmdArgs.push_back("armelf_nbsd_eabihf");
7812 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007813 default:
7814 CmdArgs.push_back("armelf_nbsd");
7815 break;
7816 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007817 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007818 case llvm::Triple::armeb:
7819 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007820 arm::appendEBLinkFlags(
7821 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007822 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007823 CmdArgs.push_back("-m");
7824 switch (getToolChain().getTriple().getEnvironment()) {
7825 case llvm::Triple::EABI:
7826 case llvm::Triple::GNUEABI:
7827 CmdArgs.push_back("armelfb_nbsd_eabi");
7828 break;
7829 case llvm::Triple::EABIHF:
7830 case llvm::Triple::GNUEABIHF:
7831 CmdArgs.push_back("armelfb_nbsd_eabihf");
7832 break;
7833 default:
7834 CmdArgs.push_back("armelfb_nbsd");
7835 break;
7836 }
7837 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007838 case llvm::Triple::mips64:
7839 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007840 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007841 CmdArgs.push_back("-m");
7842 if (getToolChain().getArch() == llvm::Triple::mips64)
7843 CmdArgs.push_back("elf32btsmip");
7844 else
7845 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007846 } else if (mips::hasMipsAbiArg(Args, "64")) {
7847 CmdArgs.push_back("-m");
7848 if (getToolChain().getArch() == llvm::Triple::mips64)
7849 CmdArgs.push_back("elf64btsmip");
7850 else
7851 CmdArgs.push_back("elf64ltsmip");
7852 }
7853 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007854 case llvm::Triple::ppc:
7855 CmdArgs.push_back("-m");
7856 CmdArgs.push_back("elf32ppc_nbsd");
7857 break;
7858
7859 case llvm::Triple::ppc64:
7860 case llvm::Triple::ppc64le:
7861 CmdArgs.push_back("-m");
7862 CmdArgs.push_back("elf64ppc");
7863 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007864
7865 case llvm::Triple::sparc:
7866 CmdArgs.push_back("-m");
7867 CmdArgs.push_back("elf32_sparc");
7868 break;
7869
7870 case llvm::Triple::sparcv9:
7871 CmdArgs.push_back("-m");
7872 CmdArgs.push_back("elf64_sparc");
7873 break;
7874
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007875 default:
7876 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007877 }
7878
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007879 if (Output.isFilename()) {
7880 CmdArgs.push_back("-o");
7881 CmdArgs.push_back(Output.getFilename());
7882 } else {
7883 assert(Output.isNothing() && "Invalid output.");
7884 }
7885
7886 if (!Args.hasArg(options::OPT_nostdlib) &&
7887 !Args.hasArg(options::OPT_nostartfiles)) {
7888 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007889 CmdArgs.push_back(
7890 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7891 CmdArgs.push_back(
7892 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7893 CmdArgs.push_back(
7894 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007895 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007896 CmdArgs.push_back(
7897 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7898 CmdArgs.push_back(
7899 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007900 }
7901 }
7902
7903 Args.AddAllArgs(CmdArgs, options::OPT_L);
7904 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7905 Args.AddAllArgs(CmdArgs, options::OPT_e);
7906 Args.AddAllArgs(CmdArgs, options::OPT_s);
7907 Args.AddAllArgs(CmdArgs, options::OPT_t);
7908 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7909 Args.AddAllArgs(CmdArgs, options::OPT_r);
7910
7911 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7912
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007913 unsigned Major, Minor, Micro;
7914 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7915 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007916 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007917 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007918 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007919 case llvm::Triple::arm:
7920 case llvm::Triple::armeb:
7921 case llvm::Triple::thumb:
7922 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007923 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007924 case llvm::Triple::ppc64:
7925 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007926 case llvm::Triple::x86:
7927 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007928 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007929 break;
7930 default:
7931 break;
7932 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007933 }
7934
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007935 if (!Args.hasArg(options::OPT_nostdlib) &&
7936 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007937 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007938 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007939 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7940 CmdArgs.push_back("-lm");
7941 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007942 if (Args.hasArg(options::OPT_pthread))
7943 CmdArgs.push_back("-lpthread");
7944 CmdArgs.push_back("-lc");
7945
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007946 if (useLibgcc) {
7947 if (Args.hasArg(options::OPT_static)) {
7948 // libgcc_eh depends on libc, so resolve as much as possible,
7949 // pull in any new requirements from libc and then get the rest
7950 // of libgcc.
7951 CmdArgs.push_back("-lgcc_eh");
7952 CmdArgs.push_back("-lc");
7953 CmdArgs.push_back("-lgcc");
7954 } else {
7955 CmdArgs.push_back("-lgcc");
7956 CmdArgs.push_back("--as-needed");
7957 CmdArgs.push_back("-lgcc_s");
7958 CmdArgs.push_back("--no-as-needed");
7959 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007960 }
7961 }
7962
7963 if (!Args.hasArg(options::OPT_nostdlib) &&
7964 !Args.hasArg(options::OPT_nostartfiles)) {
7965 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007966 CmdArgs.push_back(
7967 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007968 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007969 CmdArgs.push_back(
7970 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7971 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007972 }
7973
Xinliang David Li69306c02015-10-22 06:15:31 +00007974 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007975
Logan Chieneb9162f2014-06-26 14:23:45 +00007976 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007978}
7979
Douglas Katzman95354292015-06-23 20:42:09 +00007980void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7981 const InputInfo &Output,
7982 const InputInfoList &Inputs,
7983 const ArgList &Args,
7984 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007985 claimNoWarnArgs(Args);
7986
James Y Knight2db38f32015-08-15 03:45:25 +00007987 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7988 llvm::Triple Triple = llvm::Triple(TripleStr);
7989
Rafael Espindola92b00932010-08-10 00:25:48 +00007990 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007991 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007992
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007993 llvm::Reloc::Model RelocationModel;
7994 unsigned PICLevel;
7995 bool IsPIE;
7996 std::tie(RelocationModel, PICLevel, IsPIE) =
7997 ParsePICArgs(getToolChain(), Triple, Args);
7998
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007999 switch (getToolChain().getArch()) {
8000 default:
8001 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008002 // Add --32/--64 to make sure we get the format we want.
8003 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008004 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008005 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008006 break;
8007 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008008 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8009 CmdArgs.push_back("--x32");
8010 else
8011 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008012 break;
8013 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008014 CmdArgs.push_back("-a32");
8015 CmdArgs.push_back("-mppc");
8016 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008017 break;
8018 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008019 CmdArgs.push_back("-a64");
8020 CmdArgs.push_back("-mppc64");
8021 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008022 break;
8023 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008024 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008025 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008026 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008027 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008028 break;
8029 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008030 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008031 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008032 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008033 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008034 break;
8035 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008036 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008037 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008038 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008039 break;
8040 case llvm::Triple::arm:
8041 case llvm::Triple::armeb:
8042 case llvm::Triple::thumb:
8043 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008044 const llvm::Triple &Triple2 = getToolChain().getTriple();
8045 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008046 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008047 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008048 break;
8049 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008050 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008051 break;
8052 default:
8053 break;
8054 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008055
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008056 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008057 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8058 case arm::FloatABI::Soft:
8059 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8060 break;
8061 case arm::FloatABI::SoftFP:
8062 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8063 break;
8064 case arm::FloatABI::Hard:
8065 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8066 break;
8067 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008068
8069 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008070
8071 // FIXME: remove krait check when GNU tools support krait cpu
8072 // for now replace it with -march=armv7-a to avoid a lower
8073 // march from being picked in the absence of a cpu flag.
8074 Arg *A;
8075 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008076 StringRef(A->getValue()).lower() == "krait")
8077 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008078 else
8079 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008080 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008081 break;
8082 }
8083 case llvm::Triple::mips:
8084 case llvm::Triple::mipsel:
8085 case llvm::Triple::mips64:
8086 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008087 StringRef CPUName;
8088 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008089 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008090 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008091
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008092 CmdArgs.push_back("-march");
8093 CmdArgs.push_back(CPUName.data());
8094
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008095 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008096 CmdArgs.push_back(ABIName.data());
8097
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008098 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8099 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008100 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008101 CmdArgs.push_back("-mno-shared");
8102
Daniel Sanders379d44b2014-07-16 11:52:23 +00008103 // LLVM doesn't support -mplt yet and acts as if it is always given.
8104 // However, -mplt has no effect with the N64 ABI.
8105 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008106
8107 if (getToolChain().getArch() == llvm::Triple::mips ||
8108 getToolChain().getArch() == llvm::Triple::mips64)
8109 CmdArgs.push_back("-EB");
8110 else
8111 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008112
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008113 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8114 if (StringRef(A->getValue()) == "2008")
8115 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8116 }
8117
Daniel Sanders379d44b2014-07-16 11:52:23 +00008118 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8119 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8120 options::OPT_mfp64)) {
8121 A->claim();
8122 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008123 } else if (mips::shouldUseFPXX(
8124 Args, getToolChain().getTriple(), CPUName, ABIName,
8125 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008126 CmdArgs.push_back("-mfpxx");
8127
8128 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8129 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008130 if (Arg *A =
8131 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008132 if (A->getOption().matches(options::OPT_mips16)) {
8133 A->claim();
8134 A->render(Args, CmdArgs);
8135 } else {
8136 A->claim();
8137 CmdArgs.push_back("-no-mips16");
8138 }
8139 }
8140
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008141 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8142 options::OPT_mno_micromips);
8143 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8144 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8145
Simon Atanasyanbd986632013-11-26 11:58:04 +00008146 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8147 // Do not use AddLastArg because not all versions of MIPS assembler
8148 // support -mmsa / -mno-msa options.
8149 if (A->getOption().matches(options::OPT_mmsa))
8150 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8151 }
8152
Daniel Sanders379d44b2014-07-16 11:52:23 +00008153 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8154 options::OPT_msoft_float);
8155
Toma Tabacub36d6102015-06-11 12:13:18 +00008156 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8157 options::OPT_msingle_float);
8158
Daniel Sanders379d44b2014-07-16 11:52:23 +00008159 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8160 options::OPT_mno_odd_spreg);
8161
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008162 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008163 break;
8164 }
8165 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008166 // Always pass an -march option, since our default of z10 is later
8167 // than the GNU assembler's default.
8168 StringRef CPUName = getSystemZTargetCPU(Args);
8169 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008170 break;
8171 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008172 }
8173
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008174 if (NeedsKPIC) {
8175 if (RelocationModel != llvm::Reloc::Static)
8176 CmdArgs.push_back("-KPIC");
8177 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008178
Renato Golina74bbc72015-07-22 15:32:36 +00008179 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008180 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008181
8182 CmdArgs.push_back("-o");
8183 CmdArgs.push_back(Output.getFilename());
8184
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008185 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008186 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008188 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008190
8191 // Handle the debug info splitting at object creation time if we're
8192 // creating an object.
8193 // TODO: Currently only works on linux with newer objcopy.
8194 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008195 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008196 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008197 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008198}
8199
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008200static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008201 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008202 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008203 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008204 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8205 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008206 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008207 CmdArgs.push_back("-lgcc");
8208
Logan Chien3d3373c2012-11-19 12:04:11 +00008209 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008210 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008211 CmdArgs.push_back("-lgcc");
8212 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008213 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008214 CmdArgs.push_back("--as-needed");
8215 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008216 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008217 CmdArgs.push_back("--no-as-needed");
8218 }
8219
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008220 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008221 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008222 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008223 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008224
8225 // According to Android ABI, we have to link with libdl if we are
8226 // linking with non-static libgcc.
8227 //
8228 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8229 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8230 if (isAndroid && !StaticLibgcc)
8231 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008232}
8233
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008234static std::string getLinuxDynamicLinker(const ArgList &Args,
8235 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008236 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8237
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008238 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008239 if (ToolChain.getTriple().isArch64Bit())
8240 return "/system/bin/linker64";
8241 else
8242 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008243 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8244 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008245 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008246 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008247 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008248 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008249 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008250 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008251 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008252 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008253 return "/lib/ld-linux-armhf.so.3";
8254 else
8255 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008256 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8257 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008258 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008259 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008260 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008261 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008262 return "/lib/ld-linux.so.3";
8263 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8264 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008265 StringRef CPUName;
8266 StringRef ABIName;
8267 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris45faf472015-10-29 15:33:53 +00008268 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008269
8270 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8271 .Case("o32", "/lib")
8272 .Case("n32", "/lib32")
8273 .Case("n64", "/lib64")
8274 .Default("/lib");
8275 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008276 if (mips::isUCLibc(Args))
8277 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008278 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008279 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008280
8281 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008282 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008283 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008284 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008285 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8286 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008287 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008288 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008289 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8290 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008291 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008292 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008293 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008294 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008295 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008296 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008297 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8298 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008299 else
8300 return "/lib64/ld-linux-x86-64.so.2";
8301}
8302
Renato Golinc4b49242014-02-13 10:01:16 +00008303static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008304 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008305 // Make use of compiler-rt if --rtlib option is used
8306 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8307
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008308 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008309 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008310 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008311 default:
8312 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008313 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008314 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008315 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008316 break;
8317 }
Renato Golinc4b49242014-02-13 10:01:16 +00008318 break;
8319 case ToolChain::RLT_Libgcc:
8320 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8321 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008322 }
8323}
8324
Rafael Espindola1e085772014-08-15 17:14:35 +00008325static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8326 switch (T.getArch()) {
8327 case llvm::Triple::x86:
8328 return "elf_i386";
8329 case llvm::Triple::aarch64:
8330 return "aarch64linux";
8331 case llvm::Triple::aarch64_be:
8332 return "aarch64_be_linux";
8333 case llvm::Triple::arm:
8334 case llvm::Triple::thumb:
8335 return "armelf_linux_eabi";
8336 case llvm::Triple::armeb:
8337 case llvm::Triple::thumbeb:
8338 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8339 case llvm::Triple::ppc:
8340 return "elf32ppclinux";
8341 case llvm::Triple::ppc64:
8342 return "elf64ppc";
8343 case llvm::Triple::ppc64le:
8344 return "elf64lppc";
8345 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008346 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008347 return "elf32_sparc";
8348 case llvm::Triple::sparcv9:
8349 return "elf64_sparc";
8350 case llvm::Triple::mips:
8351 return "elf32btsmip";
8352 case llvm::Triple::mipsel:
8353 return "elf32ltsmip";
8354 case llvm::Triple::mips64:
8355 if (mips::hasMipsAbiArg(Args, "n32"))
8356 return "elf32btsmipn32";
8357 return "elf64btsmip";
8358 case llvm::Triple::mips64el:
8359 if (mips::hasMipsAbiArg(Args, "n32"))
8360 return "elf32ltsmipn32";
8361 return "elf64ltsmip";
8362 case llvm::Triple::systemz:
8363 return "elf64_s390";
8364 case llvm::Triple::x86_64:
8365 if (T.getEnvironment() == llvm::Triple::GNUX32)
8366 return "elf32_x86_64";
8367 return "elf_x86_64";
8368 default:
8369 llvm_unreachable("Unexpected arch");
8370 }
8371}
8372
Douglas Katzman95354292015-06-23 20:42:09 +00008373void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8374 const InputInfo &Output,
8375 const InputInfoList &Inputs,
8376 const ArgList &Args,
8377 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008378 const toolchains::Linux &ToolChain =
8379 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008380 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008381
8382 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8383 llvm::Triple Triple = llvm::Triple(TripleStr);
8384
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008385 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008386 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008387 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008388 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8389 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008390
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008391 ArgStringList CmdArgs;
8392
Rafael Espindolad1002f62010-11-15 18:28:16 +00008393 // Silence warning for "clang -g foo.o -o foo"
8394 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008395 // and "clang -emit-llvm foo.o -o foo"
8396 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008397 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008398 // handled somewhere else.
8399 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008400
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008401 if (!D.SysRoot.empty())
8402 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008403
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008404 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008405 CmdArgs.push_back("-pie");
8406
Rafael Espindola1c76c592010-11-07 22:57:16 +00008407 if (Args.hasArg(options::OPT_rdynamic))
8408 CmdArgs.push_back("-export-dynamic");
8409
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008410 if (Args.hasArg(options::OPT_s))
8411 CmdArgs.push_back("-s");
8412
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008413 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008414 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008415
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008416 for (const auto &Opt : ToolChain.ExtraOpts)
8417 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008418
8419 if (!Args.hasArg(options::OPT_static)) {
8420 CmdArgs.push_back("--eh-frame-hdr");
8421 }
8422
8423 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008424 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008425
8426 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008427 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8428 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008429 CmdArgs.push_back("-Bstatic");
8430 else
8431 CmdArgs.push_back("-static");
8432 } else if (Args.hasArg(options::OPT_shared)) {
8433 CmdArgs.push_back("-shared");
8434 }
8435
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008436 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8437 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008438 (!Args.hasArg(options::OPT_static) &&
8439 !Args.hasArg(options::OPT_shared))) {
8440 CmdArgs.push_back("-dynamic-linker");
8441 CmdArgs.push_back(Args.MakeArgString(
8442 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8443 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008444
8445 CmdArgs.push_back("-o");
8446 CmdArgs.push_back(Output.getFilename());
8447
Rafael Espindola81937ec2010-12-01 01:52:43 +00008448 if (!Args.hasArg(options::OPT_nostdlib) &&
8449 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008450 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008451 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008452 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008453 if (Args.hasArg(options::OPT_pg))
8454 crt1 = "gcrt1.o";
8455 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008456 crt1 = "Scrt1.o";
8457 else
8458 crt1 = "crt1.o";
8459 }
8460 if (crt1)
8461 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008462
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008463 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8464 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008465
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008466 const char *crtbegin;
8467 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008468 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008469 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008470 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008471 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008472 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008473 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008474 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008475 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008476
8477 // Add crtfastmath.o if available and fast math is enabled.
8478 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008479 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008480
8481 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008482 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008483
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008484 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008485
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008486 for (const auto &Path : Paths)
8487 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008488
Teresa Johnson945bc502015-10-15 20:35:53 +00008489 if (D.isUsingLTO())
8490 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008491
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008492 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8493 CmdArgs.push_back("--no-demangle");
8494
Alexey Samsonov52550342014-09-15 19:58:40 +00008495 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008496 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008497 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008498 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008500 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008501 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008502 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008503 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008504 if (OnlyLibstdcxxStatic)
8505 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008506 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008507 if (OnlyLibstdcxxStatic)
8508 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008509 CmdArgs.push_back("-lm");
8510 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008511 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8512 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008513
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008514 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008515 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8516 if (Args.hasArg(options::OPT_static))
8517 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008518
Alexey Samsonov52550342014-09-15 19:58:40 +00008519 if (NeedsSanitizerDeps)
8520 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8521
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008522 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8523 Args.hasArg(options::OPT_pthreads);
8524
8525 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8526 options::OPT_fno_openmp, false)) {
8527 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8528 // FIXME: Does this really make sense for all GNU toolchains?
8529 WantPthread = true;
8530
8531 // Also link the particular OpenMP runtimes.
8532 switch (getOpenMPRuntime(ToolChain, Args)) {
8533 case OMPRT_OMP:
8534 CmdArgs.push_back("-lomp");
8535 break;
8536 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008537 CmdArgs.push_back("-lgomp");
8538
8539 // FIXME: Exclude this for platforms with libgomp that don't require
8540 // librt. Most modern Linux platforms require it, but some may not.
8541 CmdArgs.push_back("-lrt");
8542 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008543 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008544 CmdArgs.push_back("-liomp5");
8545 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008546 case OMPRT_Unknown:
8547 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008548 break;
8549 }
Chandler Carruth01538002013-01-17 13:19:29 +00008550 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008551
Renato Golinc4b49242014-02-13 10:01:16 +00008552 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008553
Richard Smith31d1de22015-05-20 22:48:44 +00008554 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008555 CmdArgs.push_back("-lpthread");
8556
8557 CmdArgs.push_back("-lc");
8558
8559 if (Args.hasArg(options::OPT_static))
8560 CmdArgs.push_back("--end-group");
8561 else
Renato Golinc4b49242014-02-13 10:01:16 +00008562 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008563 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008564
Rafael Espindola81937ec2010-12-01 01:52:43 +00008565 if (!Args.hasArg(options::OPT_nostartfiles)) {
8566 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008567 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008568 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008569 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008570 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008571 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008572 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008573
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008574 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008575 if (!isAndroid)
8576 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008577 }
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008578 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008579
Justin Bognerd3371d82015-07-17 03:35:54 +00008580 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8581 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008582}
8583
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008584// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8585// for the various SFI requirements like register masking. The assembly tool
8586// inserts the file containing the macros as an input into all the assembly
8587// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008588void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8589 const InputInfo &Output,
8590 const InputInfoList &Inputs,
8591 const ArgList &Args,
8592 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008593 const toolchains::NaClToolChain &ToolChain =
8594 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008595 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8596 "nacl-arm-macros.s");
8597 InputInfoList NewInputs;
8598 NewInputs.push_back(NaClMacros);
8599 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008600 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8601 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008602}
8603
Douglas Katzman750cfc52015-06-29 18:42:16 +00008604// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008605// we use static by default, do not yet support sanitizers or LTO, and a few
8606// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008607// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008608void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8609 const InputInfo &Output,
8610 const InputInfoList &Inputs,
8611 const ArgList &Args,
8612 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008613
Douglas Katzman54366072015-07-27 16:53:08 +00008614 const toolchains::NaClToolChain &ToolChain =
8615 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008616 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008617 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008618 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008619 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008620
8621 ArgStringList CmdArgs;
8622
8623 // Silence warning for "clang -g foo.o -o foo"
8624 Args.ClaimAllArgs(options::OPT_g_Group);
8625 // and "clang -emit-llvm foo.o -o foo"
8626 Args.ClaimAllArgs(options::OPT_emit_llvm);
8627 // and for "clang -w foo.o -o foo". Other warning options are already
8628 // handled somewhere else.
8629 Args.ClaimAllArgs(options::OPT_w);
8630
8631 if (!D.SysRoot.empty())
8632 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8633
8634 if (Args.hasArg(options::OPT_rdynamic))
8635 CmdArgs.push_back("-export-dynamic");
8636
8637 if (Args.hasArg(options::OPT_s))
8638 CmdArgs.push_back("-s");
8639
Douglas Katzman54366072015-07-27 16:53:08 +00008640 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8641 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008642 CmdArgs.push_back("--build-id");
8643
8644 if (!IsStatic)
8645 CmdArgs.push_back("--eh-frame-hdr");
8646
8647 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008648 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008649 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008650 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008651 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008652 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008653 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008654 else if (Arch == llvm::Triple::mipsel)
8655 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008656 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008657 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8658 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008659
8660 if (IsStatic)
8661 CmdArgs.push_back("-static");
8662 else if (Args.hasArg(options::OPT_shared))
8663 CmdArgs.push_back("-shared");
8664
8665 CmdArgs.push_back("-o");
8666 CmdArgs.push_back(Output.getFilename());
8667 if (!Args.hasArg(options::OPT_nostdlib) &&
8668 !Args.hasArg(options::OPT_nostartfiles)) {
8669 if (!Args.hasArg(options::OPT_shared))
8670 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8671 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8672
8673 const char *crtbegin;
8674 if (IsStatic)
8675 crtbegin = "crtbeginT.o";
8676 else if (Args.hasArg(options::OPT_shared))
8677 crtbegin = "crtbeginS.o";
8678 else
8679 crtbegin = "crtbegin.o";
8680 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8681 }
8682
8683 Args.AddAllArgs(CmdArgs, options::OPT_L);
8684 Args.AddAllArgs(CmdArgs, options::OPT_u);
8685
8686 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8687
8688 for (const auto &Path : Paths)
8689 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8690
8691 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8692 CmdArgs.push_back("--no-demangle");
8693
8694 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8695
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008696 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008697 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008698 bool OnlyLibstdcxxStatic =
8699 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008700 if (OnlyLibstdcxxStatic)
8701 CmdArgs.push_back("-Bstatic");
8702 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8703 if (OnlyLibstdcxxStatic)
8704 CmdArgs.push_back("-Bdynamic");
8705 CmdArgs.push_back("-lm");
8706 }
8707
8708 if (!Args.hasArg(options::OPT_nostdlib)) {
8709 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8710 // Always use groups, since it has no effect on dynamic libraries.
8711 CmdArgs.push_back("--start-group");
8712 CmdArgs.push_back("-lc");
8713 // NaCl's libc++ currently requires libpthread, so just always include it
8714 // in the group for C++.
8715 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008716 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008717 // Gold, used by Mips, handles nested groups differently than ld, and
8718 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8719 // which is not a desired behaviour here.
8720 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8721 if (getToolChain().getArch() == llvm::Triple::mipsel)
8722 CmdArgs.push_back("-lnacl");
8723
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008724 CmdArgs.push_back("-lpthread");
8725 }
8726
8727 CmdArgs.push_back("-lgcc");
8728 CmdArgs.push_back("--as-needed");
8729 if (IsStatic)
8730 CmdArgs.push_back("-lgcc_eh");
8731 else
8732 CmdArgs.push_back("-lgcc_s");
8733 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008734
8735 // Mips needs to create and use pnacl_legacy library that contains
8736 // definitions from bitcode/pnaclmm.c and definitions for
8737 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8738 if (getToolChain().getArch() == llvm::Triple::mipsel)
8739 CmdArgs.push_back("-lpnacl_legacy");
8740
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008741 CmdArgs.push_back("--end-group");
8742 }
8743
8744 if (!Args.hasArg(options::OPT_nostartfiles)) {
8745 const char *crtend;
8746 if (Args.hasArg(options::OPT_shared))
8747 crtend = "crtendS.o";
8748 else
8749 crtend = "crtend.o";
8750
8751 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8752 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8753 }
8754 }
8755
Justin Bognerd3371d82015-07-17 03:35:54 +00008756 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8757 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008758}
8759
Douglas Katzman95354292015-06-23 20:42:09 +00008760void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8761 const InputInfo &Output,
8762 const InputInfoList &Inputs,
8763 const ArgList &Args,
8764 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008765 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008766 ArgStringList CmdArgs;
8767
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008768 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008769
8770 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008771 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008772
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008773 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008774 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008775
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008776 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008777 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008778}
8779
Douglas Katzman95354292015-06-23 20:42:09 +00008780void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8781 const InputInfo &Output,
8782 const InputInfoList &Inputs,
8783 const ArgList &Args,
8784 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008785 const Driver &D = getToolChain().getDriver();
8786 ArgStringList CmdArgs;
8787
Daniel Dunbarb440f562010-08-02 02:38:21 +00008788 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008789 CmdArgs.push_back("-o");
8790 CmdArgs.push_back(Output.getFilename());
8791 } else {
8792 assert(Output.isNothing() && "Invalid output.");
8793 }
8794
8795 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008796 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008797 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8798 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8799 CmdArgs.push_back(
8800 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8801 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008802 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008803
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008804 Args.AddAllArgs(CmdArgs,
8805 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008806
Daniel Dunbar54423b22010-09-17 00:24:54 +00008807 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008808
Xinliang David Li69306c02015-10-22 06:15:31 +00008809 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008810
Chris Lattner3e2ee142010-07-07 16:01:42 +00008811 if (!Args.hasArg(options::OPT_nostdlib) &&
8812 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008813 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008814 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008815 CmdArgs.push_back("-lm");
8816 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008817 }
8818
8819 if (!Args.hasArg(options::OPT_nostdlib) &&
8820 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008821 if (Args.hasArg(options::OPT_pthread))
8822 CmdArgs.push_back("-lpthread");
8823 CmdArgs.push_back("-lc");
8824 CmdArgs.push_back("-lCompilerRT-Generic");
8825 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8826 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008827 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008828 }
8829
Logan Chieneb9162f2014-06-26 14:23:45 +00008830 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008831 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008832}
8833
Daniel Dunbarcc912342009-05-02 18:28:39 +00008834/// DragonFly Tools
8835
8836// For now, DragonFly Assemble does just about the same as for
8837// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008838void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8839 const InputInfo &Output,
8840 const InputInfoList &Inputs,
8841 const ArgList &Args,
8842 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008843 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008844 ArgStringList CmdArgs;
8845
8846 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8847 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008848 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008849 CmdArgs.push_back("--32");
8850
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008851 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008852
8853 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008854 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008855
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008856 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008857 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008858
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008859 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008860 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008861}
8862
Douglas Katzman95354292015-06-23 20:42:09 +00008863void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8864 const InputInfo &Output,
8865 const InputInfoList &Inputs,
8866 const ArgList &Args,
8867 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008868 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008869 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008870 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008871
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008872 if (!D.SysRoot.empty())
8873 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8874
John McCall65b8da02013-04-11 22:55:55 +00008875 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008876 if (Args.hasArg(options::OPT_static)) {
8877 CmdArgs.push_back("-Bstatic");
8878 } else {
John McCall65b8da02013-04-11 22:55:55 +00008879 if (Args.hasArg(options::OPT_rdynamic))
8880 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008881 if (Args.hasArg(options::OPT_shared))
8882 CmdArgs.push_back("-Bshareable");
8883 else {
8884 CmdArgs.push_back("-dynamic-linker");
8885 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8886 }
John McCall65b8da02013-04-11 22:55:55 +00008887 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008888 }
8889
8890 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8891 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008892 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008893 CmdArgs.push_back("-m");
8894 CmdArgs.push_back("elf_i386");
8895 }
8896
Daniel Dunbarb440f562010-08-02 02:38:21 +00008897 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008898 CmdArgs.push_back("-o");
8899 CmdArgs.push_back(Output.getFilename());
8900 } else {
8901 assert(Output.isNothing() && "Invalid output.");
8902 }
8903
8904 if (!Args.hasArg(options::OPT_nostdlib) &&
8905 !Args.hasArg(options::OPT_nostartfiles)) {
8906 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008907 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008908 CmdArgs.push_back(
8909 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008910 else {
8911 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008912 CmdArgs.push_back(
8913 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008914 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008915 CmdArgs.push_back(
8916 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008917 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008918 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008920 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008921 CmdArgs.push_back(
8922 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008923 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008924 CmdArgs.push_back(
8925 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008926 }
8927
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008928 Args.AddAllArgs(CmdArgs,
8929 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008930
Daniel Dunbar54423b22010-09-17 00:24:54 +00008931 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008932
8933 if (!Args.hasArg(options::OPT_nostdlib) &&
8934 !Args.hasArg(options::OPT_nodefaultlibs)) {
8935 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8936 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008937 if (UseGCC47)
8938 CmdArgs.push_back("-L/usr/lib/gcc47");
8939 else
8940 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008941
8942 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008943 if (UseGCC47) {
8944 CmdArgs.push_back("-rpath");
8945 CmdArgs.push_back("/usr/lib/gcc47");
8946 } else {
8947 CmdArgs.push_back("-rpath");
8948 CmdArgs.push_back("/usr/lib/gcc44");
8949 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008950 }
8951
Hans Wennborg70850d82013-07-18 20:29:38 +00008952 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008953 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008954 CmdArgs.push_back("-lm");
8955 }
8956
Daniel Dunbarcc912342009-05-02 18:28:39 +00008957 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008958 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008959
8960 if (!Args.hasArg(options::OPT_nolibc)) {
8961 CmdArgs.push_back("-lc");
8962 }
8963
John McCall65b8da02013-04-11 22:55:55 +00008964 if (UseGCC47) {
8965 if (Args.hasArg(options::OPT_static) ||
8966 Args.hasArg(options::OPT_static_libgcc)) {
8967 CmdArgs.push_back("-lgcc");
8968 CmdArgs.push_back("-lgcc_eh");
8969 } else {
8970 if (Args.hasArg(options::OPT_shared_libgcc)) {
8971 CmdArgs.push_back("-lgcc_pic");
8972 if (!Args.hasArg(options::OPT_shared))
8973 CmdArgs.push_back("-lgcc");
8974 } else {
8975 CmdArgs.push_back("-lgcc");
8976 CmdArgs.push_back("--as-needed");
8977 CmdArgs.push_back("-lgcc_pic");
8978 CmdArgs.push_back("--no-as-needed");
8979 }
8980 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008981 } else {
John McCall65b8da02013-04-11 22:55:55 +00008982 if (Args.hasArg(options::OPT_shared)) {
8983 CmdArgs.push_back("-lgcc_pic");
8984 } else {
8985 CmdArgs.push_back("-lgcc");
8986 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008987 }
8988 }
8989
8990 if (!Args.hasArg(options::OPT_nostdlib) &&
8991 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008992 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008993 CmdArgs.push_back(
8994 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008995 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008996 CmdArgs.push_back(
8997 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8998 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008999 }
9000
Xinliang David Li69306c02015-10-22 06:15:31 +00009001 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009002
Logan Chieneb9162f2014-06-26 14:23:45 +00009003 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009004 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009005}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009006
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009007// Try to find Exe from a Visual Studio distribution. This first tries to find
9008// an installed copy of Visual Studio and, failing that, looks in the PATH,
9009// making sure that whatever executable that's found is not a same-named exe
9010// from clang itself to prevent clang from falling back to itself.
9011static std::string FindVisualStudioExecutable(const ToolChain &TC,
9012 const char *Exe,
9013 const char *ClangProgramPath) {
9014 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9015 std::string visualStudioBinDir;
9016 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9017 visualStudioBinDir)) {
9018 SmallString<128> FilePath(visualStudioBinDir);
9019 llvm::sys::path::append(FilePath, Exe);
9020 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9021 return FilePath.str();
9022 }
9023
9024 return Exe;
9025}
9026
Douglas Katzman95354292015-06-23 20:42:09 +00009027void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9028 const InputInfo &Output,
9029 const InputInfoList &Inputs,
9030 const ArgList &Args,
9031 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009032 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009033 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009034
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009035 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9036 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009037 CmdArgs.push_back(
9038 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009039
9040 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009041 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009042 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009043
Zachary Turner10d75b22014-10-22 20:40:43 +00009044 if (!llvm::sys::Process::GetEnv("LIB")) {
9045 // If the VC environment hasn't been configured (perhaps because the user
9046 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009047 // the environment variable is set however, assume the user knows what
9048 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009049 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009050 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009051 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9052 SmallString<128> LibDir(VisualStudioDir);
9053 llvm::sys::path::append(LibDir, "VC", "lib");
9054 switch (MSVC.getArch()) {
9055 case llvm::Triple::x86:
9056 // x86 just puts the libraries directly in lib
9057 break;
9058 case llvm::Triple::x86_64:
9059 llvm::sys::path::append(LibDir, "amd64");
9060 break;
9061 case llvm::Triple::arm:
9062 llvm::sys::path::append(LibDir, "arm");
9063 break;
9064 default:
9065 break;
9066 }
9067 CmdArgs.push_back(
9068 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009069
9070 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9071 std::string UniversalCRTLibPath;
9072 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9073 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9074 UniversalCRTLibPath.c_str()));
9075 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009076 }
9077
9078 std::string WindowsSdkLibPath;
9079 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9080 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9081 WindowsSdkLibPath.c_str()));
9082 }
9083
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009084 CmdArgs.push_back("-nologo");
9085
Reid Kleckner124955a2015-08-05 18:51:13 +00009086 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009087 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009088
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009089 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009090 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009091 if (DLL) {
9092 CmdArgs.push_back(Args.MakeArgString("-dll"));
9093
9094 SmallString<128> ImplibName(Output.getFilename());
9095 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009096 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009097 }
9098
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009099 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009100 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009101 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009102 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009103 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9104 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009105 // Make sure the dynamic runtime thunk is not optimized out at link time
9106 // to ensure proper SEH handling.
9107 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009108 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009109 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009110 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009111 for (const auto &Lib : {"asan", "asan_cxx"})
9112 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009113 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009114 }
9115
Hans Wennborg2e274592013-08-13 23:38:57 +00009116 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009117
Alexey Bataevc7e84352015-08-19 04:49:01 +00009118 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9119 options::OPT_fno_openmp, false)) {
9120 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9121 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9122 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9123 TC.getDriver().Dir + "/../lib"));
9124 switch (getOpenMPRuntime(getToolChain(), Args)) {
9125 case OMPRT_OMP:
9126 CmdArgs.push_back("-defaultlib:libomp.lib");
9127 break;
9128 case OMPRT_IOMP5:
9129 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9130 break;
9131 case OMPRT_GOMP:
9132 break;
9133 case OMPRT_Unknown:
9134 // Already diagnosed.
9135 break;
9136 }
9137 }
9138
Reid Kleckner337188f2014-09-16 19:22:00 +00009139 // Add filenames, libraries, and other linker inputs.
9140 for (const auto &Input : Inputs) {
9141 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009142 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009143 continue;
9144 }
9145
9146 const Arg &A = Input.getInputArg();
9147
9148 // Render -l options differently for the MSVC linker.
9149 if (A.getOption().matches(options::OPT_l)) {
9150 StringRef Lib = A.getValue();
9151 const char *LinkLibArg;
9152 if (Lib.endswith(".lib"))
9153 LinkLibArg = Args.MakeArgString(Lib);
9154 else
9155 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9156 CmdArgs.push_back(LinkLibArg);
9157 continue;
9158 }
9159
9160 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9161 // or -L. Render it, even if MSVC doesn't understand it.
9162 A.renderAsInput(Args, CmdArgs);
9163 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009164
Zachary Turner719f58c2014-12-01 23:06:47 +00009165 // We need to special case some linker paths. In the case of lld, we need to
9166 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9167 // linker, we need to use a special search algorithm.
9168 llvm::SmallString<128> linkPath;
9169 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9170 if (Linker.equals_lower("lld"))
9171 Linker = "lld-link";
9172
9173 if (Linker.equals_lower("link")) {
9174 // If we're using the MSVC linker, it's not sufficient to just use link
9175 // from the program PATH, because other environments like GnuWin32 install
9176 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009177 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009178 C.getDriver().getClangProgramPath());
9179 } else {
9180 linkPath = Linker;
9181 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009182 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009183 }
9184
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009185 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009186 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009187}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009188
Douglas Katzman95354292015-06-23 20:42:09 +00009189void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9190 const InputInfo &Output,
9191 const InputInfoList &Inputs,
9192 const ArgList &Args,
9193 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009194 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9195}
9196
Douglas Katzman95354292015-06-23 20:42:09 +00009197std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009198 Compilation &C, const JobAction &JA, const InputInfo &Output,
9199 const InputInfoList &Inputs, const ArgList &Args,
9200 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009201 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009202 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009203 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009204 CmdArgs.push_back("/W0"); // No warnings.
9205
9206 // The goal is to be able to invoke this tool correctly based on
9207 // any flag accepted by clang-cl.
9208
9209 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009210 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009211
9212 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009213 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9214 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9215 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009216 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9217 if (A->getOption().getID() == options::OPT_O0) {
9218 CmdArgs.push_back("/Od");
9219 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009220 CmdArgs.push_back("/Og");
9221
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009222 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009223 if (OptLevel == "s" || OptLevel == "z")
9224 CmdArgs.push_back("/Os");
9225 else
9226 CmdArgs.push_back("/Ot");
9227
9228 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009229 }
9230 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009231 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9232 options::OPT_fno_omit_frame_pointer))
9233 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9234 ? "/Oy"
9235 : "/Oy-");
9236 if (!Args.hasArg(options::OPT_fwritable_strings))
9237 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009238
Nico Weber3f8dafb2015-03-12 19:37:10 +00009239 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009240 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9241
David Majnemerf6072342014-07-01 22:24:56 +00009242 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9243 /*default=*/false))
9244 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009245 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9246 options::OPT_fno_function_sections))
9247 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9248 ? "/Gy"
9249 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009250 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9251 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009252 CmdArgs.push_back(
9253 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009254 if (Args.hasArg(options::OPT_fsyntax_only))
9255 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009256 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9257 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009258 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009259
Nico Weber3f8dafb2015-03-12 19:37:10 +00009260 std::vector<std::string> Includes =
9261 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009262 for (const auto &Include : Includes)
9263 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009264
Hans Wennborg87cfa712013-09-19 20:32:16 +00009265 // Flags that can simply be passed through.
9266 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9267 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009268 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009269 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009270
9271 // The order of these flags is relevant, so pick the last one.
9272 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9273 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9274 A->render(Args, CmdArgs);
9275
Hans Wennborg87cfa712013-09-19 20:32:16 +00009276 // Input filename.
9277 assert(Inputs.size() == 1);
9278 const InputInfo &II = Inputs[0];
9279 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9280 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9281 if (II.isFilename())
9282 CmdArgs.push_back(II.getFilename());
9283 else
9284 II.getInputArg().renderAsInput(Args, CmdArgs);
9285
9286 // Output filename.
9287 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009288 const char *Fo =
9289 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009290 CmdArgs.push_back(Fo);
9291
Hans Wennborg188382e2013-09-20 18:16:35 +00009292 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009293 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9294 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009295 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009296 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009297}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009298
Yaron Keren1c0070c2015-07-02 04:45:27 +00009299/// MinGW Tools
9300void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9301 const InputInfo &Output,
9302 const InputInfoList &Inputs,
9303 const ArgList &Args,
9304 const char *LinkingOutput) const {
9305 claimNoWarnArgs(Args);
9306 ArgStringList CmdArgs;
9307
9308 if (getToolChain().getArch() == llvm::Triple::x86) {
9309 CmdArgs.push_back("--32");
9310 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9311 CmdArgs.push_back("--64");
9312 }
9313
9314 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9315
9316 CmdArgs.push_back("-o");
9317 CmdArgs.push_back(Output.getFilename());
9318
9319 for (const auto &II : Inputs)
9320 CmdArgs.push_back(II.getFilename());
9321
9322 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009323 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009324
9325 if (Args.hasArg(options::OPT_gsplit_dwarf))
9326 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9327 SplitDebugName(Args, Inputs[0]));
9328}
9329
9330void MinGW::Linker::AddLibGCC(const ArgList &Args,
9331 ArgStringList &CmdArgs) const {
9332 if (Args.hasArg(options::OPT_mthreads))
9333 CmdArgs.push_back("-lmingwthrd");
9334 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009335
Yaron Kerenaa281332015-08-09 00:24:07 +00009336 // Make use of compiler-rt if --rtlib option is used
9337 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9338 if (RLT == ToolChain::RLT_Libgcc) {
9339 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9340 Args.hasArg(options::OPT_static);
9341 bool Shared = Args.hasArg(options::OPT_shared);
9342 bool CXX = getToolChain().getDriver().CCCIsCXX();
9343
9344 if (Static || (!CXX && !Shared)) {
9345 CmdArgs.push_back("-lgcc");
9346 CmdArgs.push_back("-lgcc_eh");
9347 } else {
9348 CmdArgs.push_back("-lgcc_s");
9349 CmdArgs.push_back("-lgcc");
9350 }
9351 } else {
9352 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9353 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009354
Yaron Keren1c0070c2015-07-02 04:45:27 +00009355 CmdArgs.push_back("-lmoldname");
9356 CmdArgs.push_back("-lmingwex");
9357 CmdArgs.push_back("-lmsvcrt");
9358}
9359
9360void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9361 const InputInfo &Output,
9362 const InputInfoList &Inputs,
9363 const ArgList &Args,
9364 const char *LinkingOutput) const {
9365 const ToolChain &TC = getToolChain();
9366 const Driver &D = TC.getDriver();
9367 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9368
9369 ArgStringList CmdArgs;
9370
9371 // Silence warning for "clang -g foo.o -o foo"
9372 Args.ClaimAllArgs(options::OPT_g_Group);
9373 // and "clang -emit-llvm foo.o -o foo"
9374 Args.ClaimAllArgs(options::OPT_emit_llvm);
9375 // and for "clang -w foo.o -o foo". Other warning options are already
9376 // handled somewhere else.
9377 Args.ClaimAllArgs(options::OPT_w);
9378
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009379 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9380 if (LinkerName.equals_lower("lld")) {
9381 CmdArgs.push_back("-flavor");
9382 CmdArgs.push_back("gnu");
9383 }
9384
Yaron Keren1c0070c2015-07-02 04:45:27 +00009385 if (!D.SysRoot.empty())
9386 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9387
9388 if (Args.hasArg(options::OPT_s))
9389 CmdArgs.push_back("-s");
9390
9391 CmdArgs.push_back("-m");
9392 if (TC.getArch() == llvm::Triple::x86)
9393 CmdArgs.push_back("i386pe");
9394 if (TC.getArch() == llvm::Triple::x86_64)
9395 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009396 if (TC.getArch() == llvm::Triple::arm)
9397 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009398
9399 if (Args.hasArg(options::OPT_mwindows)) {
9400 CmdArgs.push_back("--subsystem");
9401 CmdArgs.push_back("windows");
9402 } else if (Args.hasArg(options::OPT_mconsole)) {
9403 CmdArgs.push_back("--subsystem");
9404 CmdArgs.push_back("console");
9405 }
9406
9407 if (Args.hasArg(options::OPT_static))
9408 CmdArgs.push_back("-Bstatic");
9409 else {
9410 if (Args.hasArg(options::OPT_mdll))
9411 CmdArgs.push_back("--dll");
9412 else if (Args.hasArg(options::OPT_shared))
9413 CmdArgs.push_back("--shared");
9414 CmdArgs.push_back("-Bdynamic");
9415 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9416 CmdArgs.push_back("-e");
9417 if (TC.getArch() == llvm::Triple::x86)
9418 CmdArgs.push_back("_DllMainCRTStartup@12");
9419 else
9420 CmdArgs.push_back("DllMainCRTStartup");
9421 CmdArgs.push_back("--enable-auto-image-base");
9422 }
9423 }
9424
9425 CmdArgs.push_back("-o");
9426 CmdArgs.push_back(Output.getFilename());
9427
9428 Args.AddAllArgs(CmdArgs, options::OPT_e);
9429 // FIXME: add -N, -n flags
9430 Args.AddLastArg(CmdArgs, options::OPT_r);
9431 Args.AddLastArg(CmdArgs, options::OPT_s);
9432 Args.AddLastArg(CmdArgs, options::OPT_t);
9433 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9434 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9435
9436 if (!Args.hasArg(options::OPT_nostdlib) &&
9437 !Args.hasArg(options::OPT_nostartfiles)) {
9438 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9439 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9440 } else {
9441 if (Args.hasArg(options::OPT_municode))
9442 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9443 else
9444 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9445 }
9446 if (Args.hasArg(options::OPT_pg))
9447 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9448 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9449 }
9450
9451 Args.AddAllArgs(CmdArgs, options::OPT_L);
9452 const ToolChain::path_list Paths = TC.getFilePaths();
9453 for (const auto &Path : Paths)
9454 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9455
9456 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9457
9458 // TODO: Add ASan stuff here
9459
9460 // TODO: Add profile stuff here
9461
9462 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9463 !Args.hasArg(options::OPT_nodefaultlibs)) {
9464 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9465 !Args.hasArg(options::OPT_static);
9466 if (OnlyLibstdcxxStatic)
9467 CmdArgs.push_back("-Bstatic");
9468 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9469 if (OnlyLibstdcxxStatic)
9470 CmdArgs.push_back("-Bdynamic");
9471 }
9472
9473 if (!Args.hasArg(options::OPT_nostdlib)) {
9474 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9475 if (Args.hasArg(options::OPT_static))
9476 CmdArgs.push_back("--start-group");
9477
9478 if (Args.hasArg(options::OPT_fstack_protector) ||
9479 Args.hasArg(options::OPT_fstack_protector_strong) ||
9480 Args.hasArg(options::OPT_fstack_protector_all)) {
9481 CmdArgs.push_back("-lssp_nonshared");
9482 CmdArgs.push_back("-lssp");
9483 }
9484 if (Args.hasArg(options::OPT_fopenmp))
9485 CmdArgs.push_back("-lgomp");
9486
9487 AddLibGCC(Args, CmdArgs);
9488
9489 if (Args.hasArg(options::OPT_pg))
9490 CmdArgs.push_back("-lgmon");
9491
Yaron Kerenadce68e2015-07-06 18:52:19 +00009492 if (Args.hasArg(options::OPT_pthread))
9493 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009494
9495 // add system libraries
9496 if (Args.hasArg(options::OPT_mwindows)) {
9497 CmdArgs.push_back("-lgdi32");
9498 CmdArgs.push_back("-lcomdlg32");
9499 }
9500 CmdArgs.push_back("-ladvapi32");
9501 CmdArgs.push_back("-lshell32");
9502 CmdArgs.push_back("-luser32");
9503 CmdArgs.push_back("-lkernel32");
9504
9505 if (Args.hasArg(options::OPT_static))
9506 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009507 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009508 AddLibGCC(Args, CmdArgs);
9509 }
9510
9511 if (!Args.hasArg(options::OPT_nostartfiles)) {
9512 // Add crtfastmath.o if available and fast math is enabled.
9513 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9514
9515 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9516 }
9517 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009518 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009519 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009520}
9521
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009522/// XCore Tools
9523// We pass assemble and link construction to the xcc tool.
9524
Douglas Katzman95354292015-06-23 20:42:09 +00009525void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9526 const InputInfo &Output,
9527 const InputInfoList &Inputs,
9528 const ArgList &Args,
9529 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009530 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009531 ArgStringList CmdArgs;
9532
9533 CmdArgs.push_back("-o");
9534 CmdArgs.push_back(Output.getFilename());
9535
9536 CmdArgs.push_back("-c");
9537
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009538 if (Args.hasArg(options::OPT_v))
9539 CmdArgs.push_back("-v");
9540
Robert Lytton894d25c2014-05-02 09:33:25 +00009541 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9542 if (!A->getOption().matches(options::OPT_g0))
9543 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009544
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009545 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9546 false))
9547 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009549 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009550
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009551 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009552 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009553
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009554 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009555 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009556}
9557
Douglas Katzman95354292015-06-23 20:42:09 +00009558void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9559 const InputInfo &Output,
9560 const InputInfoList &Inputs,
9561 const ArgList &Args,
9562 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009563 ArgStringList CmdArgs;
9564
9565 if (Output.isFilename()) {
9566 CmdArgs.push_back("-o");
9567 CmdArgs.push_back(Output.getFilename());
9568 } else {
9569 assert(Output.isNothing() && "Invalid output.");
9570 }
9571
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009572 if (Args.hasArg(options::OPT_v))
9573 CmdArgs.push_back("-v");
9574
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009575 // Pass -fexceptions through to the linker if it was present.
9576 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9577 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009578 CmdArgs.push_back("-fexceptions");
9579
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009580 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009582 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009583 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009584}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009585
Douglas Katzman95354292015-06-23 20:42:09 +00009586void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9587 const InputInfo &Output,
9588 const InputInfoList &Inputs,
9589 const ArgList &Args,
9590 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009591 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009592 const auto &TC =
9593 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9594 ArgStringList CmdArgs;
9595 const char *Exec;
9596
9597 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009598 default:
9599 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009600 case llvm::Triple::arm:
9601 case llvm::Triple::thumb:
9602 break;
9603 case llvm::Triple::x86:
9604 CmdArgs.push_back("--32");
9605 break;
9606 case llvm::Triple::x86_64:
9607 CmdArgs.push_back("--64");
9608 break;
9609 }
9610
9611 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9612
9613 CmdArgs.push_back("-o");
9614 CmdArgs.push_back(Output.getFilename());
9615
9616 for (const auto &Input : Inputs)
9617 CmdArgs.push_back(Input.getFilename());
9618
9619 const std::string Assembler = TC.GetProgramPath("as");
9620 Exec = Args.MakeArgString(Assembler);
9621
Justin Bognerd3371d82015-07-17 03:35:54 +00009622 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009623}
9624
Douglas Katzman95354292015-06-23 20:42:09 +00009625void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9626 const InputInfo &Output,
9627 const InputInfoList &Inputs,
9628 const ArgList &Args,
9629 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009630 const auto &TC =
9631 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9632 const llvm::Triple &T = TC.getTriple();
9633 const Driver &D = TC.getDriver();
9634 SmallString<128> EntryPoint;
9635 ArgStringList CmdArgs;
9636 const char *Exec;
9637
9638 // Silence warning for "clang -g foo.o -o foo"
9639 Args.ClaimAllArgs(options::OPT_g_Group);
9640 // and "clang -emit-llvm foo.o -o foo"
9641 Args.ClaimAllArgs(options::OPT_emit_llvm);
9642 // and for "clang -w foo.o -o foo"
9643 Args.ClaimAllArgs(options::OPT_w);
9644 // Other warning options are already handled somewhere else.
9645
9646 if (!D.SysRoot.empty())
9647 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9648
9649 if (Args.hasArg(options::OPT_pie))
9650 CmdArgs.push_back("-pie");
9651 if (Args.hasArg(options::OPT_rdynamic))
9652 CmdArgs.push_back("-export-dynamic");
9653 if (Args.hasArg(options::OPT_s))
9654 CmdArgs.push_back("--strip-all");
9655
9656 CmdArgs.push_back("-m");
9657 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009658 default:
9659 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009660 case llvm::Triple::arm:
9661 case llvm::Triple::thumb:
9662 // FIXME: this is incorrect for WinCE
9663 CmdArgs.push_back("thumb2pe");
9664 break;
9665 case llvm::Triple::x86:
9666 CmdArgs.push_back("i386pe");
9667 EntryPoint.append("_");
9668 break;
9669 case llvm::Triple::x86_64:
9670 CmdArgs.push_back("i386pep");
9671 break;
9672 }
9673
9674 if (Args.hasArg(options::OPT_shared)) {
9675 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009676 default:
9677 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009678 case llvm::Triple::arm:
9679 case llvm::Triple::thumb:
9680 case llvm::Triple::x86_64:
9681 EntryPoint.append("_DllMainCRTStartup");
9682 break;
9683 case llvm::Triple::x86:
9684 EntryPoint.append("_DllMainCRTStartup@12");
9685 break;
9686 }
9687
9688 CmdArgs.push_back("-shared");
9689 CmdArgs.push_back("-Bdynamic");
9690
9691 CmdArgs.push_back("--enable-auto-image-base");
9692
9693 CmdArgs.push_back("--entry");
9694 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9695 } else {
9696 EntryPoint.append("mainCRTStartup");
9697
9698 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9699 : "-Bdynamic");
9700
9701 if (!Args.hasArg(options::OPT_nostdlib) &&
9702 !Args.hasArg(options::OPT_nostartfiles)) {
9703 CmdArgs.push_back("--entry");
9704 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9705 }
9706
9707 // FIXME: handle subsystem
9708 }
9709
9710 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009711 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009712
9713 CmdArgs.push_back("-o");
9714 CmdArgs.push_back(Output.getFilename());
9715
9716 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9717 SmallString<261> ImpLib(Output.getFilename());
9718 llvm::sys::path::replace_extension(ImpLib, ".lib");
9719
9720 CmdArgs.push_back("--out-implib");
9721 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9722 }
9723
9724 if (!Args.hasArg(options::OPT_nostdlib) &&
9725 !Args.hasArg(options::OPT_nostartfiles)) {
9726 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9727 const char *CRTBegin;
9728
9729 CRTBegin =
9730 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9731 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9732 }
9733
9734 Args.AddAllArgs(CmdArgs, options::OPT_L);
9735
9736 const auto &Paths = TC.getFilePaths();
9737 for (const auto &Path : Paths)
9738 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9739
9740 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9741
9742 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9743 !Args.hasArg(options::OPT_nodefaultlibs)) {
9744 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9745 !Args.hasArg(options::OPT_static);
9746 if (StaticCXX)
9747 CmdArgs.push_back("-Bstatic");
9748 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9749 if (StaticCXX)
9750 CmdArgs.push_back("-Bdynamic");
9751 }
9752
9753 if (!Args.hasArg(options::OPT_nostdlib)) {
9754 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9755 // TODO handle /MT[d] /MD[d]
9756 CmdArgs.push_back("-lmsvcrt");
9757 AddRunTimeLibs(TC, D, CmdArgs, Args);
9758 }
9759 }
9760
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009761 if (TC.getSanitizerArgs().needsAsanRt()) {
9762 // TODO handle /MT[d] /MD[d]
9763 if (Args.hasArg(options::OPT_shared)) {
9764 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9765 } else {
9766 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9767 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9768 // Make sure the dynamic runtime thunk is not optimized out at link time
9769 // to ensure proper SEH handling.
9770 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9771 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9772 ? "___asan_seh_interceptor"
9773 : "__asan_seh_interceptor"));
9774 }
9775 }
9776
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009777 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009778
Justin Bognerd3371d82015-07-17 03:35:54 +00009779 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009780}
Douglas Katzman84a75642015-06-19 14:55:19 +00009781
Douglas Katzman95354292015-06-23 20:42:09 +00009782void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9783 const InputInfo &Output,
9784 const InputInfoList &Inputs,
9785 const ArgList &Args,
9786 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009787
9788 ArgStringList CmdArgs;
9789
9790 assert(Inputs.size() == 1);
9791 const InputInfo &II = Inputs[0];
9792 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9793 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9794
Douglas Katzman84a75642015-06-19 14:55:19 +00009795 CmdArgs.push_back("-DMYRIAD2");
9796 CmdArgs.push_back("-mcpu=myriad2");
9797 CmdArgs.push_back("-S");
9798
Douglas Katzmanf6071112015-08-03 14:34:22 +00009799 // Append all -I, -iquote, -isystem paths, defines/undefines,
9800 // 'f' flags, optimize flags, and warning options.
9801 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009802 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9803 options::OPT_D, options::OPT_U,
9804 options::OPT_f_Group, options::OPT_f_clang_Group,
9805 options::OPT_g_Group, options::OPT_M_Group,
9806 options::OPT_O_Group, options::OPT_W_Group});
9807
9808 // If we're producing a dependency file, and assembly is the final action,
9809 // then the name of the target in the dependency file should be the '.o'
9810 // file, not the '.s' file produced by this step. For example, instead of
9811 // /tmp/mumble.s: mumble.c .../someheader.h
9812 // the filename on the lefthand side should be "mumble.o"
9813 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9814 C.getActions().size() == 1 &&
9815 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9816 Arg *A = Args.getLastArg(options::OPT_o);
9817 if (A) {
9818 CmdArgs.push_back("-MT");
9819 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9820 }
9821 }
9822
Douglas Katzman84a75642015-06-19 14:55:19 +00009823 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9824
9825 CmdArgs.push_back(II.getFilename());
9826 CmdArgs.push_back("-o");
9827 CmdArgs.push_back(Output.getFilename());
9828
9829 std::string Exec =
9830 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009831 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9832 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009833}
9834
Douglas Katzman95354292015-06-23 20:42:09 +00009835void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9836 const InputInfo &Output,
9837 const InputInfoList &Inputs,
9838 const ArgList &Args,
9839 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009840 ArgStringList CmdArgs;
9841
9842 assert(Inputs.size() == 1);
9843 const InputInfo &II = Inputs[0];
9844 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9845 assert(Output.getType() == types::TY_Object);
9846
9847 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009848 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009849 CmdArgs.push_back("-noSPrefixing");
9850 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009851 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9852 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9853 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009854 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009855 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009856 }
9857 CmdArgs.push_back("-elf"); // Output format.
9858 CmdArgs.push_back(II.getFilename());
9859 CmdArgs.push_back(
9860 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9861
9862 std::string Exec =
9863 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009864 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9865 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009866}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009867
9868void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9869 const InputInfo &Output,
9870 const InputInfoList &Inputs,
9871 const ArgList &Args,
9872 const char *LinkingOutput) const {
9873 const auto &TC =
9874 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9875 const llvm::Triple &T = TC.getTriple();
9876 ArgStringList CmdArgs;
9877 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009878 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9879 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009880
9881 std::string StartFilesDir, BuiltinLibDir;
9882 TC.getCompilerSupportDir(StartFilesDir);
9883 TC.getBuiltinLibDir(BuiltinLibDir);
9884
9885 if (T.getArch() == llvm::Triple::sparc)
9886 CmdArgs.push_back("-EB");
9887 else // SHAVE assumes little-endian, and sparcel is expressly so.
9888 CmdArgs.push_back("-EL");
9889
9890 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9891 // but we never pass through a --sysroot option and various other bits.
9892 // For example, there are no sanitizers (yet) nor gold linker.
9893
9894 // Eat some arguments that may be present but have no effect.
9895 Args.ClaimAllArgs(options::OPT_g_Group);
9896 Args.ClaimAllArgs(options::OPT_w);
9897 Args.ClaimAllArgs(options::OPT_static_libgcc);
9898
9899 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9900 CmdArgs.push_back("-s");
9901
9902 CmdArgs.push_back("-o");
9903 CmdArgs.push_back(Output.getFilename());
9904
9905 if (UseStartfiles) {
9906 // If you want startfiles, it means you want the builtin crti and crtbegin,
9907 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9908 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9909 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9910 }
9911
9912 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9913 options::OPT_e, options::OPT_s, options::OPT_t,
9914 options::OPT_Z_Flag, options::OPT_r});
9915
Douglas Katzman526b5f92015-10-21 19:33:54 +00009916 // The linker doesn't use these builtin paths unless directed to,
9917 // because it was not compiled for support with sysroots, nor does
9918 // it have a default of little-endian with FPU.
9919 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9920 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009921
9922 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9923
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009924 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +00009925 if (C.getDriver().CCCIsCXX())
9926 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009927 if (T.getOS() == llvm::Triple::RTEMS) {
9928 CmdArgs.push_back("--start-group");
9929 CmdArgs.push_back("-lc");
9930 // You must provide your own "-L" option to enable finding these.
9931 CmdArgs.push_back("-lrtemscpu");
9932 CmdArgs.push_back("-lrtemsbsp");
9933 CmdArgs.push_back("--end-group");
9934 } else {
9935 CmdArgs.push_back("-lc");
9936 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009937 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009938 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009939 if (UseStartfiles) {
9940 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9941 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9942 }
9943
9944 std::string Exec =
9945 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9946 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9947 CmdArgs, Inputs));
9948}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00009949
9950void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9951 const InputInfo &Output,
9952 const InputInfoList &Inputs,
9953 const ArgList &Args,
9954 const char *LinkingOutput) const {
9955 claimNoWarnArgs(Args);
9956 ArgStringList CmdArgs;
9957
9958 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9959
9960 CmdArgs.push_back("-o");
9961 CmdArgs.push_back(Output.getFilename());
9962
9963 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
9964 const InputInfo &Input = Inputs[0];
9965 assert(Input.isFilename() && "Invalid input.");
9966 CmdArgs.push_back(Input.getFilename());
9967
9968 const char *Exec =
9969 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
9970 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
9971}
9972
9973static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
9974 ArgStringList &CmdArgs) {
9975 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
9976 false) ||
9977 Args.hasArg(options::OPT_fprofile_generate) ||
9978 Args.hasArg(options::OPT_fprofile_instr_generate) ||
9979 Args.hasArg(options::OPT_fcreate_profile) ||
9980 Args.hasArg(options::OPT_coverage)))
9981 return;
9982
9983 assert(TC.getTriple().isPS4CPU() &&
9984 "Profiling libraries are only implemented for the PS4 CPU");
9985 CmdArgs.push_back("-lclang_rt.profile-x86_64");
9986}
9987
9988static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
9989 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
9990 if (SanArgs.needsUbsanRt()) {
9991 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
9992 }
9993 if (SanArgs.needsAsanRt()) {
9994 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
9995 }
9996}
9997
9998static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
9999 const JobAction &JA, const InputInfo &Output,
10000 const InputInfoList &Inputs,
10001 const ArgList &Args,
10002 const char *LinkingOutput) {
10003 const toolchains::FreeBSD &ToolChain =
10004 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10005 const Driver &D = ToolChain.getDriver();
10006 ArgStringList CmdArgs;
10007
10008 // Silence warning for "clang -g foo.o -o foo"
10009 Args.ClaimAllArgs(options::OPT_g_Group);
10010 // and "clang -emit-llvm foo.o -o foo"
10011 Args.ClaimAllArgs(options::OPT_emit_llvm);
10012 // and for "clang -w foo.o -o foo". Other warning options are already
10013 // handled somewhere else.
10014 Args.ClaimAllArgs(options::OPT_w);
10015
10016 if (!D.SysRoot.empty())
10017 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10018
10019 if (Args.hasArg(options::OPT_pie))
10020 CmdArgs.push_back("-pie");
10021
10022 if (Args.hasArg(options::OPT_rdynamic))
10023 CmdArgs.push_back("-export-dynamic");
10024 if (Args.hasArg(options::OPT_shared))
10025 CmdArgs.push_back("--oformat=so");
10026
10027 if (Output.isFilename()) {
10028 CmdArgs.push_back("-o");
10029 CmdArgs.push_back(Output.getFilename());
10030 } else {
10031 assert(Output.isNothing() && "Invalid output.");
10032 }
10033
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010034 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10035
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010036 Args.AddAllArgs(CmdArgs, options::OPT_L);
10037 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10038 Args.AddAllArgs(CmdArgs, options::OPT_e);
10039 Args.AddAllArgs(CmdArgs, options::OPT_s);
10040 Args.AddAllArgs(CmdArgs, options::OPT_t);
10041 Args.AddAllArgs(CmdArgs, options::OPT_r);
10042
10043 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10044 CmdArgs.push_back("--no-demangle");
10045
10046 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10047
10048 if (Args.hasArg(options::OPT_pthread)) {
10049 CmdArgs.push_back("-lpthread");
10050 }
10051
10052 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010053
10054 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10055
10056 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10057}
10058
10059static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10060 const JobAction &JA, const InputInfo &Output,
10061 const InputInfoList &Inputs,
10062 const ArgList &Args,
10063 const char *LinkingOutput) {
10064 const toolchains::FreeBSD &ToolChain =
10065 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10066 const Driver &D = ToolChain.getDriver();
10067 ArgStringList CmdArgs;
10068
10069 // Silence warning for "clang -g foo.o -o foo"
10070 Args.ClaimAllArgs(options::OPT_g_Group);
10071 // and "clang -emit-llvm foo.o -o foo"
10072 Args.ClaimAllArgs(options::OPT_emit_llvm);
10073 // and for "clang -w foo.o -o foo". Other warning options are already
10074 // handled somewhere else.
10075 Args.ClaimAllArgs(options::OPT_w);
10076
10077 if (!D.SysRoot.empty())
10078 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10079
10080 if (Args.hasArg(options::OPT_pie))
10081 CmdArgs.push_back("-pie");
10082
10083 if (Args.hasArg(options::OPT_static)) {
10084 CmdArgs.push_back("-Bstatic");
10085 } else {
10086 if (Args.hasArg(options::OPT_rdynamic))
10087 CmdArgs.push_back("-export-dynamic");
10088 CmdArgs.push_back("--eh-frame-hdr");
10089 if (Args.hasArg(options::OPT_shared)) {
10090 CmdArgs.push_back("-Bshareable");
10091 } else {
10092 CmdArgs.push_back("-dynamic-linker");
10093 CmdArgs.push_back("/libexec/ld-elf.so.1");
10094 }
10095 CmdArgs.push_back("--enable-new-dtags");
10096 }
10097
10098 if (Output.isFilename()) {
10099 CmdArgs.push_back("-o");
10100 CmdArgs.push_back(Output.getFilename());
10101 } else {
10102 assert(Output.isNothing() && "Invalid output.");
10103 }
10104
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010105 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10106
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010107 if (!Args.hasArg(options::OPT_nostdlib) &&
10108 !Args.hasArg(options::OPT_nostartfiles)) {
10109 const char *crt1 = NULL;
10110 if (!Args.hasArg(options::OPT_shared)) {
10111 if (Args.hasArg(options::OPT_pg))
10112 crt1 = "gcrt1.o";
10113 else if (Args.hasArg(options::OPT_pie))
10114 crt1 = "Scrt1.o";
10115 else
10116 crt1 = "crt1.o";
10117 }
10118 if (crt1)
10119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10120
10121 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10122
10123 const char *crtbegin = NULL;
10124 if (Args.hasArg(options::OPT_static))
10125 crtbegin = "crtbeginT.o";
10126 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10127 crtbegin = "crtbeginS.o";
10128 else
10129 crtbegin = "crtbegin.o";
10130
10131 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10132 }
10133
10134 Args.AddAllArgs(CmdArgs, options::OPT_L);
10135
10136 const ToolChain::path_list Paths = ToolChain.getFilePaths();
10137 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
10138 i != e; ++i)
10139 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
10140
10141 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10142 Args.AddAllArgs(CmdArgs, options::OPT_e);
10143 Args.AddAllArgs(CmdArgs, options::OPT_s);
10144 Args.AddAllArgs(CmdArgs, options::OPT_t);
10145 Args.AddAllArgs(CmdArgs, options::OPT_r);
10146
10147 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10148 CmdArgs.push_back("--no-demangle");
10149
10150 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10151
10152 if (!Args.hasArg(options::OPT_nostdlib) &&
10153 !Args.hasArg(options::OPT_nodefaultlibs)) {
10154 // For PS4, we always want to pass libm, libstdc++ and libkernel
10155 // libraries for both C and C++ compilations.
10156 CmdArgs.push_back("-lkernel");
10157 if (D.CCCIsCXX()) {
10158 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10159 if (Args.hasArg(options::OPT_pg))
10160 CmdArgs.push_back("-lm_p");
10161 else
10162 CmdArgs.push_back("-lm");
10163 }
10164 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10165 // the default system libraries. Just mimic this for now.
10166 if (Args.hasArg(options::OPT_pg))
10167 CmdArgs.push_back("-lgcc_p");
10168 else
10169 CmdArgs.push_back("-lcompiler_rt");
10170 if (Args.hasArg(options::OPT_static)) {
10171 CmdArgs.push_back("-lstdc++");
10172 } else if (Args.hasArg(options::OPT_pg)) {
10173 CmdArgs.push_back("-lgcc_eh_p");
10174 } else {
10175 CmdArgs.push_back("--as-needed");
10176 CmdArgs.push_back("-lstdc++");
10177 CmdArgs.push_back("--no-as-needed");
10178 }
10179
10180 if (Args.hasArg(options::OPT_pthread)) {
10181 if (Args.hasArg(options::OPT_pg))
10182 CmdArgs.push_back("-lpthread_p");
10183 else
10184 CmdArgs.push_back("-lpthread");
10185 }
10186
10187 if (Args.hasArg(options::OPT_pg)) {
10188 if (Args.hasArg(options::OPT_shared))
10189 CmdArgs.push_back("-lc");
10190 else {
10191 if (Args.hasArg(options::OPT_static)) {
10192 CmdArgs.push_back("--start-group");
10193 CmdArgs.push_back("-lc_p");
10194 CmdArgs.push_back("-lpthread_p");
10195 CmdArgs.push_back("--end-group");
10196 } else {
10197 CmdArgs.push_back("-lc_p");
10198 }
10199 }
10200 CmdArgs.push_back("-lgcc_p");
10201 } else {
10202 if (Args.hasArg(options::OPT_static)) {
10203 CmdArgs.push_back("--start-group");
10204 CmdArgs.push_back("-lc");
10205 CmdArgs.push_back("-lpthread");
10206 CmdArgs.push_back("--end-group");
10207 } else {
10208 CmdArgs.push_back("-lc");
10209 }
10210 CmdArgs.push_back("-lcompiler_rt");
10211 }
10212
10213 if (Args.hasArg(options::OPT_static)) {
10214 CmdArgs.push_back("-lstdc++");
10215 } else if (Args.hasArg(options::OPT_pg)) {
10216 CmdArgs.push_back("-lgcc_eh_p");
10217 } else {
10218 CmdArgs.push_back("--as-needed");
10219 CmdArgs.push_back("-lstdc++");
10220 CmdArgs.push_back("--no-as-needed");
10221 }
10222 }
10223
10224 if (!Args.hasArg(options::OPT_nostdlib) &&
10225 !Args.hasArg(options::OPT_nostartfiles)) {
10226 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10227 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10228 else
10229 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10231 }
10232
10233 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010234
10235 const char *Exec =
10236#ifdef LLVM_ON_WIN32
10237 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10238#else
10239 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10240#endif
10241
10242 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10243}
10244
10245void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10246 const InputInfo &Output,
10247 const InputInfoList &Inputs,
10248 const ArgList &Args,
10249 const char *LinkingOutput) const {
10250 const toolchains::FreeBSD &ToolChain =
10251 static_cast<const toolchains::FreeBSD &>(getToolChain());
10252 const Driver &D = ToolChain.getDriver();
10253 bool PS4Linker;
10254 StringRef LinkerOptName;
10255 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10256 LinkerOptName = A->getValue();
10257 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10258 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10259 }
10260
10261 if (LinkerOptName == "gold")
10262 PS4Linker = false;
10263 else if (LinkerOptName == "ps4")
10264 PS4Linker = true;
10265 else
10266 PS4Linker = !Args.hasArg(options::OPT_shared);
10267
10268 if (PS4Linker)
10269 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10270 else
10271 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10272}