blob: 8d86bb55fc049085d2f9f9806b96f74908c09c85 [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
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001675 if (IsThinLTO)
1676 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001677}
1678
Sanjay Patel2987c292015-06-11 14:53:41 +00001679/// This is a helper function for validating the optional refinement step
1680/// parameter in reciprocal argument strings. Return false if there is an error
1681/// parsing the refinement step. Otherwise, return true and set the Position
1682/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001683static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001684 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001685 const char RefinementStepToken = ':';
1686 Position = In.find(RefinementStepToken);
1687 if (Position != StringRef::npos) {
1688 StringRef Option = A.getOption().getName();
1689 StringRef RefStep = In.substr(Position + 1);
1690 // Allow exactly one numeric character for the additional refinement
1691 // step parameter. This is reasonable for all currently-supported
1692 // operations and architectures because we would expect that a larger value
1693 // of refinement steps would cause the estimate "optimization" to
1694 // under-perform the native operation. Also, if the estimate does not
1695 // converge quickly, it probably will not ever converge, so further
1696 // refinement steps will not produce a better answer.
1697 if (RefStep.size() != 1) {
1698 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1699 return false;
1700 }
1701 char RefStepChar = RefStep[0];
1702 if (RefStepChar < '0' || RefStepChar > '9') {
1703 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1704 return false;
1705 }
1706 }
1707 return true;
1708}
1709
1710/// The -mrecip flag requires processing of many optional parameters.
1711static void ParseMRecip(const Driver &D, const ArgList &Args,
1712 ArgStringList &OutStrings) {
1713 StringRef DisabledPrefixIn = "!";
1714 StringRef DisabledPrefixOut = "!";
1715 StringRef EnabledPrefixOut = "";
1716 StringRef Out = "-mrecip=";
1717
1718 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1719 if (!A)
1720 return;
1721
1722 unsigned NumOptions = A->getNumValues();
1723 if (NumOptions == 0) {
1724 // No option is the same as "all".
1725 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1726 return;
1727 }
1728
1729 // Pass through "all", "none", or "default" with an optional refinement step.
1730 if (NumOptions == 1) {
1731 StringRef Val = A->getValue(0);
1732 size_t RefStepLoc;
1733 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1734 return;
1735 StringRef ValBase = Val.slice(0, RefStepLoc);
1736 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1737 OutStrings.push_back(Args.MakeArgString(Out + Val));
1738 return;
1739 }
1740 }
1741
1742 // Each reciprocal type may be enabled or disabled individually.
1743 // Check each input value for validity, concatenate them all back together,
1744 // and pass through.
1745
1746 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001747 OptionStrings.insert(std::make_pair("divd", false));
1748 OptionStrings.insert(std::make_pair("divf", false));
1749 OptionStrings.insert(std::make_pair("vec-divd", false));
1750 OptionStrings.insert(std::make_pair("vec-divf", false));
1751 OptionStrings.insert(std::make_pair("sqrtd", false));
1752 OptionStrings.insert(std::make_pair("sqrtf", false));
1753 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1754 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001755
1756 for (unsigned i = 0; i != NumOptions; ++i) {
1757 StringRef Val = A->getValue(i);
1758
1759 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1760 // Ignore the disablement token for string matching.
1761 if (IsDisabled)
1762 Val = Val.substr(1);
1763
1764 size_t RefStep;
1765 if (!getRefinementStep(Val, D, *A, RefStep))
1766 return;
1767
1768 StringRef ValBase = Val.slice(0, RefStep);
1769 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1770 if (OptionIter == OptionStrings.end()) {
1771 // Try again specifying float suffix.
1772 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1773 if (OptionIter == OptionStrings.end()) {
1774 // The input name did not match any known option string.
1775 D.Diag(diag::err_drv_unknown_argument) << Val;
1776 return;
1777 }
1778 // The option was specified without a float or double suffix.
1779 // Make sure that the double entry was not already specified.
1780 // The float entry will be checked below.
1781 if (OptionStrings[ValBase.str() + 'd']) {
1782 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1783 return;
1784 }
1785 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001786
Sanjay Patel2987c292015-06-11 14:53:41 +00001787 if (OptionIter->second == true) {
1788 // Duplicate option specified.
1789 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1790 return;
1791 }
1792
1793 // Mark the matched option as found. Do not allow duplicate specifiers.
1794 OptionIter->second = true;
1795
1796 // If the precision was not specified, also mark the double entry as found.
1797 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1798 OptionStrings[ValBase.str() + 'd'] = true;
1799
1800 // Build the output string.
1801 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1802 Out = Args.MakeArgString(Out + Prefix + Val);
1803 if (i != NumOptions - 1)
1804 Out = Args.MakeArgString(Out + ",");
1805 }
1806
1807 OutStrings.push_back(Args.MakeArgString(Out));
1808}
1809
Eric Christopherc54920a2015-03-23 19:26:05 +00001810static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001811 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001812 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001813 // If -march=native, autodetect the feature list.
1814 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1815 if (StringRef(A->getValue()) == "native") {
1816 llvm::StringMap<bool> HostFeatures;
1817 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1818 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001819 Features.push_back(
1820 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001821 }
1822 }
1823
Jim Grosbach82eee262013-11-16 00:53:35 +00001824 if (Triple.getArchName() == "x86_64h") {
1825 // x86_64h implies quite a few of the more modern subtarget features
1826 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1827 Features.push_back("-rdrnd");
1828 Features.push_back("-aes");
1829 Features.push_back("-pclmul");
1830 Features.push_back("-rtm");
1831 Features.push_back("-hle");
1832 Features.push_back("-fsgsbase");
1833 }
1834
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001835 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001836 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001837 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001838 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001839 Features.push_back("+sse4.2");
1840 Features.push_back("+popcnt");
1841 } else
1842 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001843 }
1844
Eric Christopherc54920a2015-03-23 19:26:05 +00001845 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001846 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1847 StringRef Arch = A->getValue();
1848 bool ArchUsed = false;
1849 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001850 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001851 if (Arch == "AVX" || Arch == "AVX2") {
1852 ArchUsed = true;
1853 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1854 }
1855 }
1856 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001857 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001858 if (Arch == "IA32") {
1859 ArchUsed = true;
1860 } else if (Arch == "SSE" || Arch == "SSE2") {
1861 ArchUsed = true;
1862 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1863 }
1864 }
1865 if (!ArchUsed)
1866 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1867 }
1868
Jim Grosbach82eee262013-11-16 00:53:35 +00001869 // Now add any that the user explicitly requested on the command line,
1870 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001871 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1872 StringRef Name = A->getOption().getName();
1873 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001874
1875 // Skip over "-m".
1876 assert(Name.startswith("m") && "Invalid feature name.");
1877 Name = Name.substr(1);
1878
1879 bool IsNegative = Name.startswith("no-");
1880 if (IsNegative)
1881 Name = Name.substr(3);
1882
1883 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1884 }
1885}
1886
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001887void Clang::AddX86TargetArgs(const ArgList &Args,
1888 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001889 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001890 Args.hasArg(options::OPT_mkernel) ||
1891 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001892 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001893
Bob Wilson2616e2e2013-02-10 16:01:41 +00001894 // Default to avoid implicit floating-point for kernel/kext code, but allow
1895 // that to be overridden with -mno-soft-float.
1896 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1897 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 if (Arg *A = Args.getLastArg(
1899 options::OPT_msoft_float, options::OPT_mno_soft_float,
1900 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001901 const Option &O = A->getOption();
1902 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1903 O.matches(options::OPT_msoft_float));
1904 }
1905 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001906 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001907
1908 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1909 StringRef Value = A->getValue();
1910 if (Value == "intel" || Value == "att") {
1911 CmdArgs.push_back("-mllvm");
1912 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1913 } else {
1914 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1915 << A->getOption().getName() << Value;
1916 }
1917 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001918}
1919
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920void Clang::AddHexagonTargetArgs(const ArgList &Args,
1921 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001922 CmdArgs.push_back("-mqdsp6-compat");
1923 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001924
Douglas Katzman54366072015-07-27 16:53:08 +00001925 if (const char *v =
1926 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001927 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001928 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001930 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001931 }
1932
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001933 if (!Args.hasArg(options::OPT_fno_short_enums))
1934 CmdArgs.push_back("-fshort-enums");
1935 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001936 CmdArgs.push_back("-mllvm");
1937 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001938 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001939 CmdArgs.push_back("-mllvm");
1940 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001941}
1942
Kevin Qin110db6f2014-07-18 07:03:22 +00001943// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001944static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001945 std::vector<const char *> &Features) {
1946 SmallVector<StringRef, 8> Split;
1947 text.split(Split, StringRef("+"), -1, false);
1948
Benjamin Kramer72e64312015-09-24 14:48:49 +00001949 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001950 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001951 .Case("fp", "+fp-armv8")
1952 .Case("simd", "+neon")
1953 .Case("crc", "+crc")
1954 .Case("crypto", "+crypto")
1955 .Case("nofp", "-fp-armv8")
1956 .Case("nosimd", "-neon")
1957 .Case("nocrc", "-crc")
1958 .Case("nocrypto", "-crypto")
1959 .Default(nullptr);
1960 if (result)
1961 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001962 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001963 D.Diag(diag::err_drv_no_neon_modifier);
1964 else
1965 return false;
1966 }
1967 return true;
1968}
1969
1970// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1971// decode CPU and feature.
1972static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1973 std::vector<const char *> &Features) {
1974 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1975 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001976 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1977 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001978 Features.push_back("+neon");
1979 Features.push_back("+crc");
1980 Features.push_back("+crypto");
1981 } else if (CPU == "generic") {
1982 Features.push_back("+neon");
1983 } else {
1984 return false;
1985 }
1986
1987 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1988 return false;
1989
1990 return true;
1991}
1992
1993static bool
1994getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1995 const ArgList &Args,
1996 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001997 std::string MarchLowerCase = March.lower();
1998 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001999
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002000 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002001 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002002 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002003 Features.push_back("+v8.1a");
2004 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002005 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002006 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002007
2008 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2009 return false;
2010
2011 return true;
2012}
2013
2014static bool
2015getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2016 const ArgList &Args,
2017 std::vector<const char *> &Features) {
2018 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002019 std::string McpuLowerCase = Mcpu.lower();
2020 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002021 return false;
2022
2023 return true;
2024}
2025
2026static bool
2027getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2028 const ArgList &Args,
2029 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002030 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002031 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002032 if (MtuneLowerCase == "native")
2033 MtuneLowerCase = llvm::sys::getHostCPUName();
2034 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002035 Features.push_back("+zcm");
2036 Features.push_back("+zcz");
2037 }
2038 return true;
2039}
2040
2041static bool
2042getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2043 const ArgList &Args,
2044 std::vector<const char *> &Features) {
2045 StringRef CPU;
2046 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002047 std::string McpuLowerCase = Mcpu.lower();
2048 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002049 return false;
2050
2051 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2052}
2053
Akira Hatanaka92500472015-07-27 19:29:04 +00002054static void getAArch64TargetFeatures(const Driver &D,
2055 const llvm::Triple &Triple,
2056 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002057 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002058 Arg *A;
2059 bool success = true;
2060 // Enable NEON by default.
2061 Features.push_back("+neon");
2062 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2063 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2064 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2065 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002066 else if (Args.hasArg(options::OPT_arch))
2067 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2068 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002069
2070 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2071 success =
2072 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2073 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2074 success =
2075 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002076 else if (Args.hasArg(options::OPT_arch))
2077 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2078 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002079
2080 if (!success)
2081 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002082
2083 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2084 Features.push_back("-fp-armv8");
2085 Features.push_back("-crypto");
2086 Features.push_back("-neon");
2087 }
Bradley Smith418c5932014-05-02 15:17:51 +00002088
2089 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002090 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002091 if (A->getOption().matches(options::OPT_mcrc))
2092 Features.push_back("+crc");
2093 else
2094 Features.push_back("-crc");
2095 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002096
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002097 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2098 options::OPT_munaligned_access))
2099 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2100 Features.push_back("+strict-align");
2101
Akira Hatanaka92500472015-07-27 19:29:04 +00002102 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002103 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002104}
2105
Dan Gohmanc2853072015-09-03 22:51:53 +00002106static void getWebAssemblyTargetFeatures(const ArgList &Args,
2107 std::vector<const char *> &Features) {
2108 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2109 StringRef Name = A->getOption().getName();
2110 A->claim();
2111
2112 // Skip over "-m".
2113 assert(Name.startswith("m") && "Invalid feature name.");
2114 Name = Name.substr(1);
2115
2116 bool IsNegative = Name.startswith("no-");
2117 if (IsNegative)
2118 Name = Name.substr(3);
2119
2120 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2121 }
2122}
2123
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002124static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002125 const ArgList &Args, ArgStringList &CmdArgs,
2126 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002127 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002128 std::vector<const char *> Features;
2129 switch (Triple.getArch()) {
2130 default:
2131 break;
2132 case llvm::Triple::mips:
2133 case llvm::Triple::mipsel:
2134 case llvm::Triple::mips64:
2135 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002136 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002137 break;
2138
2139 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002140 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002141 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002142 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002143 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002144 break;
2145
2146 case llvm::Triple::ppc:
2147 case llvm::Triple::ppc64:
2148 case llvm::Triple::ppc64le:
2149 getPPCTargetFeatures(Args, Features);
2150 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002151 case llvm::Triple::systemz:
2152 getSystemZTargetFeatures(Args, Features);
2153 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002154 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002155 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002156 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002157 break;
2158 case llvm::Triple::x86:
2159 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002160 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002161 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002162 case llvm::Triple::wasm32:
2163 case llvm::Triple::wasm64:
2164 getWebAssemblyTargetFeatures(Args, Features);
2165 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002166 }
Rafael Espindola43964802013-08-21 17:34:32 +00002167
2168 // Find the last of each feature.
2169 llvm::StringMap<unsigned> LastOpt;
2170 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2171 const char *Name = Features[I];
2172 assert(Name[0] == '-' || Name[0] == '+');
2173 LastOpt[Name + 1] = I;
2174 }
2175
2176 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2177 // If this feature was overridden, ignore it.
2178 const char *Name = Features[I];
2179 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2180 assert(LastI != LastOpt.end());
2181 unsigned Last = LastI->second;
2182 if (Last != I)
2183 continue;
2184
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002185 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002186 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002187 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002188}
2189
David Majnemerae394812014-12-09 00:12:30 +00002190static bool
2191shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2192 const llvm::Triple &Triple) {
2193 // We use the zero-cost exception tables for Objective-C if the non-fragile
2194 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2195 // later.
2196 if (runtime.isNonFragile())
2197 return true;
2198
2199 if (!Triple.isMacOSX())
2200 return false;
2201
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002202 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002203 (Triple.getArch() == llvm::Triple::x86_64 ||
2204 Triple.getArch() == llvm::Triple::arm));
2205}
2206
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207/// Adds exception related arguments to the driver command arguments. There's a
2208/// master flag, -fexceptions and also language specific flags to enable/disable
2209/// C++ and Objective-C exceptions. This makes it possible to for example
2210/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002211static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002212 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002213 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002214 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002215 const Driver &D = TC.getDriver();
2216 const llvm::Triple &Triple = TC.getTriple();
2217
Chad Rosier4fab82c2012-03-26 22:04:46 +00002218 if (KernelOrKext) {
2219 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2220 // arguments now to avoid warnings about unused arguments.
2221 Args.ClaimAllArgs(options::OPT_fexceptions);
2222 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2223 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2224 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2225 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2226 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002227 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002228 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002229
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002230 // See if the user explicitly enabled exceptions.
2231 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2232 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002233
David Majnemerae394812014-12-09 00:12:30 +00002234 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2235 // is not necessarily sensible, but follows GCC.
2236 if (types::isObjC(InputType) &&
2237 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002238 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002239 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002240
David Majnemerae394812014-12-09 00:12:30 +00002241 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002242 }
2243
2244 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002245 // Disable C++ EH by default on XCore, PS4, and MSVC.
2246 // FIXME: Remove MSVC from this list once things work.
2247 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2248 !Triple.isPS4CPU() &&
2249 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002250 Arg *ExceptionArg = Args.getLastArg(
2251 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2252 options::OPT_fexceptions, options::OPT_fno_exceptions);
2253 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002254 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002255 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2256 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002257
2258 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002259 if (Triple.isPS4CPU()) {
2260 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2261 assert(ExceptionArg &&
2262 "On the PS4 exceptions should only be enabled if passing "
2263 "an argument");
2264 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2265 const Arg *RTTIArg = TC.getRTTIArg();
2266 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2267 D.Diag(diag::err_drv_argument_not_allowed_with)
2268 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2269 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2270 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2271 } else
2272 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2273
Anders Carlssone96ab552011-02-28 02:27:16 +00002274 CmdArgs.push_back("-fcxx-exceptions");
2275
David Majnemer8de68642014-12-05 08:11:58 +00002276 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002277 }
2278 }
2279
David Majnemer8de68642014-12-05 08:11:58 +00002280 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002281 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002282}
2283
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002284static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002285 bool Default = true;
2286 if (TC.getTriple().isOSDarwin()) {
2287 // The native darwin assembler doesn't support the linker_option directives,
2288 // so we disable them if we think the .s file will be passed to it.
2289 Default = TC.useIntegratedAs();
2290 }
2291 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2292 Default);
2293}
2294
Ted Kremenek62093662013-03-12 17:02:12 +00002295static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2296 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002297 bool UseDwarfDirectory =
2298 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2299 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002300 return !UseDwarfDirectory;
2301}
2302
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002303/// \brief Check whether the given input tree contains any compilation actions.
2304static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002305 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002306 return true;
2307
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002308 for (const auto &Act : *A)
2309 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002310 return true;
2311
2312 return false;
2313}
2314
2315/// \brief Check if -relax-all should be passed to the internal assembler.
2316/// This is done by default when compiling non-assembler source with -O0.
2317static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2318 bool RelaxDefault = true;
2319
2320 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2321 RelaxDefault = A->getOption().matches(options::OPT_O0);
2322
2323 if (RelaxDefault) {
2324 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002325 for (const auto &Act : C.getActions()) {
2326 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002327 RelaxDefault = true;
2328 break;
2329 }
2330 }
2331 }
2332
2333 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002334 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002335}
2336
Douglas Katzman3459ce22015-10-08 04:24:12 +00002337// Extract the integer N from a string spelled "-dwarf-N", returning 0
2338// on mismatch. The StringRef input (rather than an Arg) allows
2339// for use by the "-Xassembler" option parser.
2340static unsigned DwarfVersionNum(StringRef ArgValue) {
2341 return llvm::StringSwitch<unsigned>(ArgValue)
2342 .Case("-gdwarf-2", 2)
2343 .Case("-gdwarf-3", 3)
2344 .Case("-gdwarf-4", 4)
2345 .Default(0);
2346}
2347
2348static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2349 CodeGenOptions::DebugInfoKind DebugInfoKind,
2350 unsigned DwarfVersion) {
2351 switch (DebugInfoKind) {
2352 case CodeGenOptions::DebugLineTablesOnly:
2353 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2354 break;
2355 case CodeGenOptions::LimitedDebugInfo:
2356 CmdArgs.push_back("-debug-info-kind=limited");
2357 break;
2358 case CodeGenOptions::FullDebugInfo:
2359 CmdArgs.push_back("-debug-info-kind=standalone");
2360 break;
2361 default:
2362 break;
2363 }
2364 if (DwarfVersion > 0)
2365 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002366 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002367}
2368
David Blaikie9260ed62013-07-25 21:19:01 +00002369static void CollectArgsForIntegratedAssembler(Compilation &C,
2370 const ArgList &Args,
2371 ArgStringList &CmdArgs,
2372 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002373 if (UseRelaxAll(C, Args))
2374 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002375
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002376 // When passing -I arguments to the assembler we sometimes need to
2377 // unconditionally take the next argument. For example, when parsing
2378 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2379 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2380 // arg after parsing the '-I' arg.
2381 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002382
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002383 // When using an integrated assembler, translate -Wa, and -Xassembler
2384 // options.
2385 bool CompressDebugSections = false;
2386 for (const Arg *A :
2387 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2388 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002389
Benjamin Kramer72e64312015-09-24 14:48:49 +00002390 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002391 if (TakeNextArg) {
2392 CmdArgs.push_back(Value.data());
2393 TakeNextArg = false;
2394 continue;
2395 }
David Blaikie9260ed62013-07-25 21:19:01 +00002396
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002397 switch (C.getDefaultToolChain().getArch()) {
2398 default:
2399 break;
2400 case llvm::Triple::mips:
2401 case llvm::Triple::mipsel:
2402 case llvm::Triple::mips64:
2403 case llvm::Triple::mips64el:
2404 if (Value == "--trap") {
2405 CmdArgs.push_back("-target-feature");
2406 CmdArgs.push_back("+use-tcc-in-div");
2407 continue;
2408 }
2409 if (Value == "--break") {
2410 CmdArgs.push_back("-target-feature");
2411 CmdArgs.push_back("-use-tcc-in-div");
2412 continue;
2413 }
2414 if (Value.startswith("-msoft-float")) {
2415 CmdArgs.push_back("-target-feature");
2416 CmdArgs.push_back("+soft-float");
2417 continue;
2418 }
2419 if (Value.startswith("-mhard-float")) {
2420 CmdArgs.push_back("-target-feature");
2421 CmdArgs.push_back("-soft-float");
2422 continue;
2423 }
2424 break;
2425 }
2426
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002427 if (Value == "-force_cpusubtype_ALL") {
2428 // Do nothing, this is the default and we don't support anything else.
2429 } else if (Value == "-L") {
2430 CmdArgs.push_back("-msave-temp-labels");
2431 } else if (Value == "--fatal-warnings") {
2432 CmdArgs.push_back("-massembler-fatal-warnings");
2433 } else if (Value == "--noexecstack") {
2434 CmdArgs.push_back("-mnoexecstack");
2435 } else if (Value == "-compress-debug-sections" ||
2436 Value == "--compress-debug-sections") {
2437 CompressDebugSections = true;
2438 } else if (Value == "-nocompress-debug-sections" ||
2439 Value == "--nocompress-debug-sections") {
2440 CompressDebugSections = false;
2441 } else if (Value.startswith("-I")) {
2442 CmdArgs.push_back(Value.data());
2443 // We need to consume the next argument if the current arg is a plain
2444 // -I. The next arg will be the include directory.
2445 if (Value == "-I")
2446 TakeNextArg = true;
2447 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002448 // "-gdwarf-N" options are not cc1as options.
2449 unsigned DwarfVersion = DwarfVersionNum(Value);
2450 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2451 CmdArgs.push_back(Value.data());
2452 } else {
2453 RenderDebugEnablingArgs(
2454 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2455 }
Renato Golin7c542b42015-07-27 23:44:45 +00002456 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2457 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2458 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002459 } else {
2460 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002461 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002462 }
2463 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002464 }
2465 if (CompressDebugSections) {
2466 if (llvm::zlib::isAvailable())
2467 CmdArgs.push_back("-compress-debug-sections");
2468 else
2469 D.Diag(diag::warn_debug_compression_unavailable);
2470 }
David Blaikie9260ed62013-07-25 21:19:01 +00002471}
2472
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002473// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002474// FIXME: Make sure we can also emit shared objects if they're requested
2475// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002476static void addClangRT(const ToolChain &TC, const ArgList &Args,
2477 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002478 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002479}
2480
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002481namespace {
2482enum OpenMPRuntimeKind {
2483 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2484 /// without knowing what runtime to target.
2485 OMPRT_Unknown,
2486
2487 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2488 /// the default for Clang.
2489 OMPRT_OMP,
2490
2491 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2492 /// this runtime but can swallow the pragmas, and find and link against the
2493 /// runtime library itself.
2494 OMPRT_GOMP,
2495
Chandler Carruthc6625c62015-05-28 21:10:31 +00002496 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002497 /// OpenMP runtime. We support this mode for users with existing dependencies
2498 /// on this runtime library name.
2499 OMPRT_IOMP5
2500};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002501}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002502
2503/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002504static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2505 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002506 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2507
2508 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2509 if (A)
2510 RuntimeName = A->getValue();
2511
2512 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002513 .Case("libomp", OMPRT_OMP)
2514 .Case("libgomp", OMPRT_GOMP)
2515 .Case("libiomp5", OMPRT_IOMP5)
2516 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002517
2518 if (RT == OMPRT_Unknown) {
2519 if (A)
2520 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002521 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002522 else
2523 // FIXME: We could use a nicer diagnostic here.
2524 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2525 }
2526
2527 return RT;
2528}
2529
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002530static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2531 const ArgList &Args) {
2532 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2533 options::OPT_fno_openmp, false))
2534 return;
2535
2536 switch (getOpenMPRuntime(TC, Args)) {
2537 case OMPRT_OMP:
2538 CmdArgs.push_back("-lomp");
2539 break;
2540 case OMPRT_GOMP:
2541 CmdArgs.push_back("-lgomp");
2542 break;
2543 case OMPRT_IOMP5:
2544 CmdArgs.push_back("-liomp5");
2545 break;
2546 case OMPRT_Unknown:
2547 // Already diagnosed.
2548 break;
2549 }
2550}
2551
Alexey Samsonov52550342014-09-15 19:58:40 +00002552static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2553 ArgStringList &CmdArgs, StringRef Sanitizer,
2554 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002555 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002556 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002557 if (!IsShared) CmdArgs.push_back("-whole-archive");
2558 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2559 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002560}
2561
Alexey Samsonov52550342014-09-15 19:58:40 +00002562// Tries to use a file with the list of dynamic symbols that need to be exported
2563// from the runtime library. Returns true if the file was found.
2564static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2565 ArgStringList &CmdArgs,
2566 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002567 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002568 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2569 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002570 return true;
2571 }
2572 return false;
2573}
2574
2575static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2576 ArgStringList &CmdArgs) {
2577 // Force linking against the system libraries sanitizers depends on
2578 // (see PR15823 why this is necessary).
2579 CmdArgs.push_back("--no-as-needed");
2580 CmdArgs.push_back("-lpthread");
2581 CmdArgs.push_back("-lrt");
2582 CmdArgs.push_back("-lm");
2583 // There's no libdl on FreeBSD.
2584 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2585 CmdArgs.push_back("-ldl");
2586}
2587
2588static void
2589collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2590 SmallVectorImpl<StringRef> &SharedRuntimes,
2591 SmallVectorImpl<StringRef> &StaticRuntimes,
2592 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2593 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2594 // Collect shared runtimes.
2595 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2596 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002597 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002598
Alexey Samsonov52550342014-09-15 19:58:40 +00002599 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002600 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002601 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002602 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002603 }
2604 if (SanArgs.needsAsanRt()) {
2605 if (SanArgs.needsSharedAsanRt()) {
2606 HelperStaticRuntimes.push_back("asan-preinit");
2607 } else {
2608 StaticRuntimes.push_back("asan");
2609 if (SanArgs.linkCXXRuntimes())
2610 StaticRuntimes.push_back("asan_cxx");
2611 }
2612 }
2613 if (SanArgs.needsDfsanRt())
2614 StaticRuntimes.push_back("dfsan");
2615 if (SanArgs.needsLsanRt())
2616 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002617 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002618 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002619 if (SanArgs.linkCXXRuntimes())
2620 StaticRuntimes.push_back("msan_cxx");
2621 }
2622 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002623 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002624 if (SanArgs.linkCXXRuntimes())
2625 StaticRuntimes.push_back("tsan_cxx");
2626 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002627 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002628 StaticRuntimes.push_back("ubsan_standalone");
2629 if (SanArgs.linkCXXRuntimes())
2630 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002631 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002632 if (SanArgs.needsSafeStackRt())
2633 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002634}
2635
Alexey Samsonov52550342014-09-15 19:58:40 +00002636// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2637// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2638static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002639 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002640 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2641 HelperStaticRuntimes;
2642 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2643 HelperStaticRuntimes);
2644 for (auto RT : SharedRuntimes)
2645 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2646 for (auto RT : HelperStaticRuntimes)
2647 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2648 bool AddExportDynamic = false;
2649 for (auto RT : StaticRuntimes) {
2650 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2651 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2652 }
2653 // If there is a static runtime with no dynamic list, force all the symbols
2654 // to be dynamic to be sure we export sanitizer interface functions.
2655 if (AddExportDynamic)
2656 CmdArgs.push_back("-export-dynamic");
2657 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002658}
2659
Reid Kleckner86ea7702015-02-04 23:45:07 +00002660static bool areOptimizationsEnabled(const ArgList &Args) {
2661 // Find the last -O arg and see if it is non-zero.
2662 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2663 return !A->getOption().matches(options::OPT_O0);
2664 // Defaults to -O0.
2665 return false;
2666}
2667
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002668static bool shouldUseFramePointerForTarget(const ArgList &Args,
2669 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002670 switch (Triple.getArch()) {
2671 case llvm::Triple::xcore:
2672 case llvm::Triple::wasm32:
2673 case llvm::Triple::wasm64:
2674 // XCore never wants frame pointers, regardless of OS.
2675 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002676 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002677 default:
2678 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002679 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002680
2681 if (Triple.isOSLinux()) {
2682 switch (Triple.getArch()) {
2683 // Don't use a frame pointer on linux if optimizing for certain targets.
2684 case llvm::Triple::mips64:
2685 case llvm::Triple::mips64el:
2686 case llvm::Triple::mips:
2687 case llvm::Triple::mipsel:
2688 case llvm::Triple::systemz:
2689 case llvm::Triple::x86:
2690 case llvm::Triple::x86_64:
2691 return !areOptimizationsEnabled(Args);
2692 default:
2693 return true;
2694 }
2695 }
2696
2697 if (Triple.isOSWindows()) {
2698 switch (Triple.getArch()) {
2699 case llvm::Triple::x86:
2700 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002701 case llvm::Triple::arm:
2702 case llvm::Triple::thumb:
2703 // Windows on ARM builds with FPO disabled to aid fast stack walking
2704 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002705 default:
2706 // All other supported Windows ISAs use xdata unwind information, so frame
2707 // pointers are not generally useful.
2708 return false;
2709 }
2710 }
2711
2712 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002713}
2714
Rafael Espindola224dd632011-12-14 21:02:23 +00002715static bool shouldUseFramePointer(const ArgList &Args,
2716 const llvm::Triple &Triple) {
2717 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2718 options::OPT_fomit_frame_pointer))
2719 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2720
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002721 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002722}
2723
Eric Christopherb7d97e92013-04-03 01:58:53 +00002724static bool shouldUseLeafFramePointer(const ArgList &Args,
2725 const llvm::Triple &Triple) {
2726 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2727 options::OPT_momit_leaf_frame_pointer))
2728 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2729
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002730 if (Triple.isPS4CPU())
2731 return false;
2732
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002733 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002734}
2735
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002736/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002737static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002738 SmallString<128> cwd;
2739 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002740 CmdArgs.push_back("-fdebug-compilation-dir");
2741 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002742 }
2743}
2744
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002745static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002746 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2747 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2748 SmallString<128> T(FinalOutput->getValue());
2749 llvm::sys::path::replace_extension(T, "dwo");
2750 return Args.MakeArgString(T);
2751 } else {
2752 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002753 SmallString<128> T(
2754 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002755 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002756 llvm::sys::path::replace_extension(F, "dwo");
2757 T += F;
2758 return Args.MakeArgString(F);
2759 }
2760}
2761
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002762static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2763 const JobAction &JA, const ArgList &Args,
2764 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002765 ArgStringList ExtractArgs;
2766 ExtractArgs.push_back("--extract-dwo");
2767
2768 ArgStringList StripArgs;
2769 StripArgs.push_back("--strip-dwo");
2770
2771 // Grabbing the output of the earlier compile step.
2772 StripArgs.push_back(Output.getFilename());
2773 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002774 ExtractArgs.push_back(OutFile);
2775
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002776 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002777 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002778
2779 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002780 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002781
2782 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002783 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002784}
2785
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002786/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002787/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2788static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002789 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002790 if (A->getOption().matches(options::OPT_O4) ||
2791 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002792 return true;
2793
2794 if (A->getOption().matches(options::OPT_O0))
2795 return false;
2796
2797 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2798
Rafael Espindola91780de2013-08-26 14:05:41 +00002799 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002800 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002801 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002802 return true;
2803
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002804 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002805 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002806 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002807
2808 unsigned OptLevel = 0;
2809 if (S.getAsInteger(10, OptLevel))
2810 return false;
2811
2812 return OptLevel > 1;
2813 }
2814
2815 return false;
2816}
2817
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002818/// Add -x lang to \p CmdArgs for \p Input.
2819static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2820 ArgStringList &CmdArgs) {
2821 // When using -verify-pch, we don't want to provide the type
2822 // 'precompiled-header' if it was inferred from the file extension
2823 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2824 return;
2825
2826 CmdArgs.push_back("-x");
2827 if (Args.hasArg(options::OPT_rewrite_objc))
2828 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2829 else
2830 CmdArgs.push_back(types::getTypeName(Input.getType()));
2831}
2832
David Majnemerc371ff02015-03-22 08:39:22 +00002833static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002834 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002835 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002836
2837 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002838 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002839
2840 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002841 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002842 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002843 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002844}
2845
Rafael Espindola577637a2015-01-03 00:06:04 +00002846// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002847// options that build systems might add but are unused when assembling or only
2848// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002849static void claimNoWarnArgs(const ArgList &Args) {
2850 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002851 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002852 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002853 Args.ClaimAllArgs(options::OPT_flto);
2854 Args.ClaimAllArgs(options::OPT_fno_lto);
2855}
2856
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002857static void appendUserToPath(SmallVectorImpl<char> &Result) {
2858#ifdef LLVM_ON_UNIX
2859 const char *Username = getenv("LOGNAME");
2860#else
2861 const char *Username = getenv("USERNAME");
2862#endif
2863 if (Username) {
2864 // Validate that LoginName can be used in a path, and get its length.
2865 size_t Len = 0;
2866 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002867 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002868 Username = nullptr;
2869 break;
2870 }
2871 }
2872
2873 if (Username && Len > 0) {
2874 Result.append(Username, Username + Len);
2875 return;
2876 }
2877 }
2878
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002879// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002880#ifdef LLVM_ON_UNIX
2881 std::string UID = llvm::utostr(getuid());
2882#else
2883 // FIXME: Windows seems to have an 'SID' that might work.
2884 std::string UID = "9999";
2885#endif
2886 Result.append(UID.begin(), UID.end());
2887}
2888
David Majnemere11d3732015-06-08 00:22:46 +00002889VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2890 const llvm::Triple &Triple,
2891 const llvm::opt::ArgList &Args,
2892 bool IsWindowsMSVC) {
2893 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2894 IsWindowsMSVC) ||
2895 Args.hasArg(options::OPT_fmsc_version) ||
2896 Args.hasArg(options::OPT_fms_compatibility_version)) {
2897 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2898 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002899 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002900
2901 if (MSCVersion && MSCompatibilityVersion) {
2902 if (D)
2903 D->Diag(diag::err_drv_argument_not_allowed_with)
2904 << MSCVersion->getAsString(Args)
2905 << MSCompatibilityVersion->getAsString(Args);
2906 return VersionTuple();
2907 }
2908
2909 if (MSCompatibilityVersion) {
2910 VersionTuple MSVT;
2911 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2912 D->Diag(diag::err_drv_invalid_value)
2913 << MSCompatibilityVersion->getAsString(Args)
2914 << MSCompatibilityVersion->getValue();
2915 return MSVT;
2916 }
2917
2918 if (MSCVersion) {
2919 unsigned Version = 0;
2920 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2921 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2922 << MSCVersion->getValue();
2923 return getMSCompatibilityVersion(Version);
2924 }
2925
2926 unsigned Major, Minor, Micro;
2927 Triple.getEnvironmentVersion(Major, Minor, Micro);
2928 if (Major || Minor || Micro)
2929 return VersionTuple(Major, Minor, Micro);
2930
2931 return VersionTuple(18);
2932 }
2933 return VersionTuple();
2934}
2935
Diego Novilloa0545962015-07-10 18:00:07 +00002936static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2937 const InputInfo &Output, const ArgList &Args,
2938 ArgStringList &CmdArgs) {
2939 auto *ProfileGenerateArg = Args.getLastArg(
2940 options::OPT_fprofile_instr_generate,
2941 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002942 options::OPT_fprofile_generate_EQ,
2943 options::OPT_fno_profile_instr_generate);
2944 if (ProfileGenerateArg &&
2945 ProfileGenerateArg->getOption().matches(
2946 options::OPT_fno_profile_instr_generate))
2947 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002948
2949 auto *ProfileUseArg = Args.getLastArg(
2950 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002951 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2952 options::OPT_fno_profile_instr_use);
2953 if (ProfileUseArg &&
2954 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2955 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002956
2957 if (ProfileGenerateArg && ProfileUseArg)
2958 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002959 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002960
Diego Novillo758f3f52015-08-05 21:49:51 +00002961 if (ProfileGenerateArg) {
2962 if (ProfileGenerateArg->getOption().matches(
2963 options::OPT_fprofile_instr_generate_EQ))
2964 ProfileGenerateArg->render(Args, CmdArgs);
2965 else if (ProfileGenerateArg->getOption().matches(
2966 options::OPT_fprofile_generate_EQ)) {
2967 SmallString<128> Path(ProfileGenerateArg->getValue());
2968 llvm::sys::path::append(Path, "default.profraw");
2969 CmdArgs.push_back(
2970 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2971 } else
2972 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2973 }
Diego Novilloa0545962015-07-10 18:00:07 +00002974
Diego Novillo758f3f52015-08-05 21:49:51 +00002975 if (ProfileUseArg) {
2976 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2977 ProfileUseArg->render(Args, CmdArgs);
2978 else if ((ProfileUseArg->getOption().matches(
2979 options::OPT_fprofile_use_EQ) ||
2980 ProfileUseArg->getOption().matches(
2981 options::OPT_fprofile_instr_use))) {
2982 SmallString<128> Path(
2983 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2984 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2985 llvm::sys::path::append(Path, "default.profdata");
2986 CmdArgs.push_back(
2987 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2988 }
Diego Novilloa0545962015-07-10 18:00:07 +00002989 }
2990
2991 if (Args.hasArg(options::OPT_ftest_coverage) ||
2992 Args.hasArg(options::OPT_coverage))
2993 CmdArgs.push_back("-femit-coverage-notes");
2994 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2995 false) ||
2996 Args.hasArg(options::OPT_coverage))
2997 CmdArgs.push_back("-femit-coverage-data");
2998
Diego Novilloc4b94da2015-08-05 23:27:40 +00002999 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3000 options::OPT_fno_coverage_mapping, false) &&
3001 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003002 D.Diag(diag::err_drv_argument_only_allowed_with)
3003 << "-fcoverage-mapping"
3004 << "-fprofile-instr-generate";
3005
Diego Novilloc4b94da2015-08-05 23:27:40 +00003006 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3007 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003008 CmdArgs.push_back("-fcoverage-mapping");
3009
3010 if (C.getArgs().hasArg(options::OPT_c) ||
3011 C.getArgs().hasArg(options::OPT_S)) {
3012 if (Output.isFilename()) {
3013 CmdArgs.push_back("-coverage-file");
3014 SmallString<128> CoverageFilename;
3015 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3016 CoverageFilename = FinalOutput->getValue();
3017 } else {
3018 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3019 }
3020 if (llvm::sys::path::is_relative(CoverageFilename)) {
3021 SmallString<128> Pwd;
3022 if (!llvm::sys::fs::current_path(Pwd)) {
3023 llvm::sys::path::append(Pwd, CoverageFilename);
3024 CoverageFilename.swap(Pwd);
3025 }
3026 }
3027 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3028 }
3029 }
3030}
3031
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003032/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3033/// smooshes them together with platform defaults, to decide whether
3034/// this compile should be using PIC mode or not. Returns a tuple of
3035/// (RelocationModel, PICLevel, IsPIE).
3036static std::tuple<llvm::Reloc::Model, unsigned, bool>
3037ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3038 const ArgList &Args) {
3039 // FIXME: why does this code...and so much everywhere else, use both
3040 // ToolChain.getTriple() and Triple?
3041 bool PIE = ToolChain.isPIEDefault();
3042 bool PIC = PIE || ToolChain.isPICDefault();
3043 bool IsPICLevelTwo = PIC;
3044
3045 bool KernelOrKext =
3046 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3047
3048 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003049 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003050 switch (ToolChain.getArch()) {
3051 case llvm::Triple::arm:
3052 case llvm::Triple::armeb:
3053 case llvm::Triple::thumb:
3054 case llvm::Triple::thumbeb:
3055 case llvm::Triple::aarch64:
3056 case llvm::Triple::mips:
3057 case llvm::Triple::mipsel:
3058 case llvm::Triple::mips64:
3059 case llvm::Triple::mips64el:
3060 PIC = true; // "-fpic"
3061 break;
3062
3063 case llvm::Triple::x86:
3064 case llvm::Triple::x86_64:
3065 PIC = true; // "-fPIC"
3066 IsPICLevelTwo = true;
3067 break;
3068
3069 default:
3070 break;
3071 }
3072 }
3073
3074 // OpenBSD-specific defaults for PIE
3075 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3076 switch (ToolChain.getArch()) {
3077 case llvm::Triple::mips64:
3078 case llvm::Triple::mips64el:
3079 case llvm::Triple::sparcel:
3080 case llvm::Triple::x86:
3081 case llvm::Triple::x86_64:
3082 IsPICLevelTwo = false; // "-fpie"
3083 break;
3084
3085 case llvm::Triple::ppc:
3086 case llvm::Triple::sparc:
3087 case llvm::Triple::sparcv9:
3088 IsPICLevelTwo = true; // "-fPIE"
3089 break;
3090
3091 default:
3092 break;
3093 }
3094 }
3095
3096 // The last argument relating to either PIC or PIE wins, and no
3097 // other argument is used. If the last argument is any flavor of the
3098 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3099 // option implicitly enables PIC at the same level.
3100 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3101 options::OPT_fpic, options::OPT_fno_pic,
3102 options::OPT_fPIE, options::OPT_fno_PIE,
3103 options::OPT_fpie, options::OPT_fno_pie);
3104 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3105 // is forced, then neither PIC nor PIE flags will have no effect.
3106 if (!ToolChain.isPICDefaultForced()) {
3107 if (LastPICArg) {
3108 Option O = LastPICArg->getOption();
3109 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3110 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3111 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3112 PIC =
3113 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3114 IsPICLevelTwo =
3115 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3116 } else {
3117 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003118 if (Triple.isPS4CPU()) {
3119 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3120 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3121 if (Model != "kernel") {
3122 PIC = true;
3123 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3124 << LastPICArg->getSpelling();
3125 }
3126 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003127 }
3128 }
3129 }
3130
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003131 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3132 // PIC level would've been set to level 1, force it back to level 2 PIC
3133 // instead.
3134 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003135 IsPICLevelTwo |= ToolChain.isPICDefault();
3136
James Y Knightc4015d32015-08-21 04:14:55 +00003137 // This kernel flags are a trump-card: they will disable PIC/PIE
3138 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003139 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3140 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003141 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003142
3143 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3144 // This is a very special mode. It trumps the other modes, almost no one
3145 // uses it, and it isn't even valid on any OS but Darwin.
3146 if (!ToolChain.getTriple().isOSDarwin())
3147 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3148 << A->getSpelling() << ToolChain.getTriple().str();
3149
3150 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3151
3152 // Only a forced PIC mode can cause the actual compile to have PIC defines
3153 // etc., no flags are sufficient. This behavior was selected to closely
3154 // match that of llvm-gcc and Apple GCC before that.
3155 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3156
3157 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3158 }
3159
3160 if (PIC)
3161 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3162
3163 return std::make_tuple(llvm::Reloc::Static, 0, false);
3164}
3165
3166static const char *RelocationModelName(llvm::Reloc::Model Model) {
3167 switch (Model) {
3168 case llvm::Reloc::Default:
3169 return nullptr;
3170 case llvm::Reloc::Static:
3171 return "static";
3172 case llvm::Reloc::PIC_:
3173 return "pic";
3174 case llvm::Reloc::DynamicNoPIC:
3175 return "dynamic-no-pic";
3176 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003177 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003178}
3179
3180static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3181 ArgStringList &CmdArgs) {
3182 llvm::Reloc::Model RelocationModel;
3183 unsigned PICLevel;
3184 bool IsPIE;
3185 std::tie(RelocationModel, PICLevel, IsPIE) =
3186 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3187
3188 if (RelocationModel != llvm::Reloc::Static)
3189 CmdArgs.push_back("-KPIC");
3190}
3191
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003192void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003193 const InputInfo &Output, const InputInfoList &Inputs,
3194 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003195 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3196 const llvm::Triple Triple(TripleStr);
3197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003198 bool KernelOrKext =
3199 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003200 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003201 ArgStringList CmdArgs;
3202
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003203 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003204 bool IsWindowsCygnus =
3205 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003206 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003207 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003208
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003209 // Check number of inputs for sanity. We need at least one input.
3210 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003211 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003212 // CUDA compilation may have multiple inputs (source file + results of
3213 // device-side compilations). All other jobs are expected to have exactly one
3214 // input.
3215 bool IsCuda = types::isCuda(Input.getType());
3216 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003217
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003218 // Invoke ourselves in -cc1 mode.
3219 //
3220 // FIXME: Implement custom jobs for internal actions.
3221 CmdArgs.push_back("-cc1");
3222
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003223 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003224 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003225 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003226
James Y Knight2db38f32015-08-15 03:45:25 +00003227 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3228 Triple.getArch() == llvm::Triple::thumb)) {
3229 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003230 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003231 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003232 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003233 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003234 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003235 }
3236
Tim Northover336f1892014-03-29 13:16:12 +00003237 // Push all default warning arguments that are specific to
3238 // the given target. These come before user provided warning options
3239 // are provided.
3240 getToolChain().addClangWarningOptions(CmdArgs);
3241
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003242 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003243 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003244
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003245 if (isa<AnalyzeJobAction>(JA)) {
3246 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3247 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003248 } else if (isa<MigrateJobAction>(JA)) {
3249 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003250 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003251 if (Output.getType() == types::TY_Dependencies)
3252 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003253 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003254 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003255 if (Args.hasArg(options::OPT_rewrite_objc) &&
3256 !Args.hasArg(options::OPT_g_Group))
3257 CmdArgs.push_back("-P");
3258 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003259 } else if (isa<AssembleJobAction>(JA)) {
3260 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003261
David Blaikie9260ed62013-07-25 21:19:01 +00003262 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003263
3264 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003265 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003266 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003267 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003268 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003269
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003270 if (JA.getType() == types::TY_Nothing)
3271 CmdArgs.push_back("-fsyntax-only");
3272 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003273 CmdArgs.push_back("-emit-pch");
3274 else
3275 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003276 } else if (isa<VerifyPCHJobAction>(JA)) {
3277 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003278 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003279 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3280 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003281 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003282 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003283 } else if (JA.getType() == types::TY_LLVM_IR ||
3284 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003285 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003286 } else if (JA.getType() == types::TY_LLVM_BC ||
3287 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003288 CmdArgs.push_back("-emit-llvm-bc");
3289 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003290 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003291 } else if (JA.getType() == types::TY_AST) {
3292 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003293 } else if (JA.getType() == types::TY_ModuleFile) {
3294 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003295 } else if (JA.getType() == types::TY_RewrittenObjC) {
3296 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003297 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003298 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3299 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003300 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003301 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003302 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003303 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003304
3305 // Preserve use-list order by default when emitting bitcode, so that
3306 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3307 // same result as running passes here. For LTO, we don't need to preserve
3308 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003309 if (JA.getType() == types::TY_LLVM_BC)
3310 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003311
3312 if (D.isUsingLTO())
3313 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003314 }
3315
Justin Bognera88f0122014-06-20 22:59:50 +00003316 // We normally speed up the clang process a bit by skipping destructors at
3317 // exit, but when we're generating diagnostics we can rely on some of the
3318 // cleanup.
3319 if (!C.isForDiagnostics())
3320 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003321
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003322// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003323#ifdef NDEBUG
3324 CmdArgs.push_back("-disable-llvm-verifier");
3325#endif
3326
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003327 // Set the main file name, so that debug info works even with
3328 // -save-temps.
3329 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003330 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003331
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003332 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003333 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003334 if (Args.hasArg(options::OPT_static))
3335 CmdArgs.push_back("-static-define");
3336
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003337 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003338 // Enable region store model by default.
3339 CmdArgs.push_back("-analyzer-store=region");
3340
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003341 // Treat blocks as analysis entry points.
3342 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3343
Ted Kremenek49c79792011-03-24 00:28:47 +00003344 CmdArgs.push_back("-analyzer-eagerly-assume");
3345
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003346 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003347 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003348 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003349
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003350 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003351 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003352
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003353 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003354 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003355
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003356 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003357
Artem Belevichba558952015-05-06 18:20:23 +00003358 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003359 CmdArgs.push_back("-analyzer-checker=cplusplus");
3360
Nico Webere8e53112014-05-11 01:04:02 +00003361 // Enable the following experimental checkers for testing.
3362 CmdArgs.push_back(
3363 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003364 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3365 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003366 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003367 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3368 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003369
3370 // Default nullability checks.
3371 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3372 CmdArgs.push_back(
3373 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003374 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003375
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003376 // Set the output format. The default is plist, for (lame) historical
3377 // reasons.
3378 CmdArgs.push_back("-analyzer-output");
3379 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003380 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003381 else
3382 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003383
Ted Kremenekfe449a22010-03-22 22:32:05 +00003384 // Disable the presentation of standard compiler warnings when
3385 // using --analyze. We only want to show static analyzer diagnostics
3386 // or frontend errors.
3387 CmdArgs.push_back("-w");
3388
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003389 // Add -Xanalyzer arguments when running as analyzer.
3390 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003391 }
3392
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003393 CheckCodeGenerationOptions(D, Args);
3394
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003395 llvm::Reloc::Model RelocationModel;
3396 unsigned PICLevel;
3397 bool IsPIE;
3398 std::tie(RelocationModel, PICLevel, IsPIE) =
3399 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003400
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003401 const char *RMName = RelocationModelName(RelocationModel);
3402 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003403 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003404 CmdArgs.push_back(RMName);
3405 }
3406 if (PICLevel > 0) {
3407 CmdArgs.push_back("-pic-level");
3408 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3409 if (IsPIE) {
3410 CmdArgs.push_back("-pie-level");
3411 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003412 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003413 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003414
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003415 CmdArgs.push_back("-mthread-model");
3416 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3417 CmdArgs.push_back(A->getValue());
3418 else
3419 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3420
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003421 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3422
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003423 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3424 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003425 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003426
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003427 // LLVM Code Generator Options.
3428
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003429 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3430 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003431 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3432 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003433 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003434 CmdArgs.push_back(A->getValue());
3435 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003436 }
3437 }
3438
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003439 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3440 StringRef v = A->getValue();
3441 CmdArgs.push_back("-mllvm");
3442 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3443 A->claim();
3444 }
3445
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003446 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3447 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003448 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003449 }
3450
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003451 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3452 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003453 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003454 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003455 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003456 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3457 CmdArgs.push_back("-fpcc-struct-return");
3458 } else {
3459 assert(A->getOption().matches(options::OPT_freg_struct_return));
3460 CmdArgs.push_back("-freg-struct-return");
3461 }
3462 }
3463
Roman Divacky65b88cd2011-03-01 17:40:53 +00003464 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3465 CmdArgs.push_back("-mrtd");
3466
Rafael Espindola224dd632011-12-14 21:02:23 +00003467 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003468 CmdArgs.push_back("-mdisable-fp-elim");
3469 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3470 options::OPT_fno_zero_initialized_in_bss))
3471 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003472
3473 bool OFastEnabled = isOptimizationLevelFast(Args);
3474 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3475 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003476 OptSpecifier StrictAliasingAliasOption =
3477 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003478 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3479 // doesn't do any TBAA.
3480 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003481 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003482 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003483 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003484 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3485 options::OPT_fno_struct_path_tbaa))
3486 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003487 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3488 false))
3489 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003490 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3491 options::OPT_fno_strict_vtable_pointers,
3492 false))
3493 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003494 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3495 options::OPT_fno_optimize_sibling_calls))
3496 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003497
Eric Christopher006208c2013-04-04 06:29:47 +00003498 // Handle segmented stacks.
3499 if (Args.hasArg(options::OPT_fsplit_stack))
3500 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003501
3502 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3503 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003504 OptSpecifier FastMathAliasOption =
3505 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3506
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003507 // Handle various floating point optimization flags, mapping them to the
3508 // appropriate LLVM code generation flags. The pattern for all of these is to
3509 // default off the codegen optimizations, and if any flag enables them and no
3510 // flag disables them after the flag enabling them, enable the codegen
3511 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003512 if (Arg *A = Args.getLastArg(
3513 options::OPT_ffast_math, FastMathAliasOption,
3514 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3515 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3516 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003517 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3518 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003519 A->getOption().getID() != options::OPT_fhonor_infinities)
3520 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003521 if (Arg *A = Args.getLastArg(
3522 options::OPT_ffast_math, FastMathAliasOption,
3523 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3524 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3525 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003526 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3527 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003528 A->getOption().getID() != options::OPT_fhonor_nans)
3529 CmdArgs.push_back("-menable-no-nans");
3530
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003531 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3532 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003533 if (Arg *A =
3534 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3535 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3536 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003537 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3538 // However, turning *off* -ffast_math merely restores the toolchain default
3539 // (which may be false).
3540 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3541 A->getOption().getID() == options::OPT_ffast_math ||
3542 A->getOption().getID() == options::OPT_Ofast)
3543 MathErrno = false;
3544 else if (A->getOption().getID() == options::OPT_fmath_errno)
3545 MathErrno = true;
3546 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003547 if (MathErrno)
3548 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003549
3550 // There are several flags which require disabling very specific
3551 // optimizations. Any of these being disabled forces us to turn off the
3552 // entire set of LLVM optimizations, so collect them through all the flag
3553 // madness.
3554 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003555 if (Arg *A = Args.getLastArg(
3556 options::OPT_ffast_math, FastMathAliasOption,
3557 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3558 options::OPT_fno_unsafe_math_optimizations,
3559 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003560 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3561 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003562 A->getOption().getID() != options::OPT_fno_associative_math)
3563 AssociativeMath = true;
3564 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003565 if (Arg *A = Args.getLastArg(
3566 options::OPT_ffast_math, FastMathAliasOption,
3567 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3568 options::OPT_fno_unsafe_math_optimizations,
3569 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003570 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3571 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003572 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3573 ReciprocalMath = true;
3574 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003575 if (Arg *A = Args.getLastArg(
3576 options::OPT_ffast_math, FastMathAliasOption,
3577 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3578 options::OPT_fno_unsafe_math_optimizations,
3579 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003580 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3581 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003582 A->getOption().getID() != options::OPT_fsigned_zeros)
3583 SignedZeros = false;
3584 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003585 if (Arg *A = Args.getLastArg(
3586 options::OPT_ffast_math, FastMathAliasOption,
3587 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3588 options::OPT_fno_unsafe_math_optimizations,
3589 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003590 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3591 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003592 A->getOption().getID() != options::OPT_ftrapping_math)
3593 TrappingMath = false;
3594 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3595 !TrappingMath)
3596 CmdArgs.push_back("-menable-unsafe-fp-math");
3597
Sanjay Patel76c9e092015-01-23 16:40:50 +00003598 if (!SignedZeros)
3599 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003600
Sanjay Patel359b1052015-04-09 15:03:23 +00003601 if (ReciprocalMath)
3602 CmdArgs.push_back("-freciprocal-math");
3603
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003605 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003606 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003607 options::OPT_ffp_contract)) {
3608 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003609 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003610 if (Val == "fast" || Val == "on" || Val == "off") {
3611 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3612 } else {
3613 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003614 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003615 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003616 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3617 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003618 // If fast-math is set then set the fp-contract mode to fast.
3619 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3620 }
3621 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003622
Sanjay Patel2987c292015-06-11 14:53:41 +00003623 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003624
Bob Wilson6a039162012-07-19 03:52:53 +00003625 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3626 // and if we find them, tell the frontend to provide the appropriate
3627 // preprocessor macros. This is distinct from enabling any optimizations as
3628 // these options induce language changes which must survive serialization
3629 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003630 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3631 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003632 if (!A->getOption().matches(options::OPT_fno_fast_math))
3633 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003634 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3635 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003636 if (A->getOption().matches(options::OPT_ffinite_math_only))
3637 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003638
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003639 // Decide whether to use verbose asm. Verbose assembly is the default on
3640 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003641 bool IsIntegratedAssemblerDefault =
3642 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003643 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003644 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003645 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003646 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003647
Rafael Espindolab8a12932015-05-22 20:44:03 +00003648 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3649 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003650 CmdArgs.push_back("-no-integrated-as");
3651
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003652 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3653 CmdArgs.push_back("-mdebug-pass");
3654 CmdArgs.push_back("Structure");
3655 }
3656 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3657 CmdArgs.push_back("-mdebug-pass");
3658 CmdArgs.push_back("Arguments");
3659 }
3660
John McCall8517abc2010-02-19 02:45:38 +00003661 // Enable -mconstructor-aliases except on darwin, where we have to
3662 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003663 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003664 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003665
John McCall7ef5cb32011-03-18 02:56:14 +00003666 // Darwin's kernel doesn't support guard variables; just die if we
3667 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003668 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003669 CmdArgs.push_back("-fforbid-guard-variables");
3670
Douglas Gregordbe39272011-02-01 15:15:22 +00003671 if (Args.hasArg(options::OPT_mms_bitfields)) {
3672 CmdArgs.push_back("-mms-bitfields");
3673 }
John McCall8517abc2010-02-19 02:45:38 +00003674
Daniel Dunbar306945d2009-09-16 06:17:29 +00003675 // This is a coarse approximation of what llvm-gcc actually does, both
3676 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3677 // complicated ways.
3678 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003679 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3680 options::OPT_fno_asynchronous_unwind_tables,
3681 (getToolChain().IsUnwindTablesDefault() ||
3682 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3683 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003684 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3685 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003686 CmdArgs.push_back("-munwind-tables");
3687
Chandler Carruth05fb5852012-11-21 23:40:23 +00003688 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003689
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003690 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3691 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003692 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003693 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003694
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003695 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003696 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003697
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003698 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003699 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003700 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003701 }
3702
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003703 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003704 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003705 if (!CPU.empty()) {
3706 CmdArgs.push_back("-target-cpu");
3707 CmdArgs.push_back(Args.MakeArgString(CPU));
3708 }
3709
Rafael Espindolaeb265472013-08-21 21:59:03 +00003710 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3711 CmdArgs.push_back("-mfpmath");
3712 CmdArgs.push_back(A->getValue());
3713 }
3714
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003715 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003716 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003717
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003718 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003719 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003720 default:
3721 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003722
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003723 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003724 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003725 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003726 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003727 // Use the effective triple, which takes into account the deployment target.
3728 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003729 break;
3730
Tim Northover573cbee2014-05-24 12:52:07 +00003731 case llvm::Triple::aarch64:
3732 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003733 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003734 break;
3735
Eric Christopher0b26a612010-03-02 02:41:08 +00003736 case llvm::Triple::mips:
3737 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003738 case llvm::Triple::mips64:
3739 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003740 AddMIPSTargetArgs(Args, CmdArgs);
3741 break;
3742
Ulrich Weigand8afad612014-07-28 13:17:52 +00003743 case llvm::Triple::ppc:
3744 case llvm::Triple::ppc64:
3745 case llvm::Triple::ppc64le:
3746 AddPPCTargetArgs(Args, CmdArgs);
3747 break;
3748
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003749 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003750 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003751 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003752 AddSparcTargetArgs(Args, CmdArgs);
3753 break;
3754
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003755 case llvm::Triple::x86:
3756 case llvm::Triple::x86_64:
3757 AddX86TargetArgs(Args, CmdArgs);
3758 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003759
3760 case llvm::Triple::hexagon:
3761 AddHexagonTargetArgs(Args, CmdArgs);
3762 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003763 }
3764
Douglas Katzman3459ce22015-10-08 04:24:12 +00003765 // The 'g' groups options involve a somewhat intricate sequence of decisions
3766 // about what to pass from the driver to the frontend, but by the time they
3767 // reach cc1 they've been factored into two well-defined orthogonal choices:
3768 // * what level of debug info to generate
3769 // * what dwarf version to write
3770 // This avoids having to monkey around further in cc1 other than to disable
3771 // codeview if not running in a Windows environment. Perhaps even that
3772 // decision should be made in the driver as well though.
3773 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3774 CodeGenOptions::NoDebugInfo;
3775 // These two are potentially updated by AddClangCLArgs.
3776 unsigned DwarfVersion = 0;
3777 bool EmitCodeView = false;
3778
Hans Wennborg75958c42013-08-08 00:17:41 +00003779 // Add clang-cl arguments.
3780 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003781 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003782
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003783 // Pass the linker version in use.
3784 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3785 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003786 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003787 }
3788
Eric Christopherb7d97e92013-04-03 01:58:53 +00003789 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003790 CmdArgs.push_back("-momit-leaf-frame-pointer");
3791
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003792 // Explicitly error on some things we know we don't support and can't just
3793 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003794 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003795 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3796 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003798 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003799 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3800 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003801 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003802 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003803 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003804 }
3805
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003806 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003807 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003808 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003809 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003810 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3811 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003812 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003813 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003814 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003815
Chad Rosierbe10f982011-08-02 17:58:04 +00003816 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003817 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003818 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3819 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003820 }
3821
Rafael Espindola08a692a2010-03-07 04:46:18 +00003822 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003823 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003824 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003825 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3826 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3827 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003828 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003829 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003830 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003831 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003832 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003833 // Some 'g' group option other than one expressly disabling debug info
3834 // must have been the final (winning) one. They're all equivalent.
3835 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003836 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003837 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003838
Douglas Katzman3459ce22015-10-08 04:24:12 +00003839 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3840 // (because that would mean that "-g0" was the rightmost 'g' group option).
3841 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3842 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3843 // exists of removing the gdwarf options from the g_group.
3844 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3845 options::OPT_gdwarf_4))
3846 DwarfVersion = DwarfVersionNum(A->getSpelling());
3847
Reid Kleckner124955a2015-08-05 18:51:13 +00003848 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003849 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3850 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3851 // DwarfVersion remains at 0 if no explicit choice was made.
3852 CmdArgs.push_back("-gcodeview");
3853 } else if (DwarfVersion == 0 &&
3854 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3855 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3856 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003857
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003858 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3859 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003860
3861 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003862 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003863 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003864 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003865
Eric Christopher138c32b2013-09-13 22:37:55 +00003866 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003867 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003868 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003869 CmdArgs.push_back("-dwarf-ext-refs");
3870 CmdArgs.push_back("-fmodule-format=obj");
3871 }
3872
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003873 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3874 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003875 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003876 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003877 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003878 CmdArgs.push_back("-backend-option");
3879 CmdArgs.push_back("-split-dwarf=Enable");
3880 }
3881
Douglas Katzman3459ce22015-10-08 04:24:12 +00003882 // After we've dealt with all combinations of things that could
3883 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3884 // figure out if we need to "upgrade" it to standalone debug info.
3885 // We parse these two '-f' options whether or not they will be used,
3886 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
3887 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
3888 options::OPT_fno_standalone_debug,
3889 getToolChain().GetDefaultStandaloneDebug());
3890 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
3891 DebugInfoKind = CodeGenOptions::FullDebugInfo;
3892 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
3893
Eric Christopher138c32b2013-09-13 22:37:55 +00003894 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3895 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3896 CmdArgs.push_back("-backend-option");
3897 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3898 }
Eric Christophereec89c22013-06-18 00:03:50 +00003899
Eric Christopher0d403d22014-02-14 01:27:03 +00003900 // -gdwarf-aranges turns on the emission of the aranges section in the
3901 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003902 // Always enabled on the PS4.
3903 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003904 CmdArgs.push_back("-backend-option");
3905 CmdArgs.push_back("-generate-arange-section");
3906 }
3907
David Blaikief36d9ba2014-01-27 18:52:43 +00003908 if (Args.hasFlag(options::OPT_fdebug_types_section,
3909 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003910 CmdArgs.push_back("-backend-option");
3911 CmdArgs.push_back("-generate-type-units");
3912 }
Eric Christophereec89c22013-06-18 00:03:50 +00003913
Ed Schouten6e576152015-03-26 17:50:28 +00003914 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3915 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3916
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003917 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003918 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003919 CmdArgs.push_back("-ffunction-sections");
3920 }
3921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003922 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3923 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003924 CmdArgs.push_back("-fdata-sections");
3925 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003926
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003927 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003928 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003929 CmdArgs.push_back("-fno-unique-section-names");
3930
Chris Lattner3c77a352010-06-22 00:03:40 +00003931 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3932
Diego Novilloa0545962015-07-10 18:00:07 +00003933 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003934
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003935 // Pass options for controlling the default header search paths.
3936 if (Args.hasArg(options::OPT_nostdinc)) {
3937 CmdArgs.push_back("-nostdsysteminc");
3938 CmdArgs.push_back("-nobuiltininc");
3939 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003940 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003942 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3943 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3944 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003945
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003946 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003947 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003948 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003949
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003950 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3951
Ted Kremenekf7639e12012-03-06 20:06:33 +00003952 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003953 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003954 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003955 options::OPT_ccc_arcmt_modify,
3956 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003957 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003958 switch (A->getOption().getID()) {
3959 default:
3960 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003961 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003962 CmdArgs.push_back("-arcmt-check");
3963 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003964 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003965 CmdArgs.push_back("-arcmt-modify");
3966 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003967 case options::OPT_ccc_arcmt_migrate:
3968 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003969 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003970 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003971
3972 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3973 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003974 break;
John McCalld70fb982011-06-15 23:25:17 +00003975 }
3976 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003977 } else {
3978 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3979 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3980 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003981 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003982
Ted Kremenekf7639e12012-03-06 20:06:33 +00003983 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3984 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003985 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3986 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003987 }
3988 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003989 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003990
3991 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003992 options::OPT_objcmt_migrate_subscripting,
3993 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003994 // None specified, means enable them all.
3995 CmdArgs.push_back("-objcmt-migrate-literals");
3996 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003997 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003998 } else {
3999 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4000 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004001 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004002 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004003 } else {
4004 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4005 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4006 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4007 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4008 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4009 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004010 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004011 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4012 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4013 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4014 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4015 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4016 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4017 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004018 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004019 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004020 }
4021
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004022 // Add preprocessing options like -I, -D, etc. if we are using the
4023 // preprocessor.
4024 //
4025 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004026 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00004027 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004028
Rafael Espindolaa7431922011-07-21 23:40:37 +00004029 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4030 // that "The compiler can only warn and ignore the option if not recognized".
4031 // When building with ccache, it will pass -D options to clang even on
4032 // preprocessed inputs and configure concludes that -fPIC is not supported.
4033 Args.ClaimAllArgs(options::OPT_D);
4034
Alp Toker7874bdc2013-11-15 20:40:58 +00004035 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004036 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4037 if (A->getOption().matches(options::OPT_O4)) {
4038 CmdArgs.push_back("-O3");
4039 D.Diag(diag::warn_O4_is_O3);
4040 } else {
4041 A->render(Args, CmdArgs);
4042 }
4043 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004044
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004045 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004046 for (const Arg *A :
4047 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4048 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004049 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004050 }
4051
Rafael Espindola577637a2015-01-03 00:06:04 +00004052 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004053
Richard Smith3be1cb22014-08-07 00:24:21 +00004054 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004055 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004056 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4057 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004058 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004059 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004060
4061 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004062 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004063 //
4064 // If a std is supplied, only add -trigraphs if it follows the
4065 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004066 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004067 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4068 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004069 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004070 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004071 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004072 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004073 else
4074 Std->render(Args, CmdArgs);
4075
Nico Weber00721502014-12-23 22:32:37 +00004076 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004077 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004078 options::OPT_ftrigraphs,
4079 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004080 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004081 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004082 } else {
4083 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004084 //
4085 // FIXME: Clang doesn't correctly handle -std= when the input language
4086 // doesn't match. For the time being just ignore this for C++ inputs;
4087 // eventually we want to do all the standard defaulting here instead of
4088 // splitting it between the driver and clang -cc1.
4089 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004090 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4091 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004092 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004093 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004094
Nico Weber00721502014-12-23 22:32:37 +00004095 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4096 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004097 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004098
Richard Smith282b4492013-09-04 22:50:31 +00004099 // GCC's behavior for -Wwrite-strings is a bit strange:
4100 // * In C, this "warning flag" changes the types of string literals from
4101 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4102 // for the discarded qualifier.
4103 // * In C++, this is just a normal warning flag.
4104 //
4105 // Implementing this warning correctly in C is hard, so we follow GCC's
4106 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4107 // a non-const char* in C, rather than using this crude hack.
4108 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004109 // FIXME: This should behave just like a warning flag, and thus should also
4110 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4111 Arg *WriteStrings =
4112 Args.getLastArg(options::OPT_Wwrite_strings,
4113 options::OPT_Wno_write_strings, options::OPT_w);
4114 if (WriteStrings &&
4115 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004116 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004117 }
4118
Chandler Carruth61fbf622011-04-23 09:27:53 +00004119 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004120 // during C++ compilation, which it is by default. GCC keeps this define even
4121 // in the presence of '-w', match this behavior bug-for-bug.
4122 if (types::isCXX(InputType) &&
4123 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4124 true)) {
4125 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004126 }
4127
Chandler Carruthe0391482010-05-22 02:21:53 +00004128 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4129 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4130 if (Asm->getOption().matches(options::OPT_fasm))
4131 CmdArgs.push_back("-fgnu-keywords");
4132 else
4133 CmdArgs.push_back("-fno-gnu-keywords");
4134 }
4135
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004136 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4137 CmdArgs.push_back("-fno-dwarf-directory-asm");
4138
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004139 if (ShouldDisableAutolink(Args, getToolChain()))
4140 CmdArgs.push_back("-fno-autolink");
4141
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004142 // Add in -fdebug-compilation-dir if necessary.
4143 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004144
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004145 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4146 StringRef Map = A->getValue();
4147 if (Map.find('=') == StringRef::npos)
4148 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4149 else
4150 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4151 A->claim();
4152 }
4153
Richard Smith9a568822011-11-21 19:36:32 +00004154 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4155 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004156 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004157 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004158 }
4159
Richard Smith79c927b2013-11-06 19:31:51 +00004160 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4161 CmdArgs.push_back("-foperator-arrow-depth");
4162 CmdArgs.push_back(A->getValue());
4163 }
4164
Richard Smith9a568822011-11-21 19:36:32 +00004165 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4166 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004167 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004168 }
4169
Richard Smitha3d3bd22013-05-08 02:12:03 +00004170 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4171 CmdArgs.push_back("-fconstexpr-steps");
4172 CmdArgs.push_back(A->getValue());
4173 }
4174
Richard Smithb3a14522013-02-22 01:59:51 +00004175 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4176 CmdArgs.push_back("-fbracket-depth");
4177 CmdArgs.push_back(A->getValue());
4178 }
4179
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004180 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4181 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004182 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004183 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004184 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4185 } else
4186 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004187 }
4188
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004189 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004190 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004191
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004192 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4193 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004194 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004195 }
David Chisnall5778fce2009-08-31 16:41:57 +00004196
Chris Lattnere23003d2010-01-09 21:54:33 +00004197 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4198 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004199 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004200 }
4201
Chris Lattnerb35583d2010-04-07 20:49:23 +00004202 CmdArgs.push_back("-ferror-limit");
4203 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004204 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004205 else
4206 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004207
Chandler Carrutha77a7272010-05-06 04:55:18 +00004208 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4209 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004210 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004211 }
4212
4213 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4214 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004215 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004216 }
4217
Richard Smithf6f003a2011-12-16 19:06:07 +00004218 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4219 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004220 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004221 }
4222
Nick Lewycky24653262014-12-16 21:39:02 +00004223 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4224 CmdArgs.push_back("-fspell-checking-limit");
4225 CmdArgs.push_back(A->getValue());
4226 }
4227
Daniel Dunbar2c978472009-11-04 06:24:47 +00004228 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004229 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004230 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004231 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004232 } else {
4233 // If -fmessage-length=N was not specified, determine whether this is a
4234 // terminal and, if so, implicitly define -fmessage-length appropriately.
4235 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004236 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004237 }
4238
John McCallb4a99d32013-02-19 01:57:35 +00004239 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4240 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4241 options::OPT_fvisibility_ms_compat)) {
4242 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4243 CmdArgs.push_back("-fvisibility");
4244 CmdArgs.push_back(A->getValue());
4245 } else {
4246 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4247 CmdArgs.push_back("-fvisibility");
4248 CmdArgs.push_back("hidden");
4249 CmdArgs.push_back("-ftype-visibility");
4250 CmdArgs.push_back("default");
4251 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004252 }
4253
Douglas Gregor08329632010-06-15 17:05:35 +00004254 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004255
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004256 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4257
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004258 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004259 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4260 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004261 CmdArgs.push_back("-ffreestanding");
4262
Daniel Dunbare357d562009-12-03 18:42:11 +00004263 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004264 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004265 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004266 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004267 // Emulated TLS is enabled by default on Android, and can be enabled manually
4268 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004269 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004270 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4271 EmulatedTLSDefault))
4272 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004273 // AltiVec-like language extensions aren't relevant for assembling.
4274 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004275 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004276 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4277 }
Richard Trieu91844232012-06-26 18:18:47 +00004278 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4279 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004280
Alexey Bataevdb390212015-05-20 04:24:19 +00004281 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004282 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4283 options::OPT_fno_openmp, false))
4284 switch (getOpenMPRuntime(getToolChain(), Args)) {
4285 case OMPRT_OMP:
4286 case OMPRT_IOMP5:
4287 // Clang can generate useful OpenMP code for these two runtime libraries.
4288 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004289
4290 // If no option regarding the use of TLS in OpenMP codegeneration is
4291 // given, decide a default based on the target. Otherwise rely on the
4292 // options and pass the right information to the frontend.
4293 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004294 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004295 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004296 break;
4297 default:
4298 // By default, if Clang doesn't know how to generate useful OpenMP code
4299 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4300 // down to the actual compilation.
4301 // FIXME: It would be better to have a mode which *only* omits IR
4302 // generation based on the OpenMP support so that we get consistent
4303 // semantic analysis, etc.
4304 break;
4305 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004306
Peter Collingbourne32701642013-11-01 18:16:25 +00004307 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004308 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004309
Eric Christopher459d2712013-02-19 06:16:53 +00004310 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004311 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4312 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4313 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4314 Arch == llvm::Triple::ppc64le))
4315 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4316 << "ppc/ppc64/ppc64le";
4317 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004318
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004319 // -fzvector is incompatible with -faltivec.
4320 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4321 if (Args.hasArg(options::OPT_faltivec))
4322 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4323 << "-faltivec";
4324
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004325 if (getToolChain().SupportsProfiling())
4326 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004327
4328 // -flax-vector-conversions is default.
4329 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4330 options::OPT_fno_lax_vector_conversions))
4331 CmdArgs.push_back("-fno-lax-vector-conversions");
4332
John Brawna7b4ec02015-08-10 11:11:28 +00004333 if (Args.getLastArg(options::OPT_fapple_kext) ||
4334 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004335 CmdArgs.push_back("-fapple-kext");
4336
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004337 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004338 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004339 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004340 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4341 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004342
4343 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4344 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004345 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004346 }
4347
Bob Wilson14adb362012-02-03 06:27:22 +00004348 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004349
Chandler Carruth6e501032011-03-27 00:04:55 +00004350 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4351 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004352 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004353 if (A->getOption().matches(options::OPT_fwrapv))
4354 CmdArgs.push_back("-fwrapv");
4355 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4356 options::OPT_fno_strict_overflow)) {
4357 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4358 CmdArgs.push_back("-fwrapv");
4359 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004360
4361 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4362 options::OPT_fno_reroll_loops))
4363 if (A->getOption().matches(options::OPT_freroll_loops))
4364 CmdArgs.push_back("-freroll-loops");
4365
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004366 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004367 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4368 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004369
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004370 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4371
Daniel Dunbar4930e332009-11-17 08:07:36 +00004372 // -stack-protector=0 is default.
4373 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004374 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4375 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4376 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4377 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4378 Args.ClaimAllArgs(options::OPT_fstack_protector);
4379 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004380 options::OPT_fstack_protector_all,
4381 options::OPT_fstack_protector_strong,
4382 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004383 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004384 StackProtectorLevel = std::max<unsigned>(
4385 LangOptions::SSPOn,
4386 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004387 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004388 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004389 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004390 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004391 } else {
4392 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004393 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004394 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004395 if (StackProtectorLevel) {
4396 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004397 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004398 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004399
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004400 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004401 for (const Arg *A : Args.filtered(options::OPT__param)) {
4402 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004403 if (Str.startswith("ssp-buffer-size=")) {
4404 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004405 CmdArgs.push_back("-stack-protector-buffer-size");
4406 // FIXME: Verify the argument is a valid integer.
4407 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004408 }
Sean Silva14facf32015-06-09 01:57:17 +00004409 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004410 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004411 }
4412
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004413 // Translate -mstackrealign
4414 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004415 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004416 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004417
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004418 if (Args.hasArg(options::OPT_mstack_alignment)) {
4419 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4420 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004421 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004422
Hans Wennborg77dc2362015-01-20 19:45:50 +00004423 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4424 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4425
4426 if (!Size.empty())
4427 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4428 else
4429 CmdArgs.push_back("-mstack-probe-size=0");
4430 }
4431
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004432 switch (getToolChain().getArch()) {
4433 case llvm::Triple::aarch64:
4434 case llvm::Triple::aarch64_be:
4435 case llvm::Triple::arm:
4436 case llvm::Triple::armeb:
4437 case llvm::Triple::thumb:
4438 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004439 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004440 break;
4441
4442 default:
4443 break;
4444 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004445
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004446 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4447 options::OPT_mno_restrict_it)) {
4448 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4449 CmdArgs.push_back("-backend-option");
4450 CmdArgs.push_back("-arm-restrict-it");
4451 } else {
4452 CmdArgs.push_back("-backend-option");
4453 CmdArgs.push_back("-arm-no-restrict-it");
4454 }
James Y Knight2db38f32015-08-15 03:45:25 +00004455 } else if (Triple.isOSWindows() &&
4456 (Triple.getArch() == llvm::Triple::arm ||
4457 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004458 // Windows on ARM expects restricted IT blocks
4459 CmdArgs.push_back("-backend-option");
4460 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004461 }
4462
Daniel Dunbard18049a2009-04-07 21:16:11 +00004463 // Forward -f options with positive and negative forms; we translate
4464 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004465 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4466 StringRef fname = A->getValue();
4467 if (!llvm::sys::fs::exists(fname))
4468 D.Diag(diag::err_drv_no_such_file) << fname;
4469 else
4470 A->render(Args, CmdArgs);
4471 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004472
John Brawna7b4ec02015-08-10 11:11:28 +00004473 // -fbuiltin is default unless -mkernel is used
4474 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4475 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004476 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004477
Nuno Lopes13c88c72009-12-16 16:59:22 +00004478 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4479 options::OPT_fno_assume_sane_operator_new))
4480 CmdArgs.push_back("-fno-assume-sane-operator-new");
4481
Daniel Dunbar4930e332009-11-17 08:07:36 +00004482 // -fblocks=0 is default.
4483 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004484 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004485 (Args.hasArg(options::OPT_fgnu_runtime) &&
4486 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4487 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004488 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004490 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004491 !getToolChain().hasBlocksRuntime())
4492 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004493 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004494
Richard Smith47972af2015-06-16 00:08:24 +00004495 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004496 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004497 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004498 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004499 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004500 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4501 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004502 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004503 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004504 HaveModules = true;
4505 }
4506 }
4507
Richard Smith47972af2015-06-16 00:08:24 +00004508 // -fmodule-maps enables implicit reading of module map files. By default,
4509 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004510 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4511 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004512 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004513 }
4514
Daniel Jasperac42b752013-10-21 06:34:34 +00004515 // -fmodules-decluse checks that modules used are declared so (off by
4516 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004517 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004518 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004519 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004520 }
4521
Daniel Jasper962b38e2014-04-11 11:47:45 +00004522 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4523 // all #included headers are part of modules.
4524 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004525 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004526 CmdArgs.push_back("-fmodules-strict-decluse");
4527 }
4528
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004529 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4530 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4531 options::OPT_fno_implicit_modules)) {
4532 CmdArgs.push_back("-fno-implicit-modules");
4533 }
4534
Daniel Jasperac42b752013-10-21 06:34:34 +00004535 // -fmodule-name specifies the module that is currently being built (or
4536 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004537 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004538
Richard Smith9887d792014-10-17 01:42:53 +00004539 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004540 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004541 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004542
Richard Smithe842a472014-10-22 02:05:46 +00004543 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004544 if (HaveModules)
4545 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4546 else
4547 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004548
4549 // -fmodule-cache-path specifies where our implicitly-built module files
4550 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004551 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004552 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004553 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004554 if (HaveModules) {
4555 if (C.isForDiagnostics()) {
4556 // When generating crash reports, we want to emit the modules along with
4557 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004558 Path = Output.getFilename();
4559 llvm::sys::path::replace_extension(Path, ".cache");
4560 llvm::sys::path::append(Path, "modules");
4561 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004562 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004563 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004564 llvm::sys::path::append(Path, "org.llvm.clang.");
4565 appendUserToPath(Path);
4566 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004567 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004568 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004569 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4570 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004571 }
4572
4573 // When building modules and generating crashdumps, we need to dump a module
4574 // dependency VFS alongside the output.
4575 if (HaveModules && C.isForDiagnostics()) {
4576 SmallString<128> VFSDir(Output.getFilename());
4577 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004578 // Add the cache directory as a temp so the crash diagnostics pick it up.
4579 C.addTempFile(Args.MakeArgString(VFSDir));
4580
Justin Bognera88f0122014-06-20 22:59:50 +00004581 llvm::sys::path::append(VFSDir, "vfs");
4582 CmdArgs.push_back("-module-dependency-dir");
4583 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004584 }
4585
Richard Smith9887d792014-10-17 01:42:53 +00004586 if (HaveModules)
4587 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004588
Douglas Gregor35b04d62013-02-07 19:01:24 +00004589 // Pass through all -fmodules-ignore-macro arguments.
4590 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004591 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4592 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004593
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004594 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4595
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004596 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4597 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4598 D.Diag(diag::err_drv_argument_not_allowed_with)
4599 << A->getAsString(Args) << "-fbuild-session-timestamp";
4600
4601 llvm::sys::fs::file_status Status;
4602 if (llvm::sys::fs::status(A->getValue(), Status))
4603 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004604 CmdArgs.push_back(Args.MakeArgString(
4605 "-fbuild-session-timestamp=" +
4606 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004607 }
4608
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004609 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004610 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4611 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004612 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4613
4614 Args.AddLastArg(CmdArgs,
4615 options::OPT_fmodules_validate_once_per_build_session);
4616 }
4617
Ben Langmuirdcf73862014-03-12 00:06:17 +00004618 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4619
John McCalldfea9982010-04-09 19:12:06 +00004620 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004621 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004622 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004623 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004624
Anders Carlssond470fef2010-11-21 00:09:52 +00004625 // -felide-constructors is the default.
4626 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004627 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004628 CmdArgs.push_back("-fno-elide-constructors");
4629
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004630 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004631
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004632 if (KernelOrKext || (types::isCXX(InputType) &&
4633 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4634 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004635 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004636
Tony Linthicum76329bf2011-12-12 21:14:55 +00004637 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004638 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4639 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004640 CmdArgs.push_back("-fshort-enums");
4641
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004642 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004643 if (Arg *A = Args.getLastArg(
4644 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4645 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4646 if (A->getOption().matches(options::OPT_funsigned_char) ||
4647 A->getOption().matches(options::OPT_fno_signed_char)) {
4648 CmdArgs.push_back("-fno-signed-char");
4649 }
4650 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004651 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004652 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004653
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004654 // -fuse-cxa-atexit is default.
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00004655 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4656 options::OPT_fno_use_cxa_atexit,
4657 !IsWindowsCygnus && !IsWindowsGNU &&
4658 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4659 getToolChain().getArch() != llvm::Triple::hexagon &&
4660 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004661 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004662 CmdArgs.push_back("-fno-use-cxa-atexit");
4663
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004664 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004665 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004666 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004667 CmdArgs.push_back("-fms-extensions");
4668
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004669 // -fno-use-line-directives is default.
4670 if (Args.hasFlag(options::OPT_fuse_line_directives,
4671 options::OPT_fno_use_line_directives, false))
4672 CmdArgs.push_back("-fuse-line-directives");
4673
Francois Pichet1b4f1632011-09-17 04:32:15 +00004674 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004675 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004676 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004677 (IsWindowsMSVC &&
4678 Args.hasFlag(options::OPT_fms_extensions,
4679 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004680 CmdArgs.push_back("-fms-compatibility");
4681
David Majnemerc371ff02015-03-22 08:39:22 +00004682 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004683 VersionTuple MSVT = visualstudio::getMSVCVersion(
4684 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4685 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004686 CmdArgs.push_back(
4687 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004688
David Majnemer8db91762015-05-18 04:49:30 +00004689 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4690 if (ImplyVCPPCXXVer) {
4691 if (IsMSVC2015Compatible)
4692 CmdArgs.push_back("-std=c++14");
4693 else
4694 CmdArgs.push_back("-std=c++11");
4695 }
4696
Eric Christopher5ecce122013-02-18 00:38:31 +00004697 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004698 if (Args.hasFlag(options::OPT_fborland_extensions,
4699 options::OPT_fno_borland_extensions, false))
4700 CmdArgs.push_back("-fborland-extensions");
4701
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004702 // -fno-declspec is default, except for PS4.
4703 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4704 getToolChain().getTriple().isPS4()))
4705 CmdArgs.push_back("-fdeclspec");
4706 else if (Args.hasArg(options::OPT_fno_declspec))
4707 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4708
David Majnemerc371ff02015-03-22 08:39:22 +00004709 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4710 // than 19.
4711 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4712 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004713 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004714 CmdArgs.push_back("-fno-threadsafe-statics");
4715
Francois Pichet02744872011-09-01 16:38:08 +00004716 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4717 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004718 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004719 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004720 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004721
Chandler Carruthe03aa552010-04-17 20:17:31 +00004722 // -fgnu-keywords default varies depending on language; only pass if
4723 // specified.
4724 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004725 options::OPT_fno_gnu_keywords))
4726 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004728 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004729 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004730 CmdArgs.push_back("-fgnu89-inline");
4731
Chad Rosier9c76d242012-03-15 22:31:42 +00004732 if (Args.hasArg(options::OPT_fno_inline))
4733 CmdArgs.push_back("-fno-inline");
4734
Chad Rosier64d6be92012-03-06 21:17:19 +00004735 if (Args.hasArg(options::OPT_fno_inline_functions))
4736 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004737
John McCall5fb5df92012-06-20 06:18:46 +00004738 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004739
John McCall5fb5df92012-06-20 06:18:46 +00004740 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004741 // legacy is the default. Except for deployment taget of 10.5,
4742 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4743 // gets ignored silently.
4744 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004745 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4746 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004747 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004748 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004749 if (getToolChain().UseObjCMixedDispatch())
4750 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4751 else
4752 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4753 }
4754 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004755
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004756 // When ObjectiveC legacy runtime is in effect on MacOSX,
4757 // turn on the option to do Array/Dictionary subscripting
4758 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004759 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004760 getToolChain().getTriple().isMacOSX() &&
4761 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4762 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004763 objcRuntime.isNeXTFamily())
4764 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004765
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004766 // -fencode-extended-block-signature=1 is default.
4767 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4768 CmdArgs.push_back("-fencode-extended-block-signature");
4769 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004770
John McCall24fc0de2011-07-06 00:26:06 +00004771 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4772 // NOTE: This logic is duplicated in ToolChains.cpp.
4773 bool ARC = isObjCAutoRefCount(Args);
4774 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004775 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004776
John McCall24fc0de2011-07-06 00:26:06 +00004777 CmdArgs.push_back("-fobjc-arc");
4778
Chandler Carruth491db322011-11-04 07:34:47 +00004779 // FIXME: It seems like this entire block, and several around it should be
4780 // wrapped in isObjC, but for now we just use it here as this is where it
4781 // was being used previously.
4782 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4783 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4784 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4785 else
4786 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4787 }
4788
John McCall24fc0de2011-07-06 00:26:06 +00004789 // Allow the user to enable full exceptions code emission.
4790 // We define off for Objective-CC, on for Objective-C++.
4791 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4792 options::OPT_fno_objc_arc_exceptions,
4793 /*default*/ types::isCXX(InputType)))
4794 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004795
John McCall24fc0de2011-07-06 00:26:06 +00004796 }
4797
4798 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4799 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004800 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004801 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004802
John McCall24fc0de2011-07-06 00:26:06 +00004803 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4804 // takes precedence.
4805 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4806 if (!GCArg)
4807 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4808 if (GCArg) {
4809 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004811 } else if (getToolChain().SupportsObjCGC()) {
4812 GCArg->render(Args, CmdArgs);
4813 } else {
4814 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004815 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004816 }
4817 }
4818
Bob Wilsonb111ec92015-03-02 19:01:14 +00004819 if (Args.hasFlag(options::OPT_fapplication_extension,
4820 options::OPT_fno_application_extension, false))
4821 CmdArgs.push_back("-fapplication-extension");
4822
Reid Klecknerc542d372014-06-27 17:02:02 +00004823 // Handle GCC-style exception args.
4824 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004825 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4826 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004827
Tim Northovere931f9f2015-10-30 16:30:41 +00004828 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004829 CmdArgs.push_back("-fsjlj-exceptions");
4830
4831 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004832 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4833 options::OPT_fno_assume_sane_operator_new))
4834 CmdArgs.push_back("-fno-assume-sane-operator-new");
4835
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004836 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4837 // most platforms.
4838 if (Args.hasFlag(options::OPT_fsized_deallocation,
4839 options::OPT_fno_sized_deallocation, false))
4840 CmdArgs.push_back("-fsized-deallocation");
4841
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004842 // -fconstant-cfstrings is default, and may be subject to argument translation
4843 // on Darwin.
4844 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4845 options::OPT_fno_constant_cfstrings) ||
4846 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4847 options::OPT_mno_constant_cfstrings))
4848 CmdArgs.push_back("-fno-constant-cfstrings");
4849
John Thompsoned4e2952009-11-05 20:14:16 +00004850 // -fshort-wchar default varies depending on platform; only
4851 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004852 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4853 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004854 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004855
Hans Wennborg28c96312013-07-31 23:39:13 +00004856 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004857 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004858 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004859 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004860
Daniel Dunbar096ed292011-10-05 21:04:55 +00004861 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4862 // -fno-pack-struct doesn't apply to -fpack-struct=.
4863 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004864 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004865 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004866 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004867 } else if (Args.hasFlag(options::OPT_fpack_struct,
4868 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004869 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004870 }
4871
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004872 // Handle -fmax-type-align=N and -fno-type-align
4873 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4874 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4875 if (!SkipMaxTypeAlign) {
4876 std::string MaxTypeAlignStr = "-fmax-type-align=";
4877 MaxTypeAlignStr += A->getValue();
4878 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4879 }
4880 } else if (getToolChain().getTriple().isOSDarwin()) {
4881 if (!SkipMaxTypeAlign) {
4882 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4883 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4884 }
4885 }
4886
John Brawna7b4ec02015-08-10 11:11:28 +00004887 // -fcommon is the default unless compiling kernel code or the target says so
4888 bool NoCommonDefault =
4889 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4890 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4891 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004892 CmdArgs.push_back("-fno-common");
4893
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004894 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004895 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004896 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004897 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004898 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004899 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004900
Daniel Dunbar6358d682010-10-15 22:30:42 +00004901 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004902 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004903 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004904 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004905
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004906 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004907 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4908 StringRef value = inputCharset->getValue();
4909 if (value != "UTF-8")
4910 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4911 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004912 }
4913
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004914 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004915 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4916 StringRef value = execCharset->getValue();
4917 if (value != "UTF-8")
4918 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4919 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004920 }
4921
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004922 // -fcaret-diagnostics is default.
4923 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4924 options::OPT_fno_caret_diagnostics, true))
4925 CmdArgs.push_back("-fno-caret-diagnostics");
4926
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004927 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004928 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004929 options::OPT_fno_diagnostics_fixit_info))
4930 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004931
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004932 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004933 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004934 options::OPT_fno_diagnostics_show_option))
4935 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004936
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004937 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004938 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004939 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004940 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004941 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004943 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004944 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004945 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004946 }
4947
Chandler Carruthb6766f02011-03-27 01:50:55 +00004948 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004949 options::OPT_fdiagnostics_show_note_include_stack,
4950 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004951 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004952 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004953 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4954 else
4955 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4956 }
4957
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004958 // Color diagnostics are the default, unless the terminal doesn't support
4959 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004960 // Support both clang's -f[no-]color-diagnostics and gcc's
4961 // -f[no-]diagnostics-colors[=never|always|auto].
4962 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004963 for (const auto &Arg : Args) {
4964 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004965 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4966 !O.matches(options::OPT_fdiagnostics_color) &&
4967 !O.matches(options::OPT_fno_color_diagnostics) &&
4968 !O.matches(options::OPT_fno_diagnostics_color) &&
4969 !O.matches(options::OPT_fdiagnostics_color_EQ))
4970 continue;
4971
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004972 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004973 if (O.matches(options::OPT_fcolor_diagnostics) ||
4974 O.matches(options::OPT_fdiagnostics_color)) {
4975 ShowColors = Colors_On;
4976 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4977 O.matches(options::OPT_fno_diagnostics_color)) {
4978 ShowColors = Colors_Off;
4979 } else {
4980 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004981 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004982 if (value == "always")
4983 ShowColors = Colors_On;
4984 else if (value == "never")
4985 ShowColors = Colors_Off;
4986 else if (value == "auto")
4987 ShowColors = Colors_Auto;
4988 else
4989 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004990 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004991 }
4992 }
4993 if (ShowColors == Colors_On ||
4994 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004995 CmdArgs.push_back("-fcolor-diagnostics");
4996
Nico Rieck7857d462013-09-11 00:38:02 +00004997 if (Args.hasArg(options::OPT_fansi_escape_codes))
4998 CmdArgs.push_back("-fansi-escape-codes");
4999
Daniel Dunbardb097022009-06-08 21:13:54 +00005000 if (!Args.hasFlag(options::OPT_fshow_source_location,
5001 options::OPT_fno_show_source_location))
5002 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005004 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005005 true))
5006 CmdArgs.push_back("-fno-show-column");
5007
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005008 if (!Args.hasFlag(options::OPT_fspell_checking,
5009 options::OPT_fno_spell_checking))
5010 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005011
Chad Rosierc8e56e82012-12-05 21:08:21 +00005012 // -fno-asm-blocks is default.
5013 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5014 false))
5015 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005016
Steven Wucb0d13f2015-01-16 23:05:28 +00005017 // -fgnu-inline-asm is default.
5018 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5019 options::OPT_fno_gnu_inline_asm, true))
5020 CmdArgs.push_back("-fno-gnu-inline-asm");
5021
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005022 // Enable vectorization per default according to the optimization level
5023 // selected. For optimization levels that want vectorization we use the alias
5024 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005025 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005026 OptSpecifier VectorizeAliasOption =
5027 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005028 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005029 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005030 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005031
Chad Rosier136d67d2014-04-28 19:30:57 +00005032 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005033 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005034 OptSpecifier SLPVectAliasOption =
5035 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005036 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005037 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005038 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005039
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005040 // -fno-slp-vectorize-aggressive is default.
5041 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005042 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005043 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005044
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005045 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5046 A->render(Args, CmdArgs);
5047
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005048 // -fdollars-in-identifiers default varies depending on platform and
5049 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005050 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005051 options::OPT_fno_dollars_in_identifiers)) {
5052 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005053 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005054 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005055 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005056 }
5057
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005058 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5059 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005060 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005061 options::OPT_fno_unit_at_a_time)) {
5062 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005063 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005064 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005065
Eli Friedman055c9702011-11-02 01:53:16 +00005066 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5067 options::OPT_fno_apple_pragma_pack, false))
5068 CmdArgs.push_back("-fapple-pragma-pack");
5069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005070 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005071 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5072 // by default.
5073 if (getToolChain().getArch() == llvm::Triple::le32) {
5074 CmdArgs.push_back("-fno-math-builtin");
5075 }
5076
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005077// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5078//
5079// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005080#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005081 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005082 (getToolChain().getArch() == llvm::Triple::arm ||
5083 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005084 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5085 CmdArgs.push_back("-fno-builtin-strcat");
5086 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5087 CmdArgs.push_back("-fno-builtin-strcpy");
5088 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005089#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005090
Justin Bognera88f0122014-06-20 22:59:50 +00005091 // Enable rewrite includes if the user's asked for it or if we're generating
5092 // diagnostics.
5093 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5094 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005095 if (Args.hasFlag(options::OPT_frewrite_includes,
5096 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005097 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005098 CmdArgs.push_back("-frewrite-includes");
5099
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005100 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005101 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005102 options::OPT_traditional_cpp)) {
5103 if (isa<PreprocessJobAction>(JA))
5104 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005105 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005106 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005107 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005108
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005109 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005110 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005111
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005112 // Handle serialized diagnostics.
5113 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5114 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005115 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005116 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005117
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005118 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5119 CmdArgs.push_back("-fretain-comments-from-system-headers");
5120
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005121 // Forward -fcomment-block-commands to -cc1.
5122 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005123 // Forward -fparse-all-comments to -cc1.
5124 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005125
John Brawnad31ace2015-09-23 13:55:40 +00005126 // Turn -fplugin=name.so into -load name.so
5127 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5128 CmdArgs.push_back("-load");
5129 CmdArgs.push_back(A->getValue());
5130 A->claim();
5131 }
5132
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005133 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5134 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005135 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005136 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5137 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005138
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005139 // We translate this by hand to the -cc1 argument, since nightly test uses
5140 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005141 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005142 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005143 } else
Sean Silva14facf32015-06-09 01:57:17 +00005144 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005145 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005146
Bob Wilson23a55f12014-12-21 07:00:00 +00005147 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005148 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5149 // by the frontend.
5150 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5151 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005152
Daniel Dunbard67a3222009-03-30 06:36:42 +00005153 if (Output.getType() == types::TY_Dependencies) {
5154 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005155 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005156 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005157 CmdArgs.push_back(Output.getFilename());
5158 } else {
5159 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005160 }
5161
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005162 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005163
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005164 if (Input.isFilename())
5165 CmdArgs.push_back(Input.getFilename());
5166 else
5167 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005168
Chris Lattnere9d7d782009-11-03 19:50:27 +00005169 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5170
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005171 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005172
5173 // Optionally embed the -cc1 level arguments into the debug info, for build
5174 // analysis.
5175 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005176 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005177 for (const auto &Arg : Args)
5178 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005179
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005180 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005181 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005182 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005183 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005184 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005185 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005186 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005187 }
5188 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005189 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005190 }
5191
Eric Christopherd3804002013-02-22 20:12:52 +00005192 // Add the split debug info name to the command lines here so we
5193 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005194 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005195 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5196 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005197 const char *SplitDwarfOut;
5198 if (SplitDwarf) {
5199 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005200 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005201 CmdArgs.push_back(SplitDwarfOut);
5202 }
5203
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005204 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5205 // Include them with -fcuda-include-gpubinary.
5206 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005207 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005208 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005209 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005210 }
5211
Eric Christopherd3804002013-02-22 20:12:52 +00005212 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005213 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005214 Output.getType() == types::TY_Object &&
5215 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005216 auto CLCommand =
5217 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005218 C.addCommand(llvm::make_unique<FallbackCommand>(
5219 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005220 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005221 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005222 }
5223
Eric Christopherf1545832013-02-22 23:50:16 +00005224 // Handle the debug info splitting at object creation time if we're
5225 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005226 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005227 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005228 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005229
Roman Divacky178e01602011-02-10 16:52:03 +00005230 if (Arg *A = Args.getLastArg(options::OPT_pg))
5231 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005232 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5233 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005234
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005235 // Claim some arguments which clang supports automatically.
5236
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005237 // -fpch-preprocess is used with gcc to add a special marker in the output to
5238 // include the PCH file. Clang's PTH solution is completely transparent, so we
5239 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005240 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005241
Daniel Dunbar17731772009-03-23 19:03:36 +00005242 // Claim some arguments which clang doesn't support, but we don't
5243 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005244 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5245 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005246
Rafael Espindolab0092d72013-09-04 19:37:35 +00005247 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005248 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005249}
5250
John McCall5fb5df92012-06-20 06:18:46 +00005251/// Add options related to the Objective-C runtime/ABI.
5252///
5253/// Returns true if the runtime is non-fragile.
5254ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5255 ArgStringList &cmdArgs,
5256 RewriteKind rewriteKind) const {
5257 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 Arg *runtimeArg =
5259 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5260 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005261
5262 // Just forward -fobjc-runtime= to the frontend. This supercedes
5263 // options about fragility.
5264 if (runtimeArg &&
5265 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5266 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005267 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005268 if (runtime.tryParse(value)) {
5269 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005270 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005271 }
5272
5273 runtimeArg->render(args, cmdArgs);
5274 return runtime;
5275 }
5276
5277 // Otherwise, we'll need the ABI "version". Version numbers are
5278 // slightly confusing for historical reasons:
5279 // 1 - Traditional "fragile" ABI
5280 // 2 - Non-fragile ABI, version 1
5281 // 3 - Non-fragile ABI, version 2
5282 unsigned objcABIVersion = 1;
5283 // If -fobjc-abi-version= is present, use that to set the version.
5284 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005285 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005286 if (value == "1")
5287 objcABIVersion = 1;
5288 else if (value == "2")
5289 objcABIVersion = 2;
5290 else if (value == "3")
5291 objcABIVersion = 3;
5292 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005293 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005294 } else {
5295 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005296 bool nonFragileABIIsDefault =
5297 (rewriteKind == RK_NonFragile ||
5298 (rewriteKind == RK_None &&
5299 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005300 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5301 options::OPT_fno_objc_nonfragile_abi,
5302 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005304#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5305 unsigned nonFragileABIVersion = 1;
5306#else
5307 unsigned nonFragileABIVersion = 2;
5308#endif
5309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310 if (Arg *abiArg =
5311 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005312 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005313 if (value == "1")
5314 nonFragileABIVersion = 1;
5315 else if (value == "2")
5316 nonFragileABIVersion = 2;
5317 else
5318 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005319 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005320 }
5321
5322 objcABIVersion = 1 + nonFragileABIVersion;
5323 } else {
5324 objcABIVersion = 1;
5325 }
5326 }
5327
5328 // We don't actually care about the ABI version other than whether
5329 // it's non-fragile.
5330 bool isNonFragile = objcABIVersion != 1;
5331
5332 // If we have no runtime argument, ask the toolchain for its default runtime.
5333 // However, the rewriter only really supports the Mac runtime, so assume that.
5334 ObjCRuntime runtime;
5335 if (!runtimeArg) {
5336 switch (rewriteKind) {
5337 case RK_None:
5338 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5339 break;
5340 case RK_Fragile:
5341 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5342 break;
5343 case RK_NonFragile:
5344 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5345 break;
5346 }
5347
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005348 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005349 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5350 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005351 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005352 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005355 } else {
5356 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5357 }
5358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005359 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005360 } else {
5361 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005362 // Legacy behaviour is to target the gnustep runtime if we are i
5363 // non-fragile mode or the GCC runtime in fragile mode.
5364 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005366 else
5367 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005368 }
5369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005370 cmdArgs.push_back(
5371 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005372 return runtime;
5373}
5374
Reid Klecknerc542d372014-06-27 17:02:02 +00005375static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5376 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5377 I += HaveDash;
5378 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005379}
Reid Klecknerc542d372014-06-27 17:02:02 +00005380
Benjamin Kramere003ca22015-10-28 13:54:16 +00005381namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005382struct EHFlags {
5383 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5384 bool Synch;
5385 bool Asynch;
5386 bool NoExceptC;
5387};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005388} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005389
5390/// /EH controls whether to run destructor cleanups when exceptions are
5391/// thrown. There are three modifiers:
5392/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5393/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5394/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5395/// - c: Assume that extern "C" functions are implicitly noexcept. This
5396/// modifier is an optimization, so we ignore it for now.
5397/// The default is /EHs-c-, meaning cleanups are disabled.
5398static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5399 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005400
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 std::vector<std::string> EHArgs =
5402 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005403 for (auto EHVal : EHArgs) {
5404 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5405 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 case 'a':
5407 EH.Asynch = maybeConsumeDash(EHVal, I);
5408 continue;
5409 case 'c':
5410 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5411 continue;
5412 case 's':
5413 EH.Synch = maybeConsumeDash(EHVal, I);
5414 continue;
5415 default:
5416 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005417 }
5418 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5419 break;
5420 }
5421 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005422
Reid Klecknerc542d372014-06-27 17:02:02 +00005423 return EH;
5424}
5425
Douglas Katzman3459ce22015-10-08 04:24:12 +00005426void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5427 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5428 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005429 unsigned RTOptionID = options::OPT__SLASH_MT;
5430
Hans Wennborgf1a74252013-09-10 20:18:04 +00005431 if (Args.hasArg(options::OPT__SLASH_LDd))
5432 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5433 // but defining _DEBUG is sticky.
5434 RTOptionID = options::OPT__SLASH_MTd;
5435
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005436 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005437 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005438
David Majnemere2afb472015-07-24 06:49:13 +00005439 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005440 switch (RTOptionID) {
5441 case options::OPT__SLASH_MD:
5442 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005443 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005444 CmdArgs.push_back("-D_MT");
5445 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005446 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005447 break;
5448 case options::OPT__SLASH_MDd:
5449 CmdArgs.push_back("-D_DEBUG");
5450 CmdArgs.push_back("-D_MT");
5451 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005452 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005453 break;
5454 case options::OPT__SLASH_MT:
5455 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005456 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005457 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005458 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005459 break;
5460 case options::OPT__SLASH_MTd:
5461 CmdArgs.push_back("-D_DEBUG");
5462 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005463 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005464 break;
5465 default:
5466 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005467 }
5468
David Majnemere2afb472015-07-24 06:49:13 +00005469 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5470 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5471 } else {
5472 CmdArgs.push_back(FlagForCRT.data());
5473
5474 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5475 // users want. The /Za flag to cl.exe turns this off, but it's not
5476 // implemented in clang.
5477 CmdArgs.push_back("--dependent-lib=oldnames");
5478 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005479
Hans Wennborg8858a032014-07-21 23:42:07 +00005480 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5481 // would produce interleaved output, so ignore /showIncludes in such cases.
5482 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5483 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5484 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005485
David Majnemerf6072342014-07-01 22:24:56 +00005486 // This controls whether or not we emit RTTI data for polymorphic types.
5487 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5488 /*default=*/false))
5489 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005490
Reid Kleckner124955a2015-08-05 18:51:13 +00005491 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005492 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005493 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5494 // If we are emitting CV but not DWARF, don't build information that LLVM
5495 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005496 if (*EmitCodeView && !EmitDwarf)
5497 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5498 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005499 CmdArgs.push_back("-gcodeview");
5500
Reid Klecknerc542d372014-06-27 17:02:02 +00005501 const Driver &D = getToolChain().getDriver();
5502 EHFlags EH = parseClangCLEHFlags(D, Args);
5503 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005504 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005505 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005506 CmdArgs.push_back("-fexceptions");
5507 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005508
Hans Wennborge50cec32014-06-13 20:59:54 +00005509 // /EP should expand to -E -P.
5510 if (Args.hasArg(options::OPT__SLASH_EP)) {
5511 CmdArgs.push_back("-E");
5512 CmdArgs.push_back("-P");
5513 }
5514
David Majnemera5b195a2015-02-14 01:35:12 +00005515 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005516 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5517 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005518 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5519 else
5520 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5521
5522 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5523 VolatileOptionID = A->getOption().getID();
5524
5525 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5526 CmdArgs.push_back("-fms-volatile");
5527
David Majnemer86c318f2014-02-11 21:05:00 +00005528 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5529 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5530 if (MostGeneralArg && BestCaseArg)
5531 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5532 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5533
5534 if (MostGeneralArg) {
5535 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5536 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5537 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5538
5539 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5540 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5541 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5542 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5543 << FirstConflict->getAsString(Args)
5544 << SecondConflict->getAsString(Args);
5545
5546 if (SingleArg)
5547 CmdArgs.push_back("-fms-memptr-rep=single");
5548 else if (MultipleArg)
5549 CmdArgs.push_back("-fms-memptr-rep=multiple");
5550 else
5551 CmdArgs.push_back("-fms-memptr-rep=virtual");
5552 }
5553
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005554 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5555 A->render(Args, CmdArgs);
5556
Hans Wennborg81f74482013-09-10 01:07:07 +00005557 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5558 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005559 if (Args.hasArg(options::OPT__SLASH_fallback))
5560 CmdArgs.push_back("msvc-fallback");
5561 else
5562 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005563 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005564}
5565
Douglas Katzman95354292015-06-23 20:42:09 +00005566visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005567 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005568 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005569 return CLFallback.get();
5570}
5571
Daniel Sanders7f933f42015-01-30 17:35:23 +00005572void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5573 ArgStringList &CmdArgs) const {
5574 StringRef CPUName;
5575 StringRef ABIName;
5576 const llvm::Triple &Triple = getToolChain().getTriple();
5577 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5578
5579 CmdArgs.push_back("-target-abi");
5580 CmdArgs.push_back(ABIName.data());
5581}
5582
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005583void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005584 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005585 const ArgList &Args,
5586 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005587 ArgStringList CmdArgs;
5588
5589 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5590 const InputInfo &Input = Inputs[0];
5591
James Y Knight2db38f32015-08-15 03:45:25 +00005592 std::string TripleStr =
5593 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5594 const llvm::Triple Triple(TripleStr);
5595
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005596 // Don't warn about "clang -w -c foo.s"
5597 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005598 // and "clang -emit-llvm -c foo.s"
5599 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005600
Rafael Espindola577637a2015-01-03 00:06:04 +00005601 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005602
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005603 // Invoke ourselves in -cc1as mode.
5604 //
5605 // FIXME: Implement custom jobs for internal actions.
5606 CmdArgs.push_back("-cc1as");
5607
5608 // Add the "effective" target triple.
5609 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005610 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5611
5612 // Set the output mode, we currently only expect to be used as a real
5613 // assembler.
5614 CmdArgs.push_back("-filetype");
5615 CmdArgs.push_back("obj");
5616
Eric Christopher45f2e712012-12-18 00:31:10 +00005617 // Set the main file name, so that debug info works even with
5618 // -save-temps or preprocessed assembly.
5619 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005620 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005621
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005622 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005623 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005624 if (!CPU.empty()) {
5625 CmdArgs.push_back("-target-cpu");
5626 CmdArgs.push_back(Args.MakeArgString(CPU));
5627 }
5628
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005629 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005630 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005631
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005632 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005633 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005634
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005635 // Pass along any -I options so we get proper .include search paths.
5636 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5637
Eric Christopherfc3ee562012-01-10 00:38:01 +00005638 // Determine the original source input.
5639 const Action *SourceAction = &JA;
5640 while (SourceAction->getKind() != Action::InputClass) {
5641 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5642 SourceAction = SourceAction->getInputs()[0];
5643 }
5644
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005645 // Forward -g and handle debug info related flags, assuming we are dealing
5646 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005647 if (SourceAction->getType() == types::TY_Asm ||
5648 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005649 bool WantDebug = false;
5650 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005651 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005652 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5653 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005654 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005655 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005656 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005657 if (DwarfVersion == 0)
5658 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005659 RenderDebugEnablingArgs(Args, CmdArgs,
5660 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5661 : CodeGenOptions::NoDebugInfo),
5662 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005663
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005664 // Add the -fdebug-compilation-dir flag if needed.
5665 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005666
5667 // Set the AT_producer to the clang version when using the integrated
5668 // assembler on assembly source files.
5669 CmdArgs.push_back("-dwarf-debug-producer");
5670 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005671
5672 // And pass along -I options
5673 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005674 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005675
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005676 // Handle -fPIC et al -- the relocation-model affects the assembler
5677 // for some targets.
5678 llvm::Reloc::Model RelocationModel;
5679 unsigned PICLevel;
5680 bool IsPIE;
5681 std::tie(RelocationModel, PICLevel, IsPIE) =
5682 ParsePICArgs(getToolChain(), Triple, Args);
5683
5684 const char *RMName = RelocationModelName(RelocationModel);
5685 if (RMName) {
5686 CmdArgs.push_back("-mrelocation-model");
5687 CmdArgs.push_back(RMName);
5688 }
5689
Kevin Enderby292dc082011-12-22 19:31:58 +00005690 // Optionally embed the -cc1as level arguments into the debug info, for build
5691 // analysis.
5692 if (getToolChain().UseDwarfDebugFlags()) {
5693 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005694 for (const auto &Arg : Args)
5695 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005696
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005697 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005698 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5699 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005700 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005701 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005702 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005703 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005704 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005705 }
5706 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005707 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005708 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005709
5710 // FIXME: Add -static support, once we have it.
5711
Daniel Sanders7f933f42015-01-30 17:35:23 +00005712 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005713 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005714 default:
5715 break;
5716
5717 case llvm::Triple::mips:
5718 case llvm::Triple::mipsel:
5719 case llvm::Triple::mips64:
5720 case llvm::Triple::mips64el:
5721 AddMIPSTargetArgs(Args, CmdArgs);
5722 break;
5723 }
5724
David Blaikie372d9502014-01-17 03:17:40 +00005725 // Consume all the warning flags. Usually this would be handled more
5726 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5727 // doesn't handle that so rather than warning about unused flags that are
5728 // actually used, we'll lie by omission instead.
5729 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005730 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5731 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005732
David Blaikie9260ed62013-07-25 21:19:01 +00005733 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5734 getToolChain().getDriver());
5735
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005736 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005737
5738 assert(Output.isFilename() && "Unexpected lipo output.");
5739 CmdArgs.push_back("-o");
5740 CmdArgs.push_back(Output.getFilename());
5741
Daniel Dunbarb440f562010-08-02 02:38:21 +00005742 assert(Input.isFilename() && "Invalid input.");
5743 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005744
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005745 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005746 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005747
5748 // Handle the debug info splitting at object creation time if we're
5749 // creating an object.
5750 // TODO: Currently only works on linux with newer objcopy.
5751 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005752 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005753 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005754 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005755}
5756
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005757void GnuTool::anchor() {}
5758
Daniel Dunbara3246a02009-03-18 08:07:30 +00005759void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005760 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005761 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005762 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005763 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005764 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005765
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005766 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005767 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005768 // Don't forward any -g arguments to assembly steps.
5769 if (isa<AssembleJobAction>(JA) &&
5770 A->getOption().matches(options::OPT_g_Group))
5771 continue;
5772
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005773 // Don't forward any -W arguments to assembly and link steps.
5774 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5775 A->getOption().matches(options::OPT_W_Group))
5776 continue;
5777
Daniel Dunbar2da02722009-03-19 07:55:12 +00005778 // It is unfortunate that we have to claim here, as this means
5779 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005780 // platforms using a generic gcc, even if we are just using gcc
5781 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005782 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005783 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005784 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005785 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005786
Daniel Dunbar4e295052010-01-25 22:35:08 +00005787 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005788
5789 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005790 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005791 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005792 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005793 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005794 }
5795
Daniel Dunbar5716d872009-05-02 21:41:52 +00005796 // Try to force gcc to match the tool chain we want, if we recognize
5797 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005798 //
5799 // FIXME: The triple class should directly provide the information we want
5800 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005801 switch (getToolChain().getArch()) {
5802 default:
5803 break;
5804 case llvm::Triple::x86:
5805 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005806 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005807 break;
5808 case llvm::Triple::x86_64:
5809 case llvm::Triple::ppc64:
5810 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005811 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005812 break;
5813 case llvm::Triple::sparcel:
5814 CmdArgs.push_back("-EL");
5815 break;
5816 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005817
Daniel Dunbarb440f562010-08-02 02:38:21 +00005818 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005819 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005820 CmdArgs.push_back(Output.getFilename());
5821 } else {
5822 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005823 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005824 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005825
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005826 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005827
5828 // Only pass -x if gcc will understand it; otherwise hope gcc
5829 // understands the suffix correctly. The main use case this would go
5830 // wrong in is for linker inputs if they happened to have an odd
5831 // suffix; really the only way to get this to happen is a command
5832 // like '-x foobar a.c' which will treat a.c like a linker input.
5833 //
5834 // FIXME: For the linker case specifically, can we safely convert
5835 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005836 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005837 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005838 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5839 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005840 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005841 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005842 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005844 else if (II.getType() == types::TY_ModuleFile)
5845 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005847
Daniel Dunbara3246a02009-03-18 08:07:30 +00005848 if (types::canTypeBeUserSpecified(II.getType())) {
5849 CmdArgs.push_back("-x");
5850 CmdArgs.push_back(types::getTypeName(II.getType()));
5851 }
5852
Daniel Dunbarb440f562010-08-02 02:38:21 +00005853 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005854 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005855 else {
5856 const Arg &A = II.getInputArg();
5857
5858 // Reverse translate some rewritten options.
5859 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5860 CmdArgs.push_back("-lstdc++");
5861 continue;
5862 }
5863
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005864 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005865 A.render(Args, CmdArgs);
5866 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005867 }
5868
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005869 const std::string customGCCName = D.getCCCGenericGCCName();
5870 const char *GCCName;
5871 if (!customGCCName.empty())
5872 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005873 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005874 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005875 } else
5876 GCCName = "gcc";
5877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005879 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005880}
5881
Douglas Katzman95354292015-06-23 20:42:09 +00005882void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5883 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005884 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005885}
5886
Douglas Katzman95354292015-06-23 20:42:09 +00005887void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5888 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005889 const Driver &D = getToolChain().getDriver();
5890
Eric Christophercc7ff502015-01-29 00:56:17 +00005891 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005892 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005893 case types::TY_LLVM_IR:
5894 case types::TY_LTO_IR:
5895 case types::TY_LLVM_BC:
5896 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005897 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005898 break;
5899 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005900 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005901 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005902 case types::TY_Nothing:
5903 CmdArgs.push_back("-fsyntax-only");
5904 break;
5905 default:
5906 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005907 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005908}
5909
Douglas Katzman95354292015-06-23 20:42:09 +00005910void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5911 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005912 // The types are (hopefully) good enough.
5913}
5914
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005916void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5917 ArgStringList &CmdArgs) const {}
5918void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5919 const InputInfo &Output,
5920 const InputInfoList &Inputs,
5921 const ArgList &Args,
5922 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005923 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005924
5925 const Driver &D = getToolChain().getDriver();
5926 ArgStringList CmdArgs;
5927
5928 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005929 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005930 CmdArgs.push_back(Args.MakeArgString(MarchString));
5931
5932 RenderExtraToolArgs(JA, CmdArgs);
5933
5934 if (Output.isFilename()) {
5935 CmdArgs.push_back("-o");
5936 CmdArgs.push_back(Output.getFilename());
5937 } else {
5938 assert(Output.isNothing() && "Unexpected output");
5939 CmdArgs.push_back("-fsyntax-only");
5940 }
5941
Douglas Katzman54366072015-07-27 16:53:08 +00005942 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005943 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005945 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005946
Tony Linthicum76329bf2011-12-12 21:14:55 +00005947 // Only pass -x if gcc will understand it; otherwise hope gcc
5948 // understands the suffix correctly. The main use case this would go
5949 // wrong in is for linker inputs if they happened to have an odd
5950 // suffix; really the only way to get this to happen is a command
5951 // like '-x foobar a.c' which will treat a.c like a linker input.
5952 //
5953 // FIXME: For the linker case specifically, can we safely convert
5954 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005955 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005956 // Don't try to pass LLVM or AST inputs to a generic gcc.
5957 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5958 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5959 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005960 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005961 else if (II.getType() == types::TY_AST)
5962 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005964 else if (II.getType() == types::TY_ModuleFile)
5965 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005967
5968 if (II.isFilename())
5969 CmdArgs.push_back(II.getFilename());
5970 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005971 // Don't render as input, we need gcc to do the translations.
5972 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005973 II.getInputArg().render(Args, CmdArgs);
5974 }
5975
5976 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005977 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005978 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005979}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005980
Douglas Katzman95354292015-06-23 20:42:09 +00005981void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5982 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005983 // The types are (hopefully) good enough.
5984}
5985
Douglas Katzman54366072015-07-27 16:53:08 +00005986static void
5987constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5988 const toolchains::HexagonToolChain &ToolChain,
5989 const InputInfo &Output, const InputInfoList &Inputs,
5990 const ArgList &Args, ArgStringList &CmdArgs,
5991 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005992
Matthew Curtise689b052012-12-06 15:46:07 +00005993 const Driver &D = ToolChain.getDriver();
5994
Matthew Curtise689b052012-12-06 15:46:07 +00005995 //----------------------------------------------------------------------------
5996 //
5997 //----------------------------------------------------------------------------
5998 bool hasStaticArg = Args.hasArg(options::OPT_static);
5999 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006000 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006001 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6002 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6003 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006004 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006005 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006006
Matthew Curtise689b052012-12-06 15:46:07 +00006007 //----------------------------------------------------------------------------
6008 // Silence warnings for various options
6009 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006010
Matthew Curtise689b052012-12-06 15:46:07 +00006011 Args.ClaimAllArgs(options::OPT_g_Group);
6012 Args.ClaimAllArgs(options::OPT_emit_llvm);
6013 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6014 // handled somewhere else.
6015 Args.ClaimAllArgs(options::OPT_static_libgcc);
6016
6017 //----------------------------------------------------------------------------
6018 //
6019 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006020 for (const auto &Opt : ToolChain.ExtraOpts)
6021 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006022
Douglas Katzman54366072015-07-27 16:53:08 +00006023 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006024 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006025
Matthew Curtise689b052012-12-06 15:46:07 +00006026 if (buildingLib) {
6027 CmdArgs.push_back("-shared");
6028 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6029 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006030 }
6031
Matthew Curtise689b052012-12-06 15:46:07 +00006032 if (hasStaticArg)
6033 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006034
Matthew Curtise8f80a12012-12-06 17:49:03 +00006035 if (buildPIE && !buildingLib)
6036 CmdArgs.push_back("-pie");
6037
Douglas Katzman54366072015-07-27 16:53:08 +00006038 if (const char *v =
6039 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006040 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006041 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006042 }
6043
Matthew Curtise689b052012-12-06 15:46:07 +00006044 //----------------------------------------------------------------------------
6045 //
6046 //----------------------------------------------------------------------------
6047 CmdArgs.push_back("-o");
6048 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006049
Matthew Curtise689b052012-12-06 15:46:07 +00006050 const std::string MarchSuffix = "/" + MarchString;
6051 const std::string G0Suffix = "/G0";
6052 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006053 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006054 const std::string StartFilesDir =
6055 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006056
6057 //----------------------------------------------------------------------------
6058 // moslib
6059 //----------------------------------------------------------------------------
6060 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006061 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006062
Sean Silva14facf32015-06-09 01:57:17 +00006063 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6064 A->claim();
6065 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006066 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006067 }
Matthew Curtise689b052012-12-06 15:46:07 +00006068 if (oslibs.empty()) {
6069 oslibs.push_back("standalone");
6070 hasStandalone = true;
6071 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006072
Matthew Curtise689b052012-12-06 15:46:07 +00006073 //----------------------------------------------------------------------------
6074 // Start Files
6075 //----------------------------------------------------------------------------
6076 if (incStdLib && incStartFiles) {
6077
6078 if (!buildingLib) {
6079 if (hasStandalone) {
6080 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006081 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006082 }
6083 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6084 }
6085 std::string initObj = useShared ? "/initS.o" : "/init.o";
6086 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6087 }
6088
6089 //----------------------------------------------------------------------------
6090 // Library Search Paths
6091 //----------------------------------------------------------------------------
6092 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006093 for (const auto &LibPath : LibPaths)
6094 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006095
6096 //----------------------------------------------------------------------------
6097 //
6098 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006099 Args.AddAllArgs(CmdArgs,
6100 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6101 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006102
6103 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6104
6105 //----------------------------------------------------------------------------
6106 // Libraries
6107 //----------------------------------------------------------------------------
6108 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006109 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006110 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6111 CmdArgs.push_back("-lm");
6112 }
6113
6114 CmdArgs.push_back("--start-group");
6115
6116 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006117 for (const std::string &Lib : oslibs)
6118 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006119 CmdArgs.push_back("-lc");
6120 }
6121 CmdArgs.push_back("-lgcc");
6122
6123 CmdArgs.push_back("--end-group");
6124 }
6125
6126 //----------------------------------------------------------------------------
6127 // End files
6128 //----------------------------------------------------------------------------
6129 if (incStdLib && incStartFiles) {
6130 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6131 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6132 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006133}
6134
Douglas Katzman95354292015-06-23 20:42:09 +00006135void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6136 const InputInfo &Output,
6137 const InputInfoList &Inputs,
6138 const ArgList &Args,
6139 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006140
Douglas Katzman54366072015-07-27 16:53:08 +00006141 const toolchains::HexagonToolChain &ToolChain =
6142 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006143
6144 ArgStringList CmdArgs;
6145 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6146 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006147
6148 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006149 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006150 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006151}
6152// Hexagon tools end.
6153
Tom Stellard8fa33092015-07-18 01:49:05 +00006154void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6155 const InputInfo &Output,
6156 const InputInfoList &Inputs,
6157 const ArgList &Args,
6158 const char *LinkingOutput) const {
6159
6160 std::string Linker = getToolChain().GetProgramPath(getShortName());
6161 ArgStringList CmdArgs;
6162 CmdArgs.push_back("-flavor");
6163 CmdArgs.push_back("gnu");
6164 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006165 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006166 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6167 CmdArgs.push_back("-o");
6168 CmdArgs.push_back(Output.getFilename());
6169 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6170 CmdArgs, Inputs));
6171}
6172// AMDGPU tools end.
6173
Renato Golin7c542b42015-07-27 23:44:45 +00006174const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006175 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006176 if (!Arch.empty())
6177 MArch = Arch;
6178 else
Bernard Ogden31561762013-12-12 13:27:11 +00006179 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006180 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006181
6182 // Handle -march=native.
6183 if (MArch == "native") {
6184 std::string CPU = llvm::sys::getHostCPUName();
6185 if (CPU != "generic") {
6186 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006187 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006188 // If there is no valid architecture suffix for this CPU we don't know how
6189 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006190 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006191 MArch = "";
6192 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006193 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006194 }
6195 }
6196
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006197 return MArch;
6198}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006199
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006200/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006201StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006202 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006203 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6204 // here means an -march=native that we can't handle, so instead return no CPU.
6205 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006206 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006207
John Brawna95c1a82015-05-08 12:52:18 +00006208 // We need to return an empty string here on invalid MArch values as the
6209 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006210 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006211}
6212
6213/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006214std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006215 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006216 // FIXME: Warn on inconsistent use of -mcpu and -march.
6217 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006218 if (!CPU.empty()) {
6219 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006220 // Handle -mcpu=native.
6221 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006222 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006223 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006224 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006225 }
6226
Renato Goline17c5802015-07-27 23:44:42 +00006227 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006228}
6229
6230/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006231/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006232// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006233StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6234 const llvm::Triple &Triple) {
6235 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006236 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006237 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006238 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006239 if (ArchKind == llvm::ARM::AK_INVALID)
6240 // In case of generic Arch, i.e. "arm",
6241 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006242 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006243 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006244 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6245 // armv7k triple if it's actually been specified via "-arch armv7k".
6246 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006247 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006248 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006249 }
Renato Golin3c007252015-05-28 15:05:53 +00006250 if (ArchKind == llvm::ARM::AK_INVALID)
6251 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006252 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006253}
6254
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006255void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006256 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006257 if (Args.hasArg(options::OPT_r))
6258 return;
6259
John Brawn94fd9632015-05-21 12:19:49 +00006260 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6261 // to generate BE-8 executables.
6262 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6263 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006264}
6265
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006266mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006267 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6268 // was first introduced in Release 3. However, other compilers have
6269 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006270 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6271 .Case("mips1", NanLegacy)
6272 .Case("mips2", NanLegacy)
6273 .Case("mips3", NanLegacy)
6274 .Case("mips4", NanLegacy)
6275 .Case("mips5", NanLegacy)
6276 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006277 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006278 .Case("mips32r3", NanLegacy | Nan2008)
6279 .Case("mips32r5", NanLegacy | Nan2008)
6280 .Case("mips32r6", Nan2008)
6281 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006282 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006283 .Case("mips64r3", NanLegacy | Nan2008)
6284 .Case("mips64r5", NanLegacy | Nan2008)
6285 .Case("mips64r6", Nan2008)
6286 .Default(NanLegacy);
6287}
6288
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006289bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6290 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6291 return A && (A->getValue() == StringRef(Value));
6292}
6293
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006294bool mips::isUCLibc(const ArgList &Args) {
6295 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006296 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006297}
6298
Daniel Sanders2bf13662014-07-10 14:40:57 +00006299bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006300 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6301 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006302 .Case("2008", true)
6303 .Case("legacy", false)
6304 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006305
6306 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006307 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006308 .Cases("mips32r6", "mips64r6", true)
6309 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006310
6311 return false;
6312}
6313
Daniel Sanders379d44b2014-07-16 11:52:23 +00006314bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006315 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006316 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006317 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006318 return false;
6319
6320 if (ABIName != "32")
6321 return false;
6322
Toma Tabacu94ea6862015-06-16 13:54:13 +00006323 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6324 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006325 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006326 return false;
6327
Daniel Sanders379d44b2014-07-16 11:52:23 +00006328 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006329 .Cases("mips2", "mips3", "mips4", "mips5", true)
6330 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6331 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6332 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006333}
6334
Toma Tabacu94ea6862015-06-16 13:54:13 +00006335bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6336 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006337 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006338 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6339
6340 // FPXX shouldn't be used if -msingle-float is present.
6341 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6342 options::OPT_mdouble_float))
6343 if (A->getOption().matches(options::OPT_msingle_float))
6344 UseFPXX = false;
6345
6346 return UseFPXX;
6347}
6348
Tim Northover157d9112014-01-16 08:48:16 +00006349llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006350 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6351 // archs which Darwin doesn't use.
6352
6353 // The matching this routine does is fairly pointless, since it is neither the
6354 // complete architecture list, nor a reasonable subset. The problem is that
6355 // historically the driver driver accepts this and also ties its -march=
6356 // handling to the architecture name, so we need to be careful before removing
6357 // support for it.
6358
6359 // This code must be kept in sync with Clang's Darwin specific argument
6360 // translation.
6361
6362 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006363 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6364 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6365 .Case("ppc64", llvm::Triple::ppc64)
6366 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6367 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6368 llvm::Triple::x86)
6369 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6370 // This is derived from the driver driver.
6371 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6372 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6373 .Cases("armv7s", "xscale", llvm::Triple::arm)
6374 .Case("arm64", llvm::Triple::aarch64)
6375 .Case("r600", llvm::Triple::r600)
6376 .Case("amdgcn", llvm::Triple::amdgcn)
6377 .Case("nvptx", llvm::Triple::nvptx)
6378 .Case("nvptx64", llvm::Triple::nvptx64)
6379 .Case("amdil", llvm::Triple::amdil)
6380 .Case("spir", llvm::Triple::spir)
6381 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006382}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006383
Tim Northover157d9112014-01-16 08:48:16 +00006384void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006385 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006386 T.setArch(Arch);
6387
6388 if (Str == "x86_64h")
6389 T.setArchName(Str);
6390 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6391 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006392 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006393 }
6394}
6395
Bob Wilsondecc03e2012-11-23 06:14:39 +00006396const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006397 const InputInfo &Input) {
6398 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006399}
6400
Bob Wilsondecc03e2012-11-23 06:14:39 +00006401const char *Clang::getBaseInputStem(const ArgList &Args,
6402 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006403 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006404
Chris Lattner906bb902011-01-16 08:14:11 +00006405 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006406 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006407
6408 return Str;
6409}
6410
Bob Wilsondecc03e2012-11-23 06:14:39 +00006411const char *Clang::getDependencyFileName(const ArgList &Args,
6412 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006413 // FIXME: Think about this more.
6414 std::string Res;
6415
6416 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006417 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006418 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006419 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006420 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006421 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006422 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006423}
6424
Douglas Katzman95354292015-06-23 20:42:09 +00006425void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6426 const InputInfo &Output,
6427 const InputInfoList &Inputs,
6428 const ArgList &Args,
6429 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006430 const ToolChain &ToolChain = getToolChain();
6431 const Driver &D = ToolChain.getDriver();
6432 ArgStringList CmdArgs;
6433
6434 // Silence warning for "clang -g foo.o -o foo"
6435 Args.ClaimAllArgs(options::OPT_g_Group);
6436 // and "clang -emit-llvm foo.o -o foo"
6437 Args.ClaimAllArgs(options::OPT_emit_llvm);
6438 // and for "clang -w foo.o -o foo". Other warning options are already
6439 // handled somewhere else.
6440 Args.ClaimAllArgs(options::OPT_w);
6441
6442 if (!D.SysRoot.empty())
6443 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6444
6445 // CloudABI only supports static linkage.
6446 CmdArgs.push_back("-Bstatic");
6447 CmdArgs.push_back("--eh-frame-hdr");
6448 CmdArgs.push_back("--gc-sections");
6449
6450 if (Output.isFilename()) {
6451 CmdArgs.push_back("-o");
6452 CmdArgs.push_back(Output.getFilename());
6453 } else {
6454 assert(Output.isNothing() && "Invalid output.");
6455 }
6456
6457 if (!Args.hasArg(options::OPT_nostdlib) &&
6458 !Args.hasArg(options::OPT_nostartfiles)) {
6459 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6460 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6461 }
6462
6463 Args.AddAllArgs(CmdArgs, options::OPT_L);
6464 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6465 for (const auto &Path : Paths)
6466 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006467 Args.AddAllArgs(CmdArgs,
6468 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6469 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006470
Teresa Johnson945bc502015-10-15 20:35:53 +00006471 if (D.isUsingLTO())
6472 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006473
6474 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6475
6476 if (!Args.hasArg(options::OPT_nostdlib) &&
6477 !Args.hasArg(options::OPT_nodefaultlibs)) {
6478 if (D.CCCIsCXX())
6479 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6480 CmdArgs.push_back("-lc");
6481 CmdArgs.push_back("-lcompiler_rt");
6482 }
6483
6484 if (!Args.hasArg(options::OPT_nostdlib) &&
6485 !Args.hasArg(options::OPT_nostartfiles))
6486 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6487
6488 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006489 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006490}
6491
Douglas Katzman95354292015-06-23 20:42:09 +00006492void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6493 const InputInfo &Output,
6494 const InputInfoList &Inputs,
6495 const ArgList &Args,
6496 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006497 ArgStringList CmdArgs;
6498
6499 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6500 const InputInfo &Input = Inputs[0];
6501
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006502 // Determine the original source input.
6503 const Action *SourceAction = &JA;
6504 while (SourceAction->getKind() != Action::InputClass) {
6505 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6506 SourceAction = SourceAction->getInputs()[0];
6507 }
6508
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006509 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006510 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006511 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6512 // FIXME: at run-time detect assembler capabilities or rely on version
6513 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006514 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006515 const llvm::Triple &T(getToolChain().getTriple());
6516 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006517 CmdArgs.push_back("-Q");
6518 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006519
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006520 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006521 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006522 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006523 if (Args.hasArg(options::OPT_gstabs))
6524 CmdArgs.push_back("--gstabs");
6525 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006526 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006527 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006528
Daniel Dunbarbe220842009-03-20 16:06:39 +00006529 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006530 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006531
Daniel Dunbar6d484762010-07-22 01:47:22 +00006532 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006533 if (getToolChain().getArch() == llvm::Triple::x86 ||
6534 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006535 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6536 CmdArgs.push_back("-force_cpusubtype_ALL");
6537
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006538 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006539 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006540 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006541 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006542 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006543 CmdArgs.push_back("-static");
6544
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006546
6547 assert(Output.isFilename() && "Unexpected lipo output.");
6548 CmdArgs.push_back("-o");
6549 CmdArgs.push_back(Output.getFilename());
6550
Daniel Dunbarb440f562010-08-02 02:38:21 +00006551 assert(Input.isFilename() && "Invalid input.");
6552 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006553
6554 // asm_final spec is empty.
6555
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006556 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006557 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006558}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006559
Tim Northover157d9112014-01-16 08:48:16 +00006560void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006561
Tim Northover157d9112014-01-16 08:48:16 +00006562void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6563 ArgStringList &CmdArgs) const {
6564 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006565
Daniel Dunbarc1964212009-03-26 16:23:12 +00006566 // Derived from darwin_arch spec.
6567 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006568 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006569
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006570 // FIXME: Is this needed anymore?
6571 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006572 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006573}
6574
Douglas Katzman95354292015-06-23 20:42:09 +00006575bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006576 // We only need to generate a temp path for LTO if we aren't compiling object
6577 // files. When compiling source files, we run 'dsymutil' after linking. We
6578 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006579 for (const auto &Input : Inputs)
6580 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006581 return true;
6582
6583 return false;
6584}
6585
Douglas Katzman95354292015-06-23 20:42:09 +00006586void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6587 ArgStringList &CmdArgs,
6588 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006589 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006590 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006592 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006593 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6594 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006595 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6596 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006597 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006598 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006599 }
6600
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006601 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006602 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006603 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6604 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006605
Bob Wilson3d27dad2013-08-02 22:25:34 +00006606 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6607 CmdArgs.push_back("-export_dynamic");
6608
Bob Wilsonb111ec92015-03-02 19:01:14 +00006609 // If we are using App Extension restrictions, pass a flag to the linker
6610 // telling it that the compiled code has been audited.
6611 if (Args.hasFlag(options::OPT_fapplication_extension,
6612 options::OPT_fno_application_extension, false))
6613 CmdArgs.push_back("-application_extension");
6614
Teresa Johnson945bc502015-10-15 20:35:53 +00006615 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006616 // If we are using LTO, then automatically create a temporary file path for
6617 // the linker to use, so that it's lifetime will extend past a possible
6618 // dsymutil step.
6619 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6620 const char *TmpPath = C.getArgs().MakeArgString(
6621 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6622 C.addTempFile(TmpPath);
6623 CmdArgs.push_back("-object_path_lto");
6624 CmdArgs.push_back(TmpPath);
6625 }
6626
6627 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6628 // it in clang installed libraries. If not found, the option is not used
6629 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6630 if (Version[0] >= 133) {
6631 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6632 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6633 SmallString<128> LibLTOPath(P);
6634 llvm::sys::path::append(LibLTOPath, "lib");
6635 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6636 if (llvm::sys::fs::exists(LibLTOPath)) {
6637 CmdArgs.push_back("-lto_library");
6638 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6639 } else {
6640 D.Diag(diag::warn_drv_lto_libpath);
6641 }
6642 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006643 }
6644
Daniel Dunbarc1964212009-03-26 16:23:12 +00006645 // Derived from the "link" spec.
6646 Args.AddAllArgs(CmdArgs, options::OPT_static);
6647 if (!Args.hasArg(options::OPT_static))
6648 CmdArgs.push_back("-dynamic");
6649 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6650 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6651 // here. How do we wish to handle such things?
6652 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006653
Daniel Dunbarc1964212009-03-26 16:23:12 +00006654 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006655 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006656 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006657 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006658
6659 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6660 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6661 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6662
6663 Arg *A;
6664 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6665 (A = Args.getLastArg(options::OPT_current__version)) ||
6666 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006667 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6668 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006669
6670 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6671 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6672 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6673 } else {
6674 CmdArgs.push_back("-dylib");
6675
6676 Arg *A;
6677 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6678 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6679 (A = Args.getLastArg(options::OPT_client__name)) ||
6680 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6681 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6682 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006683 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6684 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006685
Daniel Dunbarc1964212009-03-26 16:23:12 +00006686 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6687 "-dylib_compatibility_version");
6688 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6689 "-dylib_current_version");
6690
Tim Northover157d9112014-01-16 08:48:16 +00006691 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006692
6693 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6694 "-dylib_install_name");
6695 }
6696
6697 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6698 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6699 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006700 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006701 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006702 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6703 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6704 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6705 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6706 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6707 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006708 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006709 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6710 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6711 Args.AddAllArgs(CmdArgs, options::OPT_init);
6712
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006713 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006714 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006715
Daniel Dunbarc1964212009-03-26 16:23:12 +00006716 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6717 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6718 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6719 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6720 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006721
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006722 if (const Arg *A =
6723 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6724 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006725 if (A->getOption().matches(options::OPT_fpie) ||
6726 A->getOption().matches(options::OPT_fPIE))
6727 CmdArgs.push_back("-pie");
6728 else
6729 CmdArgs.push_back("-no_pie");
6730 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006731
6732 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6733 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6734 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6735 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6736 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6737 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6738 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6739 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6740 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6741 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6742 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6743 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6744 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6745 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6746 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6747 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006748
Daniel Dunbar84384642011-05-02 21:03:47 +00006749 // Give --sysroot= preference, over the Apple specific behavior to also use
6750 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006751 StringRef sysroot = C.getSysRoot();
6752 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006753 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006754 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006755 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6756 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006757 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006758 }
6759
Daniel Dunbarc1964212009-03-26 16:23:12 +00006760 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6761 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6762 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6763 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6764 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006765 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006766 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6767 Args.AddAllArgs(CmdArgs, options::OPT_y);
6768 Args.AddLastArg(CmdArgs, options::OPT_w);
6769 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6770 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6771 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6772 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6773 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6774 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6775 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6776 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6777 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6778 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6779 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6780 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6781}
6782
Douglas Katzman95354292015-06-23 20:42:09 +00006783void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6784 const InputInfo &Output,
6785 const InputInfoList &Inputs,
6786 const ArgList &Args,
6787 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006788 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006789
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006790 // If the number of arguments surpasses the system limits, we will encode the
6791 // input files in a separate file, shortening the command line. To this end,
6792 // build a list of input file names that can be passed via a file with the
6793 // -filelist linker option.
6794 llvm::opt::ArgStringList InputFileList;
6795
Daniel Dunbarc1964212009-03-26 16:23:12 +00006796 // The logic here is derived from gcc's behavior; most of which
6797 // comes from specs (starting with link_command). Consult gcc for
6798 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006799 ArgStringList CmdArgs;
6800
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006801 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6802 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6803 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006804 for (const auto &Arg : Args)
6805 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006806 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006807 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006808 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006809 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006810 return;
6811 }
6812
Daniel Dunbarc1964212009-03-26 16:23:12 +00006813 // I'm not sure why this particular decomposition exists in gcc, but
6814 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006815 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006816
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006817 // It seems that the 'e' option is completely ignored for dynamic executables
6818 // (the default), and with static executables, the last one wins, as expected.
6819 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6820 options::OPT_Z_Flag, options::OPT_u_Group,
6821 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006822
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006823 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6824 // members of static archive libraries which implement Objective-C classes or
6825 // categories.
6826 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6827 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006828
Daniel Dunbarc1964212009-03-26 16:23:12 +00006829 CmdArgs.push_back("-o");
6830 CmdArgs.push_back(Output.getFilename());
6831
Chad Rosier06fd3c62012-05-16 23:45:12 +00006832 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006833 !Args.hasArg(options::OPT_nostartfiles))
6834 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006835
Peter Collingbournec4122c12015-06-15 21:08:13 +00006836 // SafeStack requires its own runtime libraries
6837 // These libraries should be linked first, to make sure the
6838 // __safestack_init constructor executes before everything else
6839 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6840 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6841 "libclang_rt.safestack_osx.a",
6842 /*AlwaysLink=*/true);
6843 }
6844
Daniel Dunbarc1964212009-03-26 16:23:12 +00006845 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006846
Douglas Gregor9295df02012-05-15 21:00:27 +00006847 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006848 // Build the input file for -filelist (list of linker input files) in case we
6849 // need it later
6850 for (const auto &II : Inputs) {
6851 if (!II.isFilename()) {
6852 // This is a linker input argument.
6853 // We cannot mix input arguments and file names in a -filelist input, thus
6854 // we prematurely stop our list (remaining files shall be passed as
6855 // arguments).
6856 if (InputFileList.size() > 0)
6857 break;
6858
6859 continue;
6860 }
6861
6862 InputFileList.push_back(II.getFilename());
6863 }
6864
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006865 if (!Args.hasArg(options::OPT_nostdlib) &&
6866 !Args.hasArg(options::OPT_nodefaultlibs))
6867 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006869 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006870 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006871 // We use arclite library for both ARC and subscripting support.
6872 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6873
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006874 CmdArgs.push_back("-framework");
6875 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006876 // Link libobj.
6877 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006878 }
John McCall31168b02011-06-15 23:02:42 +00006879
Daniel Dunbarc1964212009-03-26 16:23:12 +00006880 if (LinkingOutput) {
6881 CmdArgs.push_back("-arch_multiple");
6882 CmdArgs.push_back("-final_output");
6883 CmdArgs.push_back(LinkingOutput);
6884 }
6885
Daniel Dunbarc1964212009-03-26 16:23:12 +00006886 if (Args.hasArg(options::OPT_fnested_functions))
6887 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006888
Justin Bognerc7701242015-05-12 05:44:36 +00006889 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6890
Daniel Dunbarc1964212009-03-26 16:23:12 +00006891 if (!Args.hasArg(options::OPT_nostdlib) &&
6892 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006893 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006894 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006895
Daniel Dunbarc1964212009-03-26 16:23:12 +00006896 // link_ssp spec is empty.
6897
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006898 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006899 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006900 }
6901
Chad Rosier06fd3c62012-05-16 23:45:12 +00006902 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006903 !Args.hasArg(options::OPT_nostartfiles)) {
6904 // endfile_spec is empty.
6905 }
6906
6907 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6908 Args.AddAllArgs(CmdArgs, options::OPT_F);
6909
Steven Wu3ffb61b2015-02-06 18:08:29 +00006910 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006911 for (const Arg *A : Args.filtered(options::OPT_iframework))
6912 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006913
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006914 if (!Args.hasArg(options::OPT_nostdlib) &&
6915 !Args.hasArg(options::OPT_nodefaultlibs)) {
6916 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6917 if (A->getValue() == StringRef("Accelerate")) {
6918 CmdArgs.push_back("-framework");
6919 CmdArgs.push_back("Accelerate");
6920 }
6921 }
6922 }
6923
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006924 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006925 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006926 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006927 Cmd->setInputFileList(std::move(InputFileList));
6928 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006929}
6930
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006931void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006932 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006933 const InputInfoList &Inputs,
6934 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006935 const char *LinkingOutput) const {
6936 ArgStringList CmdArgs;
6937
6938 CmdArgs.push_back("-create");
6939 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006940
6941 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006942 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006943
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006944 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006945 assert(II.isFilename() && "Unexpected lipo input.");
6946 CmdArgs.push_back(II.getFilename());
6947 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006948
6949 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006950 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006951}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006952
Daniel Dunbar88299622010-06-04 18:28:36 +00006953void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006954 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006955 const InputInfoList &Inputs,
6956 const ArgList &Args,
6957 const char *LinkingOutput) const {
6958 ArgStringList CmdArgs;
6959
Daniel Dunbareb86b042011-05-09 17:23:16 +00006960 CmdArgs.push_back("-o");
6961 CmdArgs.push_back(Output.getFilename());
6962
Daniel Dunbar88299622010-06-04 18:28:36 +00006963 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6964 const InputInfo &Input = Inputs[0];
6965 assert(Input.isFilename() && "Unexpected dsymutil input.");
6966 CmdArgs.push_back(Input.getFilename());
6967
Daniel Dunbar88299622010-06-04 18:28:36 +00006968 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006969 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006970 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006971}
6972
Eric Christopher551ef452011-08-23 17:56:55 +00006973void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006974 const InputInfo &Output,
6975 const InputInfoList &Inputs,
6976 const ArgList &Args,
6977 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006978 ArgStringList CmdArgs;
6979 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006980 CmdArgs.push_back("--debug-info");
6981 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006982 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006983
6984 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6985 const InputInfo &Input = Inputs[0];
6986 assert(Input.isFilename() && "Unexpected verify input");
6987
6988 // Grabbing the output of the earlier dsymutil run.
6989 CmdArgs.push_back(Input.getFilename());
6990
6991 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006992 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006993 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006994}
6995
Douglas Katzman95354292015-06-23 20:42:09 +00006996void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006997 const InputInfo &Output,
6998 const InputInfoList &Inputs,
6999 const ArgList &Args,
7000 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007001 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007002 ArgStringList CmdArgs;
7003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007004 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007005
7006 CmdArgs.push_back("-o");
7007 CmdArgs.push_back(Output.getFilename());
7008
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007009 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007010 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007011
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007012 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007013 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007014}
7015
Douglas Katzman95354292015-06-23 20:42:09 +00007016void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7017 const InputInfo &Output,
7018 const InputInfoList &Inputs,
7019 const ArgList &Args,
7020 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007021 ArgStringList CmdArgs;
7022
David Chisnall272a0712012-02-29 15:06:12 +00007023 // Demangle C++ names in errors
7024 CmdArgs.push_back("-C");
7025
David Chisnallf571cde2012-02-15 13:39:01 +00007026 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7027 (!Args.hasArg(options::OPT_shared))) {
7028 CmdArgs.push_back("-e");
7029 CmdArgs.push_back("_start");
7030 }
7031
7032 if (Args.hasArg(options::OPT_static)) {
7033 CmdArgs.push_back("-Bstatic");
7034 CmdArgs.push_back("-dn");
7035 } else {
7036 CmdArgs.push_back("-Bdynamic");
7037 if (Args.hasArg(options::OPT_shared)) {
7038 CmdArgs.push_back("-shared");
7039 } else {
7040 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007041 CmdArgs.push_back(
7042 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007043 }
7044 }
7045
7046 if (Output.isFilename()) {
7047 CmdArgs.push_back("-o");
7048 CmdArgs.push_back(Output.getFilename());
7049 } else {
7050 assert(Output.isNothing() && "Invalid output.");
7051 }
7052
7053 if (!Args.hasArg(options::OPT_nostdlib) &&
7054 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007055 if (!Args.hasArg(options::OPT_shared))
7056 CmdArgs.push_back(
7057 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7058
7059 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7060 CmdArgs.push_back(
7061 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7062 CmdArgs.push_back(
7063 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007064 }
7065
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007066 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
7067 for (const auto &Path : Paths)
7068 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00007069
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007070 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7071 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007072
7073 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7074
7075 if (!Args.hasArg(options::OPT_nostdlib) &&
7076 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007077 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007078 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007079 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007080 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007081 if (!Args.hasArg(options::OPT_shared)) {
7082 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007083 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007084 }
David Chisnallf571cde2012-02-15 13:39:01 +00007085 }
7086
7087 if (!Args.hasArg(options::OPT_nostdlib) &&
7088 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007089 CmdArgs.push_back(
7090 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007091 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007092 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007093
Xinliang David Li69306c02015-10-22 06:15:31 +00007094 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007095
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007097 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007098}
7099
Douglas Katzman95354292015-06-23 20:42:09 +00007100void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7101 const InputInfo &Output,
7102 const InputInfoList &Inputs,
7103 const ArgList &Args,
7104 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007105 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007106 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007107 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007108
Rafael Espindolacc126272014-02-28 01:55:21 +00007109 switch (getToolChain().getArch()) {
7110 case llvm::Triple::x86:
7111 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7112 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007113 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007114 break;
7115
7116 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007117 CmdArgs.push_back("-mppc");
7118 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007119 break;
7120
7121 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007122 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007123 CmdArgs.push_back("-32");
7124 NeedsKPIC = true;
7125 break;
7126
7127 case llvm::Triple::sparcv9:
7128 CmdArgs.push_back("-64");
7129 CmdArgs.push_back("-Av9a");
7130 NeedsKPIC = true;
7131 break;
7132
7133 case llvm::Triple::mips64:
7134 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007135 StringRef CPUName;
7136 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007137 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007138
7139 CmdArgs.push_back("-mabi");
7140 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7141
7142 if (getToolChain().getArch() == llvm::Triple::mips64)
7143 CmdArgs.push_back("-EB");
7144 else
7145 CmdArgs.push_back("-EL");
7146
Rafael Espindolacc126272014-02-28 01:55:21 +00007147 NeedsKPIC = true;
7148 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007149 }
7150
Rafael Espindolacc126272014-02-28 01:55:21 +00007151 default:
7152 break;
7153 }
7154
7155 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007156 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007157
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007158 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007159
7160 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007161 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007162
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007163 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007164 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007166 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007167 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007168}
7169
Douglas Katzman95354292015-06-23 20:42:09 +00007170void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7171 const InputInfo &Output,
7172 const InputInfoList &Inputs,
7173 const ArgList &Args,
7174 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007175 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007176 ArgStringList CmdArgs;
7177
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007178 // Silence warning for "clang -g foo.o -o foo"
7179 Args.ClaimAllArgs(options::OPT_g_Group);
7180 // and "clang -emit-llvm foo.o -o foo"
7181 Args.ClaimAllArgs(options::OPT_emit_llvm);
7182 // and for "clang -w foo.o -o foo". Other warning options are already
7183 // handled somewhere else.
7184 Args.ClaimAllArgs(options::OPT_w);
7185
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007186 if (getToolChain().getArch() == llvm::Triple::mips64)
7187 CmdArgs.push_back("-EB");
7188 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7189 CmdArgs.push_back("-EL");
7190
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007191 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007192 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007193 CmdArgs.push_back("-e");
7194 CmdArgs.push_back("__start");
7195 }
7196
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007197 if (Args.hasArg(options::OPT_static)) {
7198 CmdArgs.push_back("-Bstatic");
7199 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007200 if (Args.hasArg(options::OPT_rdynamic))
7201 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007202 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007203 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007204 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007205 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007206 } else {
7207 CmdArgs.push_back("-dynamic-linker");
7208 CmdArgs.push_back("/usr/libexec/ld.so");
7209 }
7210 }
7211
Rafael Espindola044f7832013-06-05 04:28:55 +00007212 if (Args.hasArg(options::OPT_nopie))
7213 CmdArgs.push_back("-nopie");
7214
Daniel Dunbarb440f562010-08-02 02:38:21 +00007215 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007216 CmdArgs.push_back("-o");
7217 CmdArgs.push_back(Output.getFilename());
7218 } else {
7219 assert(Output.isNothing() && "Invalid output.");
7220 }
7221
7222 if (!Args.hasArg(options::OPT_nostdlib) &&
7223 !Args.hasArg(options::OPT_nostartfiles)) {
7224 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007225 if (Args.hasArg(options::OPT_pg))
7226 CmdArgs.push_back(
7227 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007228 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007229 CmdArgs.push_back(
7230 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7231 CmdArgs.push_back(
7232 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007233 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007234 CmdArgs.push_back(
7235 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007236 }
7237 }
7238
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007239 std::string Triple = getToolChain().getTripleString();
7240 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007241 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007242 CmdArgs.push_back(
7243 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007244
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007245 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7246 options::OPT_e, options::OPT_s, options::OPT_t,
7247 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007248
Daniel Dunbar54423b22010-09-17 00:24:54 +00007249 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007250
7251 if (!Args.hasArg(options::OPT_nostdlib) &&
7252 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007253 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007254 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007255 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007256 CmdArgs.push_back("-lm_p");
7257 else
7258 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007259 }
7260
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007261 // FIXME: For some reason GCC passes -lgcc before adding
7262 // the default system libraries. Just mimic this for now.
7263 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007264
Eric Christopher17674ec2012-09-13 06:32:34 +00007265 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007266 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7267 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007268 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007269 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007270 }
7271
Chandler Carruth45661652011-12-17 22:32:42 +00007272 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007273 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007274 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007275 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007276 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007277 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007278
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007279 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007280 }
7281
7282 if (!Args.hasArg(options::OPT_nostdlib) &&
7283 !Args.hasArg(options::OPT_nostartfiles)) {
7284 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007285 CmdArgs.push_back(
7286 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007287 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007288 CmdArgs.push_back(
7289 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007290 }
7291
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007292 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007293 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007294}
Ed Schoutene33194b2009-04-02 19:13:12 +00007295
Douglas Katzman95354292015-06-23 20:42:09 +00007296void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7297 const InputInfo &Output,
7298 const InputInfoList &Inputs,
7299 const ArgList &Args,
7300 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007301 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007302 ArgStringList CmdArgs;
7303
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007304 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007305
7306 CmdArgs.push_back("-o");
7307 CmdArgs.push_back(Output.getFilename());
7308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007309 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007310 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007312 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007314}
7315
Douglas Katzman95354292015-06-23 20:42:09 +00007316void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7317 const InputInfo &Output,
7318 const InputInfoList &Inputs,
7319 const ArgList &Args,
7320 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007321 const Driver &D = getToolChain().getDriver();
7322 ArgStringList CmdArgs;
7323
7324 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7325 (!Args.hasArg(options::OPT_shared))) {
7326 CmdArgs.push_back("-e");
7327 CmdArgs.push_back("__start");
7328 }
7329
7330 if (Args.hasArg(options::OPT_static)) {
7331 CmdArgs.push_back("-Bstatic");
7332 } else {
7333 if (Args.hasArg(options::OPT_rdynamic))
7334 CmdArgs.push_back("-export-dynamic");
7335 CmdArgs.push_back("--eh-frame-hdr");
7336 CmdArgs.push_back("-Bdynamic");
7337 if (Args.hasArg(options::OPT_shared)) {
7338 CmdArgs.push_back("-shared");
7339 } else {
7340 CmdArgs.push_back("-dynamic-linker");
7341 CmdArgs.push_back("/usr/libexec/ld.so");
7342 }
7343 }
7344
7345 if (Output.isFilename()) {
7346 CmdArgs.push_back("-o");
7347 CmdArgs.push_back(Output.getFilename());
7348 } else {
7349 assert(Output.isNothing() && "Invalid output.");
7350 }
7351
7352 if (!Args.hasArg(options::OPT_nostdlib) &&
7353 !Args.hasArg(options::OPT_nostartfiles)) {
7354 if (!Args.hasArg(options::OPT_shared)) {
7355 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007356 CmdArgs.push_back(
7357 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007358 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007359 CmdArgs.push_back(
7360 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7361 CmdArgs.push_back(
7362 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007363 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007364 CmdArgs.push_back(
7365 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007366 }
7367 }
7368
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007369 Args.AddAllArgs(CmdArgs,
7370 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007371
7372 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7373
7374 if (!Args.hasArg(options::OPT_nostdlib) &&
7375 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007376 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007377 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7378 if (Args.hasArg(options::OPT_pg))
7379 CmdArgs.push_back("-lm_p");
7380 else
7381 CmdArgs.push_back("-lm");
7382 }
7383
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007384 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007385 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007386 CmdArgs.push_back("-lpthread_p");
7387 else
7388 CmdArgs.push_back("-lpthread");
7389 }
7390
Eli Friedman9fa28852012-08-08 23:57:20 +00007391 if (!Args.hasArg(options::OPT_shared)) {
7392 if (Args.hasArg(options::OPT_pg))
7393 CmdArgs.push_back("-lc_p");
7394 else
7395 CmdArgs.push_back("-lc");
7396 }
7397
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007398 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007399 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007400 case llvm::Triple::arm:
7401 MyArch = "arm";
7402 break;
7403 case llvm::Triple::x86:
7404 MyArch = "i386";
7405 break;
7406 case llvm::Triple::x86_64:
7407 MyArch = "amd64";
7408 break;
7409 default:
7410 llvm_unreachable("Unsupported architecture");
7411 }
7412 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007413 }
7414
7415 if (!Args.hasArg(options::OPT_nostdlib) &&
7416 !Args.hasArg(options::OPT_nostartfiles)) {
7417 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007418 CmdArgs.push_back(
7419 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007420 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007421 CmdArgs.push_back(
7422 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007423 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007424
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007425 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007426 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007427}
7428
Douglas Katzman95354292015-06-23 20:42:09 +00007429void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7430 const InputInfo &Output,
7431 const InputInfoList &Inputs,
7432 const ArgList &Args,
7433 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007434 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007435 ArgStringList CmdArgs;
7436
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007437 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7438 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007439 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007440 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007441 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007442 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007443 else if (getToolChain().getArch() == llvm::Triple::mips ||
7444 getToolChain().getArch() == llvm::Triple::mipsel ||
7445 getToolChain().getArch() == llvm::Triple::mips64 ||
7446 getToolChain().getArch() == llvm::Triple::mips64el) {
7447 StringRef CPUName;
7448 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007449 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007450
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007451 CmdArgs.push_back("-march");
7452 CmdArgs.push_back(CPUName.data());
7453
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007454 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007455 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007456
7457 if (getToolChain().getArch() == llvm::Triple::mips ||
7458 getToolChain().getArch() == llvm::Triple::mips64)
7459 CmdArgs.push_back("-EB");
7460 else
7461 CmdArgs.push_back("-EL");
7462
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007463 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007464 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007465 getToolChain().getArch() == llvm::Triple::armeb ||
7466 getToolChain().getArch() == llvm::Triple::thumb ||
7467 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007468 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007469
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007470 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007471 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007472 else
Renato Golinf4421f72014-02-19 10:44:07 +00007473 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007475 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007476 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007477 case llvm::Triple::GNUEABI:
7478 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007479 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007480 break;
7481
7482 default:
7483 CmdArgs.push_back("-matpcs");
7484 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007485 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007486 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007487 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007488 if (getToolChain().getArch() == llvm::Triple::sparc)
7489 CmdArgs.push_back("-Av8plusa");
7490 else
7491 CmdArgs.push_back("-Av9a");
7492
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007493 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007494 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007495
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007496 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007497
7498 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007499 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007501 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007502 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007505 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007506}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007507
Douglas Katzman95354292015-06-23 20:42:09 +00007508void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7509 const InputInfo &Output,
7510 const InputInfoList &Inputs,
7511 const ArgList &Args,
7512 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007513 const toolchains::FreeBSD &ToolChain =
7514 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007515 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007516 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007517 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007518 !Args.hasArg(options::OPT_shared) &&
7519 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007520 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007521
7522 // Silence warning for "clang -g foo.o -o foo"
7523 Args.ClaimAllArgs(options::OPT_g_Group);
7524 // and "clang -emit-llvm foo.o -o foo"
7525 Args.ClaimAllArgs(options::OPT_emit_llvm);
7526 // and for "clang -w foo.o -o foo". Other warning options are already
7527 // handled somewhere else.
7528 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007529
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007530 if (!D.SysRoot.empty())
7531 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7532
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007533 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007534 CmdArgs.push_back("-pie");
7535
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007536 if (Args.hasArg(options::OPT_static)) {
7537 CmdArgs.push_back("-Bstatic");
7538 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007539 if (Args.hasArg(options::OPT_rdynamic))
7540 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007541 CmdArgs.push_back("--eh-frame-hdr");
7542 if (Args.hasArg(options::OPT_shared)) {
7543 CmdArgs.push_back("-Bshareable");
7544 } else {
7545 CmdArgs.push_back("-dynamic-linker");
7546 CmdArgs.push_back("/libexec/ld-elf.so.1");
7547 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007548 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007549 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7550 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7551 CmdArgs.push_back("--hash-style=both");
7552 }
7553 }
7554 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007555 }
7556
7557 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7558 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007559 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007560 CmdArgs.push_back("-m");
7561 CmdArgs.push_back("elf_i386_fbsd");
7562 }
7563
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007564 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007565 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007566 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007567 }
7568
Daniel Dunbarb440f562010-08-02 02:38:21 +00007569 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007570 CmdArgs.push_back("-o");
7571 CmdArgs.push_back(Output.getFilename());
7572 } else {
7573 assert(Output.isNothing() && "Invalid output.");
7574 }
7575
7576 if (!Args.hasArg(options::OPT_nostdlib) &&
7577 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007578 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007579 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007580 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007581 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007582 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007583 crt1 = "Scrt1.o";
7584 else
7585 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007586 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007587 if (crt1)
7588 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7589
7590 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7591
Craig Topper92fc2df2014-05-17 16:56:41 +00007592 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007593 if (Args.hasArg(options::OPT_static))
7594 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007595 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007596 crtbegin = "crtbeginS.o";
7597 else
7598 crtbegin = "crtbegin.o";
7599
7600 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007601 }
7602
7603 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007604 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007605 for (const auto &Path : Paths)
7606 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007607 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7608 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007609 Args.AddAllArgs(CmdArgs, options::OPT_s);
7610 Args.AddAllArgs(CmdArgs, options::OPT_t);
7611 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7612 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007613
Teresa Johnson945bc502015-10-15 20:35:53 +00007614 if (D.isUsingLTO())
7615 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007616
Alexey Samsonov52550342014-09-15 19:58:40 +00007617 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007618 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007619
7620 if (!Args.hasArg(options::OPT_nostdlib) &&
7621 !Args.hasArg(options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007622 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007623 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007624 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007625 if (Args.hasArg(options::OPT_pg))
7626 CmdArgs.push_back("-lm_p");
7627 else
7628 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007629 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007630 if (NeedsSanitizerDeps)
7631 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007632 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7633 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007634 if (Args.hasArg(options::OPT_pg))
7635 CmdArgs.push_back("-lgcc_p");
7636 else
7637 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007638 if (Args.hasArg(options::OPT_static)) {
7639 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007640 } else if (Args.hasArg(options::OPT_pg)) {
7641 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007642 } else {
7643 CmdArgs.push_back("--as-needed");
7644 CmdArgs.push_back("-lgcc_s");
7645 CmdArgs.push_back("--no-as-needed");
7646 }
7647
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007648 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007649 if (Args.hasArg(options::OPT_pg))
7650 CmdArgs.push_back("-lpthread_p");
7651 else
7652 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007653 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007654
Roman Divacky66f22762011-02-10 16:59:40 +00007655 if (Args.hasArg(options::OPT_pg)) {
7656 if (Args.hasArg(options::OPT_shared))
7657 CmdArgs.push_back("-lc");
7658 else
7659 CmdArgs.push_back("-lc_p");
7660 CmdArgs.push_back("-lgcc_p");
7661 } else {
7662 CmdArgs.push_back("-lc");
7663 CmdArgs.push_back("-lgcc");
7664 }
7665
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007666 if (Args.hasArg(options::OPT_static)) {
7667 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007668 } else if (Args.hasArg(options::OPT_pg)) {
7669 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007670 } else {
7671 CmdArgs.push_back("--as-needed");
7672 CmdArgs.push_back("-lgcc_s");
7673 CmdArgs.push_back("--no-as-needed");
7674 }
7675 }
7676
7677 if (!Args.hasArg(options::OPT_nostdlib) &&
7678 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007679 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007680 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007681 else
7682 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007683 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007684 }
7685
Xinliang David Li69306c02015-10-22 06:15:31 +00007686 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007687
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007688 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007689 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007690}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007691
Douglas Katzman95354292015-06-23 20:42:09 +00007692void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007693 const InputInfo &Output,
7694 const InputInfoList &Inputs,
7695 const ArgList &Args,
7696 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007697 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007698 ArgStringList CmdArgs;
7699
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007700 // GNU as needs different flags for creating the correct output format
7701 // on architectures with different ABIs or optional feature sets.
7702 switch (getToolChain().getArch()) {
7703 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007704 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007705 break;
7706 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007707 case llvm::Triple::armeb:
7708 case llvm::Triple::thumb:
7709 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007710 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007711 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7712 std::string Arch =
7713 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007714 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007715 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007716 }
7717
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007718 case llvm::Triple::mips:
7719 case llvm::Triple::mipsel:
7720 case llvm::Triple::mips64:
7721 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007722 StringRef CPUName;
7723 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007724 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007725
7726 CmdArgs.push_back("-march");
7727 CmdArgs.push_back(CPUName.data());
7728
7729 CmdArgs.push_back("-mabi");
7730 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7731
7732 if (getToolChain().getArch() == llvm::Triple::mips ||
7733 getToolChain().getArch() == llvm::Triple::mips64)
7734 CmdArgs.push_back("-EB");
7735 else
7736 CmdArgs.push_back("-EL");
7737
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007738 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007739 break;
7740 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007741
7742 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007743 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007744 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007745 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007746 break;
7747
7748 case llvm::Triple::sparcv9:
7749 CmdArgs.push_back("-64");
7750 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007751 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007752 break;
7753
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007754 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007755 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007756 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007757
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007758 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007759
7760 CmdArgs.push_back("-o");
7761 CmdArgs.push_back(Output.getFilename());
7762
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007763 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007764 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007765
David Chisnallddbd68f2011-09-27 22:03:18 +00007766 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007767 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007768}
7769
Douglas Katzman95354292015-06-23 20:42:09 +00007770void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7771 const InputInfo &Output,
7772 const InputInfoList &Inputs,
7773 const ArgList &Args,
7774 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007775 const Driver &D = getToolChain().getDriver();
7776 ArgStringList CmdArgs;
7777
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007778 if (!D.SysRoot.empty())
7779 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7780
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007781 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007782 if (Args.hasArg(options::OPT_static)) {
7783 CmdArgs.push_back("-Bstatic");
7784 } else {
7785 if (Args.hasArg(options::OPT_rdynamic))
7786 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007787 if (Args.hasArg(options::OPT_shared)) {
7788 CmdArgs.push_back("-Bshareable");
7789 } else {
7790 CmdArgs.push_back("-dynamic-linker");
7791 CmdArgs.push_back("/libexec/ld.elf_so");
7792 }
7793 }
7794
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007795 // Many NetBSD architectures support more than one ABI.
7796 // Determine the correct emulation for ld.
7797 switch (getToolChain().getArch()) {
7798 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007799 CmdArgs.push_back("-m");
7800 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007801 break;
7802 case llvm::Triple::arm:
7803 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007804 CmdArgs.push_back("-m");
7805 switch (getToolChain().getTriple().getEnvironment()) {
7806 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007807 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007808 CmdArgs.push_back("armelf_nbsd_eabi");
7809 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007810 case llvm::Triple::EABIHF:
7811 case llvm::Triple::GNUEABIHF:
7812 CmdArgs.push_back("armelf_nbsd_eabihf");
7813 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007814 default:
7815 CmdArgs.push_back("armelf_nbsd");
7816 break;
7817 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007818 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007819 case llvm::Triple::armeb:
7820 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007821 arm::appendEBLinkFlags(
7822 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007823 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007824 CmdArgs.push_back("-m");
7825 switch (getToolChain().getTriple().getEnvironment()) {
7826 case llvm::Triple::EABI:
7827 case llvm::Triple::GNUEABI:
7828 CmdArgs.push_back("armelfb_nbsd_eabi");
7829 break;
7830 case llvm::Triple::EABIHF:
7831 case llvm::Triple::GNUEABIHF:
7832 CmdArgs.push_back("armelfb_nbsd_eabihf");
7833 break;
7834 default:
7835 CmdArgs.push_back("armelfb_nbsd");
7836 break;
7837 }
7838 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007839 case llvm::Triple::mips64:
7840 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007841 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007842 CmdArgs.push_back("-m");
7843 if (getToolChain().getArch() == llvm::Triple::mips64)
7844 CmdArgs.push_back("elf32btsmip");
7845 else
7846 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007847 } else if (mips::hasMipsAbiArg(Args, "64")) {
7848 CmdArgs.push_back("-m");
7849 if (getToolChain().getArch() == llvm::Triple::mips64)
7850 CmdArgs.push_back("elf64btsmip");
7851 else
7852 CmdArgs.push_back("elf64ltsmip");
7853 }
7854 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007855 case llvm::Triple::ppc:
7856 CmdArgs.push_back("-m");
7857 CmdArgs.push_back("elf32ppc_nbsd");
7858 break;
7859
7860 case llvm::Triple::ppc64:
7861 case llvm::Triple::ppc64le:
7862 CmdArgs.push_back("-m");
7863 CmdArgs.push_back("elf64ppc");
7864 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007865
7866 case llvm::Triple::sparc:
7867 CmdArgs.push_back("-m");
7868 CmdArgs.push_back("elf32_sparc");
7869 break;
7870
7871 case llvm::Triple::sparcv9:
7872 CmdArgs.push_back("-m");
7873 CmdArgs.push_back("elf64_sparc");
7874 break;
7875
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007876 default:
7877 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007878 }
7879
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007880 if (Output.isFilename()) {
7881 CmdArgs.push_back("-o");
7882 CmdArgs.push_back(Output.getFilename());
7883 } else {
7884 assert(Output.isNothing() && "Invalid output.");
7885 }
7886
7887 if (!Args.hasArg(options::OPT_nostdlib) &&
7888 !Args.hasArg(options::OPT_nostartfiles)) {
7889 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007890 CmdArgs.push_back(
7891 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7892 CmdArgs.push_back(
7893 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7894 CmdArgs.push_back(
7895 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007896 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 CmdArgs.push_back(
7898 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7899 CmdArgs.push_back(
7900 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007901 }
7902 }
7903
7904 Args.AddAllArgs(CmdArgs, options::OPT_L);
7905 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7906 Args.AddAllArgs(CmdArgs, options::OPT_e);
7907 Args.AddAllArgs(CmdArgs, options::OPT_s);
7908 Args.AddAllArgs(CmdArgs, options::OPT_t);
7909 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7910 Args.AddAllArgs(CmdArgs, options::OPT_r);
7911
7912 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7913
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007914 unsigned Major, Minor, Micro;
7915 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7916 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007917 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007918 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007919 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007920 case llvm::Triple::arm:
7921 case llvm::Triple::armeb:
7922 case llvm::Triple::thumb:
7923 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007924 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007925 case llvm::Triple::ppc64:
7926 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007927 case llvm::Triple::x86:
7928 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007929 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007930 break;
7931 default:
7932 break;
7933 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007934 }
7935
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007936 if (!Args.hasArg(options::OPT_nostdlib) &&
7937 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007938 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007939 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007940 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7941 CmdArgs.push_back("-lm");
7942 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007943 if (Args.hasArg(options::OPT_pthread))
7944 CmdArgs.push_back("-lpthread");
7945 CmdArgs.push_back("-lc");
7946
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007947 if (useLibgcc) {
7948 if (Args.hasArg(options::OPT_static)) {
7949 // libgcc_eh depends on libc, so resolve as much as possible,
7950 // pull in any new requirements from libc and then get the rest
7951 // of libgcc.
7952 CmdArgs.push_back("-lgcc_eh");
7953 CmdArgs.push_back("-lc");
7954 CmdArgs.push_back("-lgcc");
7955 } else {
7956 CmdArgs.push_back("-lgcc");
7957 CmdArgs.push_back("--as-needed");
7958 CmdArgs.push_back("-lgcc_s");
7959 CmdArgs.push_back("--no-as-needed");
7960 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007961 }
7962 }
7963
7964 if (!Args.hasArg(options::OPT_nostdlib) &&
7965 !Args.hasArg(options::OPT_nostartfiles)) {
7966 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 CmdArgs.push_back(
7968 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007969 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7972 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007973 }
7974
Xinliang David Li69306c02015-10-22 06:15:31 +00007975 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007976
Logan Chieneb9162f2014-06-26 14:23:45 +00007977 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007978 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007979}
7980
Douglas Katzman95354292015-06-23 20:42:09 +00007981void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7982 const InputInfo &Output,
7983 const InputInfoList &Inputs,
7984 const ArgList &Args,
7985 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007986 claimNoWarnArgs(Args);
7987
James Y Knight2db38f32015-08-15 03:45:25 +00007988 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7989 llvm::Triple Triple = llvm::Triple(TripleStr);
7990
Rafael Espindola92b00932010-08-10 00:25:48 +00007991 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007992 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007993
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007994 llvm::Reloc::Model RelocationModel;
7995 unsigned PICLevel;
7996 bool IsPIE;
7997 std::tie(RelocationModel, PICLevel, IsPIE) =
7998 ParsePICArgs(getToolChain(), Triple, Args);
7999
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008000 switch (getToolChain().getArch()) {
8001 default:
8002 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008003 // Add --32/--64 to make sure we get the format we want.
8004 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008005 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008006 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008007 break;
8008 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008009 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8010 CmdArgs.push_back("--x32");
8011 else
8012 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008013 break;
8014 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008015 CmdArgs.push_back("-a32");
8016 CmdArgs.push_back("-mppc");
8017 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008018 break;
8019 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008020 CmdArgs.push_back("-a64");
8021 CmdArgs.push_back("-mppc64");
8022 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008023 break;
8024 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008025 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008026 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008027 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008028 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008029 break;
8030 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008031 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008032 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008033 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008034 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008035 break;
8036 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008037 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00008038 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008039 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008040 break;
8041 case llvm::Triple::arm:
8042 case llvm::Triple::armeb:
8043 case llvm::Triple::thumb:
8044 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008045 const llvm::Triple &Triple2 = getToolChain().getTriple();
8046 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008047 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008048 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008049 break;
8050 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008051 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008052 break;
8053 default:
8054 break;
8055 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008056
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008057 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008058 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8059 case arm::FloatABI::Soft:
8060 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8061 break;
8062 case arm::FloatABI::SoftFP:
8063 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8064 break;
8065 case arm::FloatABI::Hard:
8066 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8067 break;
8068 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008069
8070 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008071
8072 // FIXME: remove krait check when GNU tools support krait cpu
8073 // for now replace it with -march=armv7-a to avoid a lower
8074 // march from being picked in the absence of a cpu flag.
8075 Arg *A;
8076 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008077 StringRef(A->getValue()).lower() == "krait")
8078 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008079 else
8080 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008081 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008082 break;
8083 }
8084 case llvm::Triple::mips:
8085 case llvm::Triple::mipsel:
8086 case llvm::Triple::mips64:
8087 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008088 StringRef CPUName;
8089 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008090 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008091 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008092
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008093 CmdArgs.push_back("-march");
8094 CmdArgs.push_back(CPUName.data());
8095
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008096 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008097 CmdArgs.push_back(ABIName.data());
8098
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008099 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8100 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008101 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008102 CmdArgs.push_back("-mno-shared");
8103
Daniel Sanders379d44b2014-07-16 11:52:23 +00008104 // LLVM doesn't support -mplt yet and acts as if it is always given.
8105 // However, -mplt has no effect with the N64 ABI.
8106 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008107
8108 if (getToolChain().getArch() == llvm::Triple::mips ||
8109 getToolChain().getArch() == llvm::Triple::mips64)
8110 CmdArgs.push_back("-EB");
8111 else
8112 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008113
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008114 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8115 if (StringRef(A->getValue()) == "2008")
8116 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8117 }
8118
Daniel Sanders379d44b2014-07-16 11:52:23 +00008119 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8120 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8121 options::OPT_mfp64)) {
8122 A->claim();
8123 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008124 } else if (mips::shouldUseFPXX(
8125 Args, getToolChain().getTriple(), CPUName, ABIName,
8126 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008127 CmdArgs.push_back("-mfpxx");
8128
8129 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8130 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008131 if (Arg *A =
8132 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008133 if (A->getOption().matches(options::OPT_mips16)) {
8134 A->claim();
8135 A->render(Args, CmdArgs);
8136 } else {
8137 A->claim();
8138 CmdArgs.push_back("-no-mips16");
8139 }
8140 }
8141
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008142 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8143 options::OPT_mno_micromips);
8144 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8145 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8146
Simon Atanasyanbd986632013-11-26 11:58:04 +00008147 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8148 // Do not use AddLastArg because not all versions of MIPS assembler
8149 // support -mmsa / -mno-msa options.
8150 if (A->getOption().matches(options::OPT_mmsa))
8151 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8152 }
8153
Daniel Sanders379d44b2014-07-16 11:52:23 +00008154 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8155 options::OPT_msoft_float);
8156
Toma Tabacub36d6102015-06-11 12:13:18 +00008157 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8158 options::OPT_msingle_float);
8159
Daniel Sanders379d44b2014-07-16 11:52:23 +00008160 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8161 options::OPT_mno_odd_spreg);
8162
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008163 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008164 break;
8165 }
8166 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008167 // Always pass an -march option, since our default of z10 is later
8168 // than the GNU assembler's default.
8169 StringRef CPUName = getSystemZTargetCPU(Args);
8170 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008171 break;
8172 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008173 }
8174
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008175 if (NeedsKPIC) {
8176 if (RelocationModel != llvm::Reloc::Static)
8177 CmdArgs.push_back("-KPIC");
8178 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008179
Renato Golina74bbc72015-07-22 15:32:36 +00008180 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008181 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008182
8183 CmdArgs.push_back("-o");
8184 CmdArgs.push_back(Output.getFilename());
8185
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008186 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008187 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008188
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008189 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008190 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008191
8192 // Handle the debug info splitting at object creation time if we're
8193 // creating an object.
8194 // TODO: Currently only works on linux with newer objcopy.
8195 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008196 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008197 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008198 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008199}
8200
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008201static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008202 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008203 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008204 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008205 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8206 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008207 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008208 CmdArgs.push_back("-lgcc");
8209
Logan Chien3d3373c2012-11-19 12:04:11 +00008210 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008211 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008212 CmdArgs.push_back("-lgcc");
8213 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008214 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008215 CmdArgs.push_back("--as-needed");
8216 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008217 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008218 CmdArgs.push_back("--no-as-needed");
8219 }
8220
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008221 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008222 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008223 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008224 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008225
8226 // According to Android ABI, we have to link with libdl if we are
8227 // linking with non-static libgcc.
8228 //
8229 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8230 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8231 if (isAndroid && !StaticLibgcc)
8232 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008233}
8234
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008235static std::string getLinuxDynamicLinker(const ArgList &Args,
8236 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008237 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8238
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008239 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008240 if (ToolChain.getTriple().isArch64Bit())
8241 return "/system/bin/linker64";
8242 else
8243 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008244 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8245 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008246 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008247 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008248 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008249 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008250 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008251 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008252 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008253 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008254 return "/lib/ld-linux-armhf.so.3";
8255 else
8256 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008257 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8258 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008259 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008260 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008261 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008262 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 return "/lib/ld-linux.so.3";
8264 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8265 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008266 StringRef CPUName;
8267 StringRef ABIName;
8268 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
Vasileios Kalintiris45faf472015-10-29 15:33:53 +00008269 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008270
8271 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8272 .Case("o32", "/lib")
8273 .Case("n32", "/lib32")
8274 .Case("n64", "/lib64")
8275 .Default("/lib");
8276 StringRef LibName;
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008277 if (mips::isUCLibc(Args))
8278 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008279 else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008280 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008281
8282 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008283 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008284 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008285 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008286 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8287 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008288 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008289 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008290 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8291 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008292 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008293 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008294 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008295 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008296 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008297 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008298 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8299 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008300 else
8301 return "/lib64/ld-linux-x86-64.so.2";
8302}
8303
Renato Golinc4b49242014-02-13 10:01:16 +00008304static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008305 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008306 // Make use of compiler-rt if --rtlib option is used
8307 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8308
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008309 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008310 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008311 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008312 default:
8313 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008314 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008315 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008316 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008317 break;
8318 }
Renato Golinc4b49242014-02-13 10:01:16 +00008319 break;
8320 case ToolChain::RLT_Libgcc:
8321 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8322 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008323 }
8324}
8325
Rafael Espindola1e085772014-08-15 17:14:35 +00008326static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8327 switch (T.getArch()) {
8328 case llvm::Triple::x86:
8329 return "elf_i386";
8330 case llvm::Triple::aarch64:
8331 return "aarch64linux";
8332 case llvm::Triple::aarch64_be:
8333 return "aarch64_be_linux";
8334 case llvm::Triple::arm:
8335 case llvm::Triple::thumb:
8336 return "armelf_linux_eabi";
8337 case llvm::Triple::armeb:
8338 case llvm::Triple::thumbeb:
8339 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8340 case llvm::Triple::ppc:
8341 return "elf32ppclinux";
8342 case llvm::Triple::ppc64:
8343 return "elf64ppc";
8344 case llvm::Triple::ppc64le:
8345 return "elf64lppc";
8346 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008347 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008348 return "elf32_sparc";
8349 case llvm::Triple::sparcv9:
8350 return "elf64_sparc";
8351 case llvm::Triple::mips:
8352 return "elf32btsmip";
8353 case llvm::Triple::mipsel:
8354 return "elf32ltsmip";
8355 case llvm::Triple::mips64:
8356 if (mips::hasMipsAbiArg(Args, "n32"))
8357 return "elf32btsmipn32";
8358 return "elf64btsmip";
8359 case llvm::Triple::mips64el:
8360 if (mips::hasMipsAbiArg(Args, "n32"))
8361 return "elf32ltsmipn32";
8362 return "elf64ltsmip";
8363 case llvm::Triple::systemz:
8364 return "elf64_s390";
8365 case llvm::Triple::x86_64:
8366 if (T.getEnvironment() == llvm::Triple::GNUX32)
8367 return "elf32_x86_64";
8368 return "elf_x86_64";
8369 default:
8370 llvm_unreachable("Unexpected arch");
8371 }
8372}
8373
Douglas Katzman95354292015-06-23 20:42:09 +00008374void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8375 const InputInfo &Output,
8376 const InputInfoList &Inputs,
8377 const ArgList &Args,
8378 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008379 const toolchains::Linux &ToolChain =
8380 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008381 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008382
8383 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8384 llvm::Triple Triple = llvm::Triple(TripleStr);
8385
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008386 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008387 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008388 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008389 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8390 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008391
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008392 ArgStringList CmdArgs;
8393
Rafael Espindolad1002f62010-11-15 18:28:16 +00008394 // Silence warning for "clang -g foo.o -o foo"
8395 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008396 // and "clang -emit-llvm foo.o -o foo"
8397 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008398 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008399 // handled somewhere else.
8400 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008401
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008402 if (!D.SysRoot.empty())
8403 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008404
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008405 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008406 CmdArgs.push_back("-pie");
8407
Rafael Espindola1c76c592010-11-07 22:57:16 +00008408 if (Args.hasArg(options::OPT_rdynamic))
8409 CmdArgs.push_back("-export-dynamic");
8410
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008411 if (Args.hasArg(options::OPT_s))
8412 CmdArgs.push_back("-s");
8413
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008414 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008415 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008416
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008417 for (const auto &Opt : ToolChain.ExtraOpts)
8418 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008419
8420 if (!Args.hasArg(options::OPT_static)) {
8421 CmdArgs.push_back("--eh-frame-hdr");
8422 }
8423
8424 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008425 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008426
8427 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008428 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8429 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008430 CmdArgs.push_back("-Bstatic");
8431 else
8432 CmdArgs.push_back("-static");
8433 } else if (Args.hasArg(options::OPT_shared)) {
8434 CmdArgs.push_back("-shared");
8435 }
8436
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008437 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8438 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008439 (!Args.hasArg(options::OPT_static) &&
8440 !Args.hasArg(options::OPT_shared))) {
8441 CmdArgs.push_back("-dynamic-linker");
8442 CmdArgs.push_back(Args.MakeArgString(
8443 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8444 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008445
8446 CmdArgs.push_back("-o");
8447 CmdArgs.push_back(Output.getFilename());
8448
Rafael Espindola81937ec2010-12-01 01:52:43 +00008449 if (!Args.hasArg(options::OPT_nostdlib) &&
8450 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008451 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008452 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008453 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008454 if (Args.hasArg(options::OPT_pg))
8455 crt1 = "gcrt1.o";
8456 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008457 crt1 = "Scrt1.o";
8458 else
8459 crt1 = "crt1.o";
8460 }
8461 if (crt1)
8462 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008463
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008464 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8465 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008466
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008467 const char *crtbegin;
8468 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008469 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008470 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008471 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008472 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008473 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008474 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008475 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008476 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008477
8478 // Add crtfastmath.o if available and fast math is enabled.
8479 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008480 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008481
8482 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008483 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008484
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008485 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008486
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008487 for (const auto &Path : Paths)
8488 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008489
Teresa Johnson945bc502015-10-15 20:35:53 +00008490 if (D.isUsingLTO())
8491 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008492
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008493 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8494 CmdArgs.push_back("--no-demangle");
8495
Alexey Samsonov52550342014-09-15 19:58:40 +00008496 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008497 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008498 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008499 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008500
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008501 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008502 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008503 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008504 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008505 if (OnlyLibstdcxxStatic)
8506 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008507 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008508 if (OnlyLibstdcxxStatic)
8509 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008510 CmdArgs.push_back("-lm");
8511 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008512 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8513 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008514
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008515 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008516 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8517 if (Args.hasArg(options::OPT_static))
8518 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008519
Alexey Samsonov52550342014-09-15 19:58:40 +00008520 if (NeedsSanitizerDeps)
8521 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8522
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008523 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8524 Args.hasArg(options::OPT_pthreads);
8525
8526 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8527 options::OPT_fno_openmp, false)) {
8528 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8529 // FIXME: Does this really make sense for all GNU toolchains?
8530 WantPthread = true;
8531
8532 // Also link the particular OpenMP runtimes.
8533 switch (getOpenMPRuntime(ToolChain, Args)) {
8534 case OMPRT_OMP:
8535 CmdArgs.push_back("-lomp");
8536 break;
8537 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008538 CmdArgs.push_back("-lgomp");
8539
8540 // FIXME: Exclude this for platforms with libgomp that don't require
8541 // librt. Most modern Linux platforms require it, but some may not.
8542 CmdArgs.push_back("-lrt");
8543 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008544 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008545 CmdArgs.push_back("-liomp5");
8546 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008547 case OMPRT_Unknown:
8548 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008549 break;
8550 }
Chandler Carruth01538002013-01-17 13:19:29 +00008551 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008552
Renato Golinc4b49242014-02-13 10:01:16 +00008553 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008554
Richard Smith31d1de22015-05-20 22:48:44 +00008555 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008556 CmdArgs.push_back("-lpthread");
8557
8558 CmdArgs.push_back("-lc");
8559
8560 if (Args.hasArg(options::OPT_static))
8561 CmdArgs.push_back("--end-group");
8562 else
Renato Golinc4b49242014-02-13 10:01:16 +00008563 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008564 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008565
Rafael Espindola81937ec2010-12-01 01:52:43 +00008566 if (!Args.hasArg(options::OPT_nostartfiles)) {
8567 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008568 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008569 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008570 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008571 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008572 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008573 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008574
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008576 if (!isAndroid)
8577 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008578 }
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008579 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008580
Justin Bognerd3371d82015-07-17 03:35:54 +00008581 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8582 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008583}
8584
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008585// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8586// for the various SFI requirements like register masking. The assembly tool
8587// inserts the file containing the macros as an input into all the assembly
8588// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008589void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8590 const InputInfo &Output,
8591 const InputInfoList &Inputs,
8592 const ArgList &Args,
8593 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008594 const toolchains::NaClToolChain &ToolChain =
8595 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008596 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8597 "nacl-arm-macros.s");
8598 InputInfoList NewInputs;
8599 NewInputs.push_back(NaClMacros);
8600 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008601 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8602 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008603}
8604
Douglas Katzman750cfc52015-06-29 18:42:16 +00008605// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008606// we use static by default, do not yet support sanitizers or LTO, and a few
8607// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008608// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008609void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8610 const InputInfo &Output,
8611 const InputInfoList &Inputs,
8612 const ArgList &Args,
8613 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008614
Douglas Katzman54366072015-07-27 16:53:08 +00008615 const toolchains::NaClToolChain &ToolChain =
8616 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008617 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008618 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008619 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008620 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008621
8622 ArgStringList CmdArgs;
8623
8624 // Silence warning for "clang -g foo.o -o foo"
8625 Args.ClaimAllArgs(options::OPT_g_Group);
8626 // and "clang -emit-llvm foo.o -o foo"
8627 Args.ClaimAllArgs(options::OPT_emit_llvm);
8628 // and for "clang -w foo.o -o foo". Other warning options are already
8629 // handled somewhere else.
8630 Args.ClaimAllArgs(options::OPT_w);
8631
8632 if (!D.SysRoot.empty())
8633 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8634
8635 if (Args.hasArg(options::OPT_rdynamic))
8636 CmdArgs.push_back("-export-dynamic");
8637
8638 if (Args.hasArg(options::OPT_s))
8639 CmdArgs.push_back("-s");
8640
Douglas Katzman54366072015-07-27 16:53:08 +00008641 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8642 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008643 CmdArgs.push_back("--build-id");
8644
8645 if (!IsStatic)
8646 CmdArgs.push_back("--eh-frame-hdr");
8647
8648 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008649 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008650 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008651 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008652 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008653 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008654 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008655 else if (Arch == llvm::Triple::mipsel)
8656 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008657 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008658 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8659 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008660
8661 if (IsStatic)
8662 CmdArgs.push_back("-static");
8663 else if (Args.hasArg(options::OPT_shared))
8664 CmdArgs.push_back("-shared");
8665
8666 CmdArgs.push_back("-o");
8667 CmdArgs.push_back(Output.getFilename());
8668 if (!Args.hasArg(options::OPT_nostdlib) &&
8669 !Args.hasArg(options::OPT_nostartfiles)) {
8670 if (!Args.hasArg(options::OPT_shared))
8671 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8672 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8673
8674 const char *crtbegin;
8675 if (IsStatic)
8676 crtbegin = "crtbeginT.o";
8677 else if (Args.hasArg(options::OPT_shared))
8678 crtbegin = "crtbeginS.o";
8679 else
8680 crtbegin = "crtbegin.o";
8681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8682 }
8683
8684 Args.AddAllArgs(CmdArgs, options::OPT_L);
8685 Args.AddAllArgs(CmdArgs, options::OPT_u);
8686
8687 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8688
8689 for (const auto &Path : Paths)
8690 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8691
8692 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8693 CmdArgs.push_back("--no-demangle");
8694
8695 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8696
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008697 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008698 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008699 bool OnlyLibstdcxxStatic =
8700 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008701 if (OnlyLibstdcxxStatic)
8702 CmdArgs.push_back("-Bstatic");
8703 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8704 if (OnlyLibstdcxxStatic)
8705 CmdArgs.push_back("-Bdynamic");
8706 CmdArgs.push_back("-lm");
8707 }
8708
8709 if (!Args.hasArg(options::OPT_nostdlib)) {
8710 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8711 // Always use groups, since it has no effect on dynamic libraries.
8712 CmdArgs.push_back("--start-group");
8713 CmdArgs.push_back("-lc");
8714 // NaCl's libc++ currently requires libpthread, so just always include it
8715 // in the group for C++.
8716 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008717 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008718 // Gold, used by Mips, handles nested groups differently than ld, and
8719 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8720 // which is not a desired behaviour here.
8721 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8722 if (getToolChain().getArch() == llvm::Triple::mipsel)
8723 CmdArgs.push_back("-lnacl");
8724
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008725 CmdArgs.push_back("-lpthread");
8726 }
8727
8728 CmdArgs.push_back("-lgcc");
8729 CmdArgs.push_back("--as-needed");
8730 if (IsStatic)
8731 CmdArgs.push_back("-lgcc_eh");
8732 else
8733 CmdArgs.push_back("-lgcc_s");
8734 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008735
8736 // Mips needs to create and use pnacl_legacy library that contains
8737 // definitions from bitcode/pnaclmm.c and definitions for
8738 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8739 if (getToolChain().getArch() == llvm::Triple::mipsel)
8740 CmdArgs.push_back("-lpnacl_legacy");
8741
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008742 CmdArgs.push_back("--end-group");
8743 }
8744
8745 if (!Args.hasArg(options::OPT_nostartfiles)) {
8746 const char *crtend;
8747 if (Args.hasArg(options::OPT_shared))
8748 crtend = "crtendS.o";
8749 else
8750 crtend = "crtend.o";
8751
8752 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8753 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8754 }
8755 }
8756
Justin Bognerd3371d82015-07-17 03:35:54 +00008757 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8758 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008759}
8760
Douglas Katzman95354292015-06-23 20:42:09 +00008761void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8762 const InputInfo &Output,
8763 const InputInfoList &Inputs,
8764 const ArgList &Args,
8765 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008766 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008767 ArgStringList CmdArgs;
8768
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008769 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008770
8771 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008772 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008773
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008774 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008775 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008776
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008777 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008779}
8780
Douglas Katzman95354292015-06-23 20:42:09 +00008781void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8782 const InputInfo &Output,
8783 const InputInfoList &Inputs,
8784 const ArgList &Args,
8785 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008786 const Driver &D = getToolChain().getDriver();
8787 ArgStringList CmdArgs;
8788
Daniel Dunbarb440f562010-08-02 02:38:21 +00008789 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008790 CmdArgs.push_back("-o");
8791 CmdArgs.push_back(Output.getFilename());
8792 } else {
8793 assert(Output.isNothing() && "Invalid output.");
8794 }
8795
8796 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008797 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008798 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8799 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8800 CmdArgs.push_back(
8801 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8802 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008803 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008804
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008805 Args.AddAllArgs(CmdArgs,
8806 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008807
Daniel Dunbar54423b22010-09-17 00:24:54 +00008808 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008809
Xinliang David Li69306c02015-10-22 06:15:31 +00008810 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008811
Chris Lattner3e2ee142010-07-07 16:01:42 +00008812 if (!Args.hasArg(options::OPT_nostdlib) &&
8813 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008814 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008815 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008816 CmdArgs.push_back("-lm");
8817 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008818 }
8819
8820 if (!Args.hasArg(options::OPT_nostdlib) &&
8821 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008822 if (Args.hasArg(options::OPT_pthread))
8823 CmdArgs.push_back("-lpthread");
8824 CmdArgs.push_back("-lc");
8825 CmdArgs.push_back("-lCompilerRT-Generic");
8826 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8827 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008828 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008829 }
8830
Logan Chieneb9162f2014-06-26 14:23:45 +00008831 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008832 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008833}
8834
Daniel Dunbarcc912342009-05-02 18:28:39 +00008835/// DragonFly Tools
8836
8837// For now, DragonFly Assemble does just about the same as for
8838// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008839void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8840 const InputInfo &Output,
8841 const InputInfoList &Inputs,
8842 const ArgList &Args,
8843 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008844 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008845 ArgStringList CmdArgs;
8846
8847 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8848 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008849 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008850 CmdArgs.push_back("--32");
8851
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008853
8854 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008855 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008856
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008857 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008858 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008859
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008860 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008862}
8863
Douglas Katzman95354292015-06-23 20:42:09 +00008864void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8865 const InputInfo &Output,
8866 const InputInfoList &Inputs,
8867 const ArgList &Args,
8868 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008869 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008870 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008871 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008872
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008873 if (!D.SysRoot.empty())
8874 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8875
John McCall65b8da02013-04-11 22:55:55 +00008876 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008877 if (Args.hasArg(options::OPT_static)) {
8878 CmdArgs.push_back("-Bstatic");
8879 } else {
John McCall65b8da02013-04-11 22:55:55 +00008880 if (Args.hasArg(options::OPT_rdynamic))
8881 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008882 if (Args.hasArg(options::OPT_shared))
8883 CmdArgs.push_back("-Bshareable");
8884 else {
8885 CmdArgs.push_back("-dynamic-linker");
8886 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8887 }
John McCall65b8da02013-04-11 22:55:55 +00008888 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008889 }
8890
8891 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8892 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008893 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008894 CmdArgs.push_back("-m");
8895 CmdArgs.push_back("elf_i386");
8896 }
8897
Daniel Dunbarb440f562010-08-02 02:38:21 +00008898 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008899 CmdArgs.push_back("-o");
8900 CmdArgs.push_back(Output.getFilename());
8901 } else {
8902 assert(Output.isNothing() && "Invalid output.");
8903 }
8904
8905 if (!Args.hasArg(options::OPT_nostdlib) &&
8906 !Args.hasArg(options::OPT_nostartfiles)) {
8907 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008908 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008909 CmdArgs.push_back(
8910 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008911 else {
8912 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008913 CmdArgs.push_back(
8914 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008915 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008916 CmdArgs.push_back(
8917 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008918 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008919 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008920 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008921 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008922 CmdArgs.push_back(
8923 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008924 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008925 CmdArgs.push_back(
8926 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008927 }
8928
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008929 Args.AddAllArgs(CmdArgs,
8930 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008931
Daniel Dunbar54423b22010-09-17 00:24:54 +00008932 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008933
8934 if (!Args.hasArg(options::OPT_nostdlib) &&
8935 !Args.hasArg(options::OPT_nodefaultlibs)) {
8936 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8937 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008938 if (UseGCC47)
8939 CmdArgs.push_back("-L/usr/lib/gcc47");
8940 else
8941 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008942
8943 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008944 if (UseGCC47) {
8945 CmdArgs.push_back("-rpath");
8946 CmdArgs.push_back("/usr/lib/gcc47");
8947 } else {
8948 CmdArgs.push_back("-rpath");
8949 CmdArgs.push_back("/usr/lib/gcc44");
8950 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008951 }
8952
Hans Wennborg70850d82013-07-18 20:29:38 +00008953 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008954 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008955 CmdArgs.push_back("-lm");
8956 }
8957
Daniel Dunbarcc912342009-05-02 18:28:39 +00008958 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008959 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008960
8961 if (!Args.hasArg(options::OPT_nolibc)) {
8962 CmdArgs.push_back("-lc");
8963 }
8964
John McCall65b8da02013-04-11 22:55:55 +00008965 if (UseGCC47) {
8966 if (Args.hasArg(options::OPT_static) ||
8967 Args.hasArg(options::OPT_static_libgcc)) {
8968 CmdArgs.push_back("-lgcc");
8969 CmdArgs.push_back("-lgcc_eh");
8970 } else {
8971 if (Args.hasArg(options::OPT_shared_libgcc)) {
8972 CmdArgs.push_back("-lgcc_pic");
8973 if (!Args.hasArg(options::OPT_shared))
8974 CmdArgs.push_back("-lgcc");
8975 } else {
8976 CmdArgs.push_back("-lgcc");
8977 CmdArgs.push_back("--as-needed");
8978 CmdArgs.push_back("-lgcc_pic");
8979 CmdArgs.push_back("--no-as-needed");
8980 }
8981 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008982 } else {
John McCall65b8da02013-04-11 22:55:55 +00008983 if (Args.hasArg(options::OPT_shared)) {
8984 CmdArgs.push_back("-lgcc_pic");
8985 } else {
8986 CmdArgs.push_back("-lgcc");
8987 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008988 }
8989 }
8990
8991 if (!Args.hasArg(options::OPT_nostdlib) &&
8992 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008993 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008994 CmdArgs.push_back(
8995 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008996 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008997 CmdArgs.push_back(
8998 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8999 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009000 }
9001
Xinliang David Li69306c02015-10-22 06:15:31 +00009002 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009003
Logan Chieneb9162f2014-06-26 14:23:45 +00009004 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009005 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009006}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009007
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009008// Try to find Exe from a Visual Studio distribution. This first tries to find
9009// an installed copy of Visual Studio and, failing that, looks in the PATH,
9010// making sure that whatever executable that's found is not a same-named exe
9011// from clang itself to prevent clang from falling back to itself.
9012static std::string FindVisualStudioExecutable(const ToolChain &TC,
9013 const char *Exe,
9014 const char *ClangProgramPath) {
9015 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9016 std::string visualStudioBinDir;
9017 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9018 visualStudioBinDir)) {
9019 SmallString<128> FilePath(visualStudioBinDir);
9020 llvm::sys::path::append(FilePath, Exe);
9021 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9022 return FilePath.str();
9023 }
9024
9025 return Exe;
9026}
9027
Douglas Katzman95354292015-06-23 20:42:09 +00009028void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9029 const InputInfo &Output,
9030 const InputInfoList &Inputs,
9031 const ArgList &Args,
9032 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009033 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009034 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009035
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009036 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9037 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009038 CmdArgs.push_back(
9039 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009040
9041 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009042 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009043 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009044
Zachary Turner10d75b22014-10-22 20:40:43 +00009045 if (!llvm::sys::Process::GetEnv("LIB")) {
9046 // If the VC environment hasn't been configured (perhaps because the user
9047 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009048 // the environment variable is set however, assume the user knows what
9049 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009050 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009051 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009052 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9053 SmallString<128> LibDir(VisualStudioDir);
9054 llvm::sys::path::append(LibDir, "VC", "lib");
9055 switch (MSVC.getArch()) {
9056 case llvm::Triple::x86:
9057 // x86 just puts the libraries directly in lib
9058 break;
9059 case llvm::Triple::x86_64:
9060 llvm::sys::path::append(LibDir, "amd64");
9061 break;
9062 case llvm::Triple::arm:
9063 llvm::sys::path::append(LibDir, "arm");
9064 break;
9065 default:
9066 break;
9067 }
9068 CmdArgs.push_back(
9069 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009070
9071 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9072 std::string UniversalCRTLibPath;
9073 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9074 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9075 UniversalCRTLibPath.c_str()));
9076 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009077 }
9078
9079 std::string WindowsSdkLibPath;
9080 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9081 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9082 WindowsSdkLibPath.c_str()));
9083 }
9084
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009085 CmdArgs.push_back("-nologo");
9086
Reid Kleckner124955a2015-08-05 18:51:13 +00009087 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009088 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009090 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009091 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009092 if (DLL) {
9093 CmdArgs.push_back(Args.MakeArgString("-dll"));
9094
9095 SmallString<128> ImplibName(Output.getFilename());
9096 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009097 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009098 }
9099
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009100 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009101 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009102 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009103 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009104 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9105 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009106 // Make sure the dynamic runtime thunk is not optimized out at link time
9107 // to ensure proper SEH handling.
9108 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009109 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009110 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009111 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009112 for (const auto &Lib : {"asan", "asan_cxx"})
9113 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009114 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009115 }
9116
Hans Wennborg2e274592013-08-13 23:38:57 +00009117 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009118
Alexey Bataevc7e84352015-08-19 04:49:01 +00009119 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9120 options::OPT_fno_openmp, false)) {
9121 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9122 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9123 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9124 TC.getDriver().Dir + "/../lib"));
9125 switch (getOpenMPRuntime(getToolChain(), Args)) {
9126 case OMPRT_OMP:
9127 CmdArgs.push_back("-defaultlib:libomp.lib");
9128 break;
9129 case OMPRT_IOMP5:
9130 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9131 break;
9132 case OMPRT_GOMP:
9133 break;
9134 case OMPRT_Unknown:
9135 // Already diagnosed.
9136 break;
9137 }
9138 }
9139
Reid Kleckner337188f2014-09-16 19:22:00 +00009140 // Add filenames, libraries, and other linker inputs.
9141 for (const auto &Input : Inputs) {
9142 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009143 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009144 continue;
9145 }
9146
9147 const Arg &A = Input.getInputArg();
9148
9149 // Render -l options differently for the MSVC linker.
9150 if (A.getOption().matches(options::OPT_l)) {
9151 StringRef Lib = A.getValue();
9152 const char *LinkLibArg;
9153 if (Lib.endswith(".lib"))
9154 LinkLibArg = Args.MakeArgString(Lib);
9155 else
9156 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9157 CmdArgs.push_back(LinkLibArg);
9158 continue;
9159 }
9160
9161 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9162 // or -L. Render it, even if MSVC doesn't understand it.
9163 A.renderAsInput(Args, CmdArgs);
9164 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009165
Zachary Turner719f58c2014-12-01 23:06:47 +00009166 // We need to special case some linker paths. In the case of lld, we need to
9167 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9168 // linker, we need to use a special search algorithm.
9169 llvm::SmallString<128> linkPath;
9170 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9171 if (Linker.equals_lower("lld"))
9172 Linker = "lld-link";
9173
9174 if (Linker.equals_lower("link")) {
9175 // If we're using the MSVC linker, it's not sufficient to just use link
9176 // from the program PATH, because other environments like GnuWin32 install
9177 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009178 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009179 C.getDriver().getClangProgramPath());
9180 } else {
9181 linkPath = Linker;
9182 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009183 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009184 }
9185
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009186 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009187 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009188}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009189
Douglas Katzman95354292015-06-23 20:42:09 +00009190void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9191 const InputInfo &Output,
9192 const InputInfoList &Inputs,
9193 const ArgList &Args,
9194 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009195 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9196}
9197
Douglas Katzman95354292015-06-23 20:42:09 +00009198std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009199 Compilation &C, const JobAction &JA, const InputInfo &Output,
9200 const InputInfoList &Inputs, const ArgList &Args,
9201 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009202 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009203 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009204 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009205 CmdArgs.push_back("/W0"); // No warnings.
9206
9207 // The goal is to be able to invoke this tool correctly based on
9208 // any flag accepted by clang-cl.
9209
9210 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009211 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009212
9213 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009214 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9215 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9216 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009217 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9218 if (A->getOption().getID() == options::OPT_O0) {
9219 CmdArgs.push_back("/Od");
9220 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009221 CmdArgs.push_back("/Og");
9222
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009223 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009224 if (OptLevel == "s" || OptLevel == "z")
9225 CmdArgs.push_back("/Os");
9226 else
9227 CmdArgs.push_back("/Ot");
9228
9229 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009230 }
9231 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009232 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9233 options::OPT_fno_omit_frame_pointer))
9234 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9235 ? "/Oy"
9236 : "/Oy-");
9237 if (!Args.hasArg(options::OPT_fwritable_strings))
9238 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009239
Nico Weber3f8dafb2015-03-12 19:37:10 +00009240 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009241 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9242
David Majnemerf6072342014-07-01 22:24:56 +00009243 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9244 /*default=*/false))
9245 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009246 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9247 options::OPT_fno_function_sections))
9248 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9249 ? "/Gy"
9250 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009251 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9252 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009253 CmdArgs.push_back(
9254 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009255 if (Args.hasArg(options::OPT_fsyntax_only))
9256 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009257 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9258 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009259 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009260
Nico Weber3f8dafb2015-03-12 19:37:10 +00009261 std::vector<std::string> Includes =
9262 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009263 for (const auto &Include : Includes)
9264 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009265
Hans Wennborg87cfa712013-09-19 20:32:16 +00009266 // Flags that can simply be passed through.
9267 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9268 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009269 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009270 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009271
9272 // The order of these flags is relevant, so pick the last one.
9273 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9274 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9275 A->render(Args, CmdArgs);
9276
Hans Wennborg87cfa712013-09-19 20:32:16 +00009277 // Input filename.
9278 assert(Inputs.size() == 1);
9279 const InputInfo &II = Inputs[0];
9280 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9281 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9282 if (II.isFilename())
9283 CmdArgs.push_back(II.getFilename());
9284 else
9285 II.getInputArg().renderAsInput(Args, CmdArgs);
9286
9287 // Output filename.
9288 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009289 const char *Fo =
9290 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009291 CmdArgs.push_back(Fo);
9292
Hans Wennborg188382e2013-09-20 18:16:35 +00009293 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009294 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9295 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009296 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009297 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009298}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009299
Yaron Keren1c0070c2015-07-02 04:45:27 +00009300/// MinGW Tools
9301void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9302 const InputInfo &Output,
9303 const InputInfoList &Inputs,
9304 const ArgList &Args,
9305 const char *LinkingOutput) const {
9306 claimNoWarnArgs(Args);
9307 ArgStringList CmdArgs;
9308
9309 if (getToolChain().getArch() == llvm::Triple::x86) {
9310 CmdArgs.push_back("--32");
9311 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9312 CmdArgs.push_back("--64");
9313 }
9314
9315 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9316
9317 CmdArgs.push_back("-o");
9318 CmdArgs.push_back(Output.getFilename());
9319
9320 for (const auto &II : Inputs)
9321 CmdArgs.push_back(II.getFilename());
9322
9323 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009324 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009325
9326 if (Args.hasArg(options::OPT_gsplit_dwarf))
9327 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9328 SplitDebugName(Args, Inputs[0]));
9329}
9330
9331void MinGW::Linker::AddLibGCC(const ArgList &Args,
9332 ArgStringList &CmdArgs) const {
9333 if (Args.hasArg(options::OPT_mthreads))
9334 CmdArgs.push_back("-lmingwthrd");
9335 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009336
Yaron Kerenaa281332015-08-09 00:24:07 +00009337 // Make use of compiler-rt if --rtlib option is used
9338 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9339 if (RLT == ToolChain::RLT_Libgcc) {
9340 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9341 Args.hasArg(options::OPT_static);
9342 bool Shared = Args.hasArg(options::OPT_shared);
9343 bool CXX = getToolChain().getDriver().CCCIsCXX();
9344
9345 if (Static || (!CXX && !Shared)) {
9346 CmdArgs.push_back("-lgcc");
9347 CmdArgs.push_back("-lgcc_eh");
9348 } else {
9349 CmdArgs.push_back("-lgcc_s");
9350 CmdArgs.push_back("-lgcc");
9351 }
9352 } else {
9353 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9354 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009355
Yaron Keren1c0070c2015-07-02 04:45:27 +00009356 CmdArgs.push_back("-lmoldname");
9357 CmdArgs.push_back("-lmingwex");
9358 CmdArgs.push_back("-lmsvcrt");
9359}
9360
9361void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9362 const InputInfo &Output,
9363 const InputInfoList &Inputs,
9364 const ArgList &Args,
9365 const char *LinkingOutput) const {
9366 const ToolChain &TC = getToolChain();
9367 const Driver &D = TC.getDriver();
9368 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9369
9370 ArgStringList CmdArgs;
9371
9372 // Silence warning for "clang -g foo.o -o foo"
9373 Args.ClaimAllArgs(options::OPT_g_Group);
9374 // and "clang -emit-llvm foo.o -o foo"
9375 Args.ClaimAllArgs(options::OPT_emit_llvm);
9376 // and for "clang -w foo.o -o foo". Other warning options are already
9377 // handled somewhere else.
9378 Args.ClaimAllArgs(options::OPT_w);
9379
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009380 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9381 if (LinkerName.equals_lower("lld")) {
9382 CmdArgs.push_back("-flavor");
9383 CmdArgs.push_back("gnu");
9384 }
9385
Yaron Keren1c0070c2015-07-02 04:45:27 +00009386 if (!D.SysRoot.empty())
9387 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9388
9389 if (Args.hasArg(options::OPT_s))
9390 CmdArgs.push_back("-s");
9391
9392 CmdArgs.push_back("-m");
9393 if (TC.getArch() == llvm::Triple::x86)
9394 CmdArgs.push_back("i386pe");
9395 if (TC.getArch() == llvm::Triple::x86_64)
9396 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009397 if (TC.getArch() == llvm::Triple::arm)
9398 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009399
9400 if (Args.hasArg(options::OPT_mwindows)) {
9401 CmdArgs.push_back("--subsystem");
9402 CmdArgs.push_back("windows");
9403 } else if (Args.hasArg(options::OPT_mconsole)) {
9404 CmdArgs.push_back("--subsystem");
9405 CmdArgs.push_back("console");
9406 }
9407
9408 if (Args.hasArg(options::OPT_static))
9409 CmdArgs.push_back("-Bstatic");
9410 else {
9411 if (Args.hasArg(options::OPT_mdll))
9412 CmdArgs.push_back("--dll");
9413 else if (Args.hasArg(options::OPT_shared))
9414 CmdArgs.push_back("--shared");
9415 CmdArgs.push_back("-Bdynamic");
9416 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9417 CmdArgs.push_back("-e");
9418 if (TC.getArch() == llvm::Triple::x86)
9419 CmdArgs.push_back("_DllMainCRTStartup@12");
9420 else
9421 CmdArgs.push_back("DllMainCRTStartup");
9422 CmdArgs.push_back("--enable-auto-image-base");
9423 }
9424 }
9425
9426 CmdArgs.push_back("-o");
9427 CmdArgs.push_back(Output.getFilename());
9428
9429 Args.AddAllArgs(CmdArgs, options::OPT_e);
9430 // FIXME: add -N, -n flags
9431 Args.AddLastArg(CmdArgs, options::OPT_r);
9432 Args.AddLastArg(CmdArgs, options::OPT_s);
9433 Args.AddLastArg(CmdArgs, options::OPT_t);
9434 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9435 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9436
9437 if (!Args.hasArg(options::OPT_nostdlib) &&
9438 !Args.hasArg(options::OPT_nostartfiles)) {
9439 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9440 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9441 } else {
9442 if (Args.hasArg(options::OPT_municode))
9443 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9444 else
9445 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9446 }
9447 if (Args.hasArg(options::OPT_pg))
9448 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9449 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9450 }
9451
9452 Args.AddAllArgs(CmdArgs, options::OPT_L);
9453 const ToolChain::path_list Paths = TC.getFilePaths();
9454 for (const auto &Path : Paths)
9455 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9456
9457 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9458
9459 // TODO: Add ASan stuff here
9460
9461 // TODO: Add profile stuff here
9462
9463 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9464 !Args.hasArg(options::OPT_nodefaultlibs)) {
9465 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9466 !Args.hasArg(options::OPT_static);
9467 if (OnlyLibstdcxxStatic)
9468 CmdArgs.push_back("-Bstatic");
9469 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9470 if (OnlyLibstdcxxStatic)
9471 CmdArgs.push_back("-Bdynamic");
9472 }
9473
9474 if (!Args.hasArg(options::OPT_nostdlib)) {
9475 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9476 if (Args.hasArg(options::OPT_static))
9477 CmdArgs.push_back("--start-group");
9478
9479 if (Args.hasArg(options::OPT_fstack_protector) ||
9480 Args.hasArg(options::OPT_fstack_protector_strong) ||
9481 Args.hasArg(options::OPT_fstack_protector_all)) {
9482 CmdArgs.push_back("-lssp_nonshared");
9483 CmdArgs.push_back("-lssp");
9484 }
9485 if (Args.hasArg(options::OPT_fopenmp))
9486 CmdArgs.push_back("-lgomp");
9487
9488 AddLibGCC(Args, CmdArgs);
9489
9490 if (Args.hasArg(options::OPT_pg))
9491 CmdArgs.push_back("-lgmon");
9492
Yaron Kerenadce68e2015-07-06 18:52:19 +00009493 if (Args.hasArg(options::OPT_pthread))
9494 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009495
9496 // add system libraries
9497 if (Args.hasArg(options::OPT_mwindows)) {
9498 CmdArgs.push_back("-lgdi32");
9499 CmdArgs.push_back("-lcomdlg32");
9500 }
9501 CmdArgs.push_back("-ladvapi32");
9502 CmdArgs.push_back("-lshell32");
9503 CmdArgs.push_back("-luser32");
9504 CmdArgs.push_back("-lkernel32");
9505
9506 if (Args.hasArg(options::OPT_static))
9507 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009508 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009509 AddLibGCC(Args, CmdArgs);
9510 }
9511
9512 if (!Args.hasArg(options::OPT_nostartfiles)) {
9513 // Add crtfastmath.o if available and fast math is enabled.
9514 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9515
9516 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9517 }
9518 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009519 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009520 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009521}
9522
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009523/// XCore Tools
9524// We pass assemble and link construction to the xcc tool.
9525
Douglas Katzman95354292015-06-23 20:42:09 +00009526void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9527 const InputInfo &Output,
9528 const InputInfoList &Inputs,
9529 const ArgList &Args,
9530 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009531 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009532 ArgStringList CmdArgs;
9533
9534 CmdArgs.push_back("-o");
9535 CmdArgs.push_back(Output.getFilename());
9536
9537 CmdArgs.push_back("-c");
9538
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009539 if (Args.hasArg(options::OPT_v))
9540 CmdArgs.push_back("-v");
9541
Robert Lytton894d25c2014-05-02 09:33:25 +00009542 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9543 if (!A->getOption().matches(options::OPT_g0))
9544 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009545
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009546 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9547 false))
9548 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009549
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009550 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009551
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009552 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009553 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009554
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009555 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009557}
9558
Douglas Katzman95354292015-06-23 20:42:09 +00009559void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9560 const InputInfo &Output,
9561 const InputInfoList &Inputs,
9562 const ArgList &Args,
9563 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009564 ArgStringList CmdArgs;
9565
9566 if (Output.isFilename()) {
9567 CmdArgs.push_back("-o");
9568 CmdArgs.push_back(Output.getFilename());
9569 } else {
9570 assert(Output.isNothing() && "Invalid output.");
9571 }
9572
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009573 if (Args.hasArg(options::OPT_v))
9574 CmdArgs.push_back("-v");
9575
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009576 // Pass -fexceptions through to the linker if it was present.
9577 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9578 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009579 CmdArgs.push_back("-fexceptions");
9580
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009581 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9582
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009583 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009584 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009585}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009586
Douglas Katzman95354292015-06-23 20:42:09 +00009587void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9588 const InputInfo &Output,
9589 const InputInfoList &Inputs,
9590 const ArgList &Args,
9591 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009592 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009593 const auto &TC =
9594 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9595 ArgStringList CmdArgs;
9596 const char *Exec;
9597
9598 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009599 default:
9600 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009601 case llvm::Triple::arm:
9602 case llvm::Triple::thumb:
9603 break;
9604 case llvm::Triple::x86:
9605 CmdArgs.push_back("--32");
9606 break;
9607 case llvm::Triple::x86_64:
9608 CmdArgs.push_back("--64");
9609 break;
9610 }
9611
9612 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9613
9614 CmdArgs.push_back("-o");
9615 CmdArgs.push_back(Output.getFilename());
9616
9617 for (const auto &Input : Inputs)
9618 CmdArgs.push_back(Input.getFilename());
9619
9620 const std::string Assembler = TC.GetProgramPath("as");
9621 Exec = Args.MakeArgString(Assembler);
9622
Justin Bognerd3371d82015-07-17 03:35:54 +00009623 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009624}
9625
Douglas Katzman95354292015-06-23 20:42:09 +00009626void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9627 const InputInfo &Output,
9628 const InputInfoList &Inputs,
9629 const ArgList &Args,
9630 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009631 const auto &TC =
9632 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9633 const llvm::Triple &T = TC.getTriple();
9634 const Driver &D = TC.getDriver();
9635 SmallString<128> EntryPoint;
9636 ArgStringList CmdArgs;
9637 const char *Exec;
9638
9639 // Silence warning for "clang -g foo.o -o foo"
9640 Args.ClaimAllArgs(options::OPT_g_Group);
9641 // and "clang -emit-llvm foo.o -o foo"
9642 Args.ClaimAllArgs(options::OPT_emit_llvm);
9643 // and for "clang -w foo.o -o foo"
9644 Args.ClaimAllArgs(options::OPT_w);
9645 // Other warning options are already handled somewhere else.
9646
9647 if (!D.SysRoot.empty())
9648 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9649
9650 if (Args.hasArg(options::OPT_pie))
9651 CmdArgs.push_back("-pie");
9652 if (Args.hasArg(options::OPT_rdynamic))
9653 CmdArgs.push_back("-export-dynamic");
9654 if (Args.hasArg(options::OPT_s))
9655 CmdArgs.push_back("--strip-all");
9656
9657 CmdArgs.push_back("-m");
9658 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009659 default:
9660 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009661 case llvm::Triple::arm:
9662 case llvm::Triple::thumb:
9663 // FIXME: this is incorrect for WinCE
9664 CmdArgs.push_back("thumb2pe");
9665 break;
9666 case llvm::Triple::x86:
9667 CmdArgs.push_back("i386pe");
9668 EntryPoint.append("_");
9669 break;
9670 case llvm::Triple::x86_64:
9671 CmdArgs.push_back("i386pep");
9672 break;
9673 }
9674
9675 if (Args.hasArg(options::OPT_shared)) {
9676 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009677 default:
9678 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009679 case llvm::Triple::arm:
9680 case llvm::Triple::thumb:
9681 case llvm::Triple::x86_64:
9682 EntryPoint.append("_DllMainCRTStartup");
9683 break;
9684 case llvm::Triple::x86:
9685 EntryPoint.append("_DllMainCRTStartup@12");
9686 break;
9687 }
9688
9689 CmdArgs.push_back("-shared");
9690 CmdArgs.push_back("-Bdynamic");
9691
9692 CmdArgs.push_back("--enable-auto-image-base");
9693
9694 CmdArgs.push_back("--entry");
9695 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9696 } else {
9697 EntryPoint.append("mainCRTStartup");
9698
9699 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9700 : "-Bdynamic");
9701
9702 if (!Args.hasArg(options::OPT_nostdlib) &&
9703 !Args.hasArg(options::OPT_nostartfiles)) {
9704 CmdArgs.push_back("--entry");
9705 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9706 }
9707
9708 // FIXME: handle subsystem
9709 }
9710
9711 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009712 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009713
9714 CmdArgs.push_back("-o");
9715 CmdArgs.push_back(Output.getFilename());
9716
9717 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9718 SmallString<261> ImpLib(Output.getFilename());
9719 llvm::sys::path::replace_extension(ImpLib, ".lib");
9720
9721 CmdArgs.push_back("--out-implib");
9722 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9723 }
9724
9725 if (!Args.hasArg(options::OPT_nostdlib) &&
9726 !Args.hasArg(options::OPT_nostartfiles)) {
9727 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9728 const char *CRTBegin;
9729
9730 CRTBegin =
9731 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9732 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9733 }
9734
9735 Args.AddAllArgs(CmdArgs, options::OPT_L);
9736
9737 const auto &Paths = TC.getFilePaths();
9738 for (const auto &Path : Paths)
9739 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9740
9741 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9742
9743 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9744 !Args.hasArg(options::OPT_nodefaultlibs)) {
9745 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9746 !Args.hasArg(options::OPT_static);
9747 if (StaticCXX)
9748 CmdArgs.push_back("-Bstatic");
9749 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9750 if (StaticCXX)
9751 CmdArgs.push_back("-Bdynamic");
9752 }
9753
9754 if (!Args.hasArg(options::OPT_nostdlib)) {
9755 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9756 // TODO handle /MT[d] /MD[d]
9757 CmdArgs.push_back("-lmsvcrt");
9758 AddRunTimeLibs(TC, D, CmdArgs, Args);
9759 }
9760 }
9761
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009762 if (TC.getSanitizerArgs().needsAsanRt()) {
9763 // TODO handle /MT[d] /MD[d]
9764 if (Args.hasArg(options::OPT_shared)) {
9765 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9766 } else {
9767 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9768 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9769 // Make sure the dynamic runtime thunk is not optimized out at link time
9770 // to ensure proper SEH handling.
9771 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9772 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9773 ? "___asan_seh_interceptor"
9774 : "__asan_seh_interceptor"));
9775 }
9776 }
9777
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009778 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009779
Justin Bognerd3371d82015-07-17 03:35:54 +00009780 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009781}
Douglas Katzman84a75642015-06-19 14:55:19 +00009782
Douglas Katzman95354292015-06-23 20:42:09 +00009783void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9784 const InputInfo &Output,
9785 const InputInfoList &Inputs,
9786 const ArgList &Args,
9787 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009788
9789 ArgStringList CmdArgs;
9790
9791 assert(Inputs.size() == 1);
9792 const InputInfo &II = Inputs[0];
9793 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9794 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9795
Douglas Katzman84a75642015-06-19 14:55:19 +00009796 CmdArgs.push_back("-DMYRIAD2");
9797 CmdArgs.push_back("-mcpu=myriad2");
9798 CmdArgs.push_back("-S");
9799
Douglas Katzmanf6071112015-08-03 14:34:22 +00009800 // Append all -I, -iquote, -isystem paths, defines/undefines,
9801 // 'f' flags, optimize flags, and warning options.
9802 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009803 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9804 options::OPT_D, options::OPT_U,
9805 options::OPT_f_Group, options::OPT_f_clang_Group,
9806 options::OPT_g_Group, options::OPT_M_Group,
9807 options::OPT_O_Group, options::OPT_W_Group});
9808
9809 // If we're producing a dependency file, and assembly is the final action,
9810 // then the name of the target in the dependency file should be the '.o'
9811 // file, not the '.s' file produced by this step. For example, instead of
9812 // /tmp/mumble.s: mumble.c .../someheader.h
9813 // the filename on the lefthand side should be "mumble.o"
9814 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9815 C.getActions().size() == 1 &&
9816 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9817 Arg *A = Args.getLastArg(options::OPT_o);
9818 if (A) {
9819 CmdArgs.push_back("-MT");
9820 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9821 }
9822 }
9823
Douglas Katzman84a75642015-06-19 14:55:19 +00009824 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9825
9826 CmdArgs.push_back(II.getFilename());
9827 CmdArgs.push_back("-o");
9828 CmdArgs.push_back(Output.getFilename());
9829
9830 std::string Exec =
9831 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009832 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9833 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009834}
9835
Douglas Katzman95354292015-06-23 20:42:09 +00009836void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9837 const InputInfo &Output,
9838 const InputInfoList &Inputs,
9839 const ArgList &Args,
9840 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009841 ArgStringList CmdArgs;
9842
9843 assert(Inputs.size() == 1);
9844 const InputInfo &II = Inputs[0];
9845 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9846 assert(Output.getType() == types::TY_Object);
9847
9848 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009849 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009850 CmdArgs.push_back("-noSPrefixing");
9851 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9853 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9854 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009855 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009856 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009857 }
9858 CmdArgs.push_back("-elf"); // Output format.
9859 CmdArgs.push_back(II.getFilename());
9860 CmdArgs.push_back(
9861 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9862
9863 std::string Exec =
9864 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009865 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9866 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009867}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009868
9869void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9870 const InputInfo &Output,
9871 const InputInfoList &Inputs,
9872 const ArgList &Args,
9873 const char *LinkingOutput) const {
9874 const auto &TC =
9875 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9876 const llvm::Triple &T = TC.getTriple();
9877 ArgStringList CmdArgs;
9878 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009879 bool UseDefaultLibs = !Args.hasArg(options::OPT_nostdlib) &&
9880 !Args.hasArg(options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009881
9882 std::string StartFilesDir, BuiltinLibDir;
9883 TC.getCompilerSupportDir(StartFilesDir);
9884 TC.getBuiltinLibDir(BuiltinLibDir);
9885
9886 if (T.getArch() == llvm::Triple::sparc)
9887 CmdArgs.push_back("-EB");
9888 else // SHAVE assumes little-endian, and sparcel is expressly so.
9889 CmdArgs.push_back("-EL");
9890
9891 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9892 // but we never pass through a --sysroot option and various other bits.
9893 // For example, there are no sanitizers (yet) nor gold linker.
9894
9895 // Eat some arguments that may be present but have no effect.
9896 Args.ClaimAllArgs(options::OPT_g_Group);
9897 Args.ClaimAllArgs(options::OPT_w);
9898 Args.ClaimAllArgs(options::OPT_static_libgcc);
9899
9900 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9901 CmdArgs.push_back("-s");
9902
9903 CmdArgs.push_back("-o");
9904 CmdArgs.push_back(Output.getFilename());
9905
9906 if (UseStartfiles) {
9907 // If you want startfiles, it means you want the builtin crti and crtbegin,
9908 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9909 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9910 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9911 }
9912
9913 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9914 options::OPT_e, options::OPT_s, options::OPT_t,
9915 options::OPT_Z_Flag, options::OPT_r});
9916
Douglas Katzman526b5f92015-10-21 19:33:54 +00009917 // The linker doesn't use these builtin paths unless directed to,
9918 // because it was not compiled for support with sysroots, nor does
9919 // it have a default of little-endian with FPU.
9920 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9921 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009922
9923 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9924
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009925 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +00009926 if (C.getDriver().CCCIsCXX())
9927 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009928 if (T.getOS() == llvm::Triple::RTEMS) {
9929 CmdArgs.push_back("--start-group");
9930 CmdArgs.push_back("-lc");
9931 // You must provide your own "-L" option to enable finding these.
9932 CmdArgs.push_back("-lrtemscpu");
9933 CmdArgs.push_back("-lrtemsbsp");
9934 CmdArgs.push_back("--end-group");
9935 } else {
9936 CmdArgs.push_back("-lc");
9937 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +00009938 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009939 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009940 if (UseStartfiles) {
9941 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9942 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9943 }
9944
9945 std::string Exec =
9946 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9947 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9948 CmdArgs, Inputs));
9949}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00009950
9951void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
9952 const InputInfo &Output,
9953 const InputInfoList &Inputs,
9954 const ArgList &Args,
9955 const char *LinkingOutput) const {
9956 claimNoWarnArgs(Args);
9957 ArgStringList CmdArgs;
9958
9959 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9960
9961 CmdArgs.push_back("-o");
9962 CmdArgs.push_back(Output.getFilename());
9963
9964 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
9965 const InputInfo &Input = Inputs[0];
9966 assert(Input.isFilename() && "Invalid input.");
9967 CmdArgs.push_back(Input.getFilename());
9968
9969 const char *Exec =
9970 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
9971 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
9972}
9973
9974static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
9975 ArgStringList &CmdArgs) {
9976 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
9977 false) ||
9978 Args.hasArg(options::OPT_fprofile_generate) ||
9979 Args.hasArg(options::OPT_fprofile_instr_generate) ||
9980 Args.hasArg(options::OPT_fcreate_profile) ||
9981 Args.hasArg(options::OPT_coverage)))
9982 return;
9983
9984 assert(TC.getTriple().isPS4CPU() &&
9985 "Profiling libraries are only implemented for the PS4 CPU");
9986 CmdArgs.push_back("-lclang_rt.profile-x86_64");
9987}
9988
9989static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
9990 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
9991 if (SanArgs.needsUbsanRt()) {
9992 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
9993 }
9994 if (SanArgs.needsAsanRt()) {
9995 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
9996 }
9997}
9998
9999static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10000 const JobAction &JA, const InputInfo &Output,
10001 const InputInfoList &Inputs,
10002 const ArgList &Args,
10003 const char *LinkingOutput) {
10004 const toolchains::FreeBSD &ToolChain =
10005 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10006 const Driver &D = ToolChain.getDriver();
10007 ArgStringList CmdArgs;
10008
10009 // Silence warning for "clang -g foo.o -o foo"
10010 Args.ClaimAllArgs(options::OPT_g_Group);
10011 // and "clang -emit-llvm foo.o -o foo"
10012 Args.ClaimAllArgs(options::OPT_emit_llvm);
10013 // and for "clang -w foo.o -o foo". Other warning options are already
10014 // handled somewhere else.
10015 Args.ClaimAllArgs(options::OPT_w);
10016
10017 if (!D.SysRoot.empty())
10018 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10019
10020 if (Args.hasArg(options::OPT_pie))
10021 CmdArgs.push_back("-pie");
10022
10023 if (Args.hasArg(options::OPT_rdynamic))
10024 CmdArgs.push_back("-export-dynamic");
10025 if (Args.hasArg(options::OPT_shared))
10026 CmdArgs.push_back("--oformat=so");
10027
10028 if (Output.isFilename()) {
10029 CmdArgs.push_back("-o");
10030 CmdArgs.push_back(Output.getFilename());
10031 } else {
10032 assert(Output.isNothing() && "Invalid output.");
10033 }
10034
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010035 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10036
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010037 Args.AddAllArgs(CmdArgs, options::OPT_L);
10038 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10039 Args.AddAllArgs(CmdArgs, options::OPT_e);
10040 Args.AddAllArgs(CmdArgs, options::OPT_s);
10041 Args.AddAllArgs(CmdArgs, options::OPT_t);
10042 Args.AddAllArgs(CmdArgs, options::OPT_r);
10043
10044 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10045 CmdArgs.push_back("--no-demangle");
10046
10047 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10048
10049 if (Args.hasArg(options::OPT_pthread)) {
10050 CmdArgs.push_back("-lpthread");
10051 }
10052
10053 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010054
10055 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10056
10057 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10058}
10059
10060static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10061 const JobAction &JA, const InputInfo &Output,
10062 const InputInfoList &Inputs,
10063 const ArgList &Args,
10064 const char *LinkingOutput) {
10065 const toolchains::FreeBSD &ToolChain =
10066 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10067 const Driver &D = ToolChain.getDriver();
10068 ArgStringList CmdArgs;
10069
10070 // Silence warning for "clang -g foo.o -o foo"
10071 Args.ClaimAllArgs(options::OPT_g_Group);
10072 // and "clang -emit-llvm foo.o -o foo"
10073 Args.ClaimAllArgs(options::OPT_emit_llvm);
10074 // and for "clang -w foo.o -o foo". Other warning options are already
10075 // handled somewhere else.
10076 Args.ClaimAllArgs(options::OPT_w);
10077
10078 if (!D.SysRoot.empty())
10079 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10080
10081 if (Args.hasArg(options::OPT_pie))
10082 CmdArgs.push_back("-pie");
10083
10084 if (Args.hasArg(options::OPT_static)) {
10085 CmdArgs.push_back("-Bstatic");
10086 } else {
10087 if (Args.hasArg(options::OPT_rdynamic))
10088 CmdArgs.push_back("-export-dynamic");
10089 CmdArgs.push_back("--eh-frame-hdr");
10090 if (Args.hasArg(options::OPT_shared)) {
10091 CmdArgs.push_back("-Bshareable");
10092 } else {
10093 CmdArgs.push_back("-dynamic-linker");
10094 CmdArgs.push_back("/libexec/ld-elf.so.1");
10095 }
10096 CmdArgs.push_back("--enable-new-dtags");
10097 }
10098
10099 if (Output.isFilename()) {
10100 CmdArgs.push_back("-o");
10101 CmdArgs.push_back(Output.getFilename());
10102 } else {
10103 assert(Output.isNothing() && "Invalid output.");
10104 }
10105
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010106 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10107
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010108 if (!Args.hasArg(options::OPT_nostdlib) &&
10109 !Args.hasArg(options::OPT_nostartfiles)) {
10110 const char *crt1 = NULL;
10111 if (!Args.hasArg(options::OPT_shared)) {
10112 if (Args.hasArg(options::OPT_pg))
10113 crt1 = "gcrt1.o";
10114 else if (Args.hasArg(options::OPT_pie))
10115 crt1 = "Scrt1.o";
10116 else
10117 crt1 = "crt1.o";
10118 }
10119 if (crt1)
10120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10121
10122 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10123
10124 const char *crtbegin = NULL;
10125 if (Args.hasArg(options::OPT_static))
10126 crtbegin = "crtbeginT.o";
10127 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10128 crtbegin = "crtbeginS.o";
10129 else
10130 crtbegin = "crtbegin.o";
10131
10132 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10133 }
10134
10135 Args.AddAllArgs(CmdArgs, options::OPT_L);
10136
10137 const ToolChain::path_list Paths = ToolChain.getFilePaths();
10138 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
10139 i != e; ++i)
10140 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
10141
10142 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10143 Args.AddAllArgs(CmdArgs, options::OPT_e);
10144 Args.AddAllArgs(CmdArgs, options::OPT_s);
10145 Args.AddAllArgs(CmdArgs, options::OPT_t);
10146 Args.AddAllArgs(CmdArgs, options::OPT_r);
10147
10148 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10149 CmdArgs.push_back("--no-demangle");
10150
10151 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10152
10153 if (!Args.hasArg(options::OPT_nostdlib) &&
10154 !Args.hasArg(options::OPT_nodefaultlibs)) {
10155 // For PS4, we always want to pass libm, libstdc++ and libkernel
10156 // libraries for both C and C++ compilations.
10157 CmdArgs.push_back("-lkernel");
10158 if (D.CCCIsCXX()) {
10159 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10160 if (Args.hasArg(options::OPT_pg))
10161 CmdArgs.push_back("-lm_p");
10162 else
10163 CmdArgs.push_back("-lm");
10164 }
10165 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10166 // the default system libraries. Just mimic this for now.
10167 if (Args.hasArg(options::OPT_pg))
10168 CmdArgs.push_back("-lgcc_p");
10169 else
10170 CmdArgs.push_back("-lcompiler_rt");
10171 if (Args.hasArg(options::OPT_static)) {
10172 CmdArgs.push_back("-lstdc++");
10173 } else if (Args.hasArg(options::OPT_pg)) {
10174 CmdArgs.push_back("-lgcc_eh_p");
10175 } else {
10176 CmdArgs.push_back("--as-needed");
10177 CmdArgs.push_back("-lstdc++");
10178 CmdArgs.push_back("--no-as-needed");
10179 }
10180
10181 if (Args.hasArg(options::OPT_pthread)) {
10182 if (Args.hasArg(options::OPT_pg))
10183 CmdArgs.push_back("-lpthread_p");
10184 else
10185 CmdArgs.push_back("-lpthread");
10186 }
10187
10188 if (Args.hasArg(options::OPT_pg)) {
10189 if (Args.hasArg(options::OPT_shared))
10190 CmdArgs.push_back("-lc");
10191 else {
10192 if (Args.hasArg(options::OPT_static)) {
10193 CmdArgs.push_back("--start-group");
10194 CmdArgs.push_back("-lc_p");
10195 CmdArgs.push_back("-lpthread_p");
10196 CmdArgs.push_back("--end-group");
10197 } else {
10198 CmdArgs.push_back("-lc_p");
10199 }
10200 }
10201 CmdArgs.push_back("-lgcc_p");
10202 } else {
10203 if (Args.hasArg(options::OPT_static)) {
10204 CmdArgs.push_back("--start-group");
10205 CmdArgs.push_back("-lc");
10206 CmdArgs.push_back("-lpthread");
10207 CmdArgs.push_back("--end-group");
10208 } else {
10209 CmdArgs.push_back("-lc");
10210 }
10211 CmdArgs.push_back("-lcompiler_rt");
10212 }
10213
10214 if (Args.hasArg(options::OPT_static)) {
10215 CmdArgs.push_back("-lstdc++");
10216 } else if (Args.hasArg(options::OPT_pg)) {
10217 CmdArgs.push_back("-lgcc_eh_p");
10218 } else {
10219 CmdArgs.push_back("--as-needed");
10220 CmdArgs.push_back("-lstdc++");
10221 CmdArgs.push_back("--no-as-needed");
10222 }
10223 }
10224
10225 if (!Args.hasArg(options::OPT_nostdlib) &&
10226 !Args.hasArg(options::OPT_nostartfiles)) {
10227 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10228 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10229 else
10230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10231 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10232 }
10233
10234 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010235
10236 const char *Exec =
10237#ifdef LLVM_ON_WIN32
10238 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10239#else
10240 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10241#endif
10242
10243 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10244}
10245
10246void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10247 const InputInfo &Output,
10248 const InputInfoList &Inputs,
10249 const ArgList &Args,
10250 const char *LinkingOutput) const {
10251 const toolchains::FreeBSD &ToolChain =
10252 static_cast<const toolchains::FreeBSD &>(getToolChain());
10253 const Driver &D = ToolChain.getDriver();
10254 bool PS4Linker;
10255 StringRef LinkerOptName;
10256 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10257 LinkerOptName = A->getValue();
10258 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10259 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10260 }
10261
10262 if (LinkerOptName == "gold")
10263 PS4Linker = false;
10264 else if (LinkerOptName == "ps4")
10265 PS4Linker = true;
10266 else
10267 PS4Linker = !Args.hasArg(options::OPT_shared);
10268
10269 if (PS4Linker)
10270 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10271 else
10272 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10273}