blob: f4070217b41e97595e4d7953934288228048c83c [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
405 // Add -Wp, and -Xassembler if using the preprocessor.
406
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:
614 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000615 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000616 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000617 break;
618 }
619
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000620 // FIXME: this is invalid for WindowsCE
621 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000622 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000623 break;
624
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000625 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000626 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000627 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000628 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000629 break;
630 default:
631 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000632 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000633 break;
634 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000635 break;
636
Daniel Dunbar78485922009-09-10 23:00:09 +0000637 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000638 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000639 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000640 case llvm::Triple::EABIHF:
641 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000642 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000643 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000644 case llvm::Triple::EABI:
645 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000646 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000648 case llvm::Triple::Android:
649 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000651 default:
652 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000653 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000654 if (Triple.getOS() != llvm::Triple::UnknownOS ||
655 !Triple.isOSBinFormatMachO())
656 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000657 break;
658 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000659 }
660 }
661
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000662 assert(ABI != FloatABI::Invalid && "must select an ABI");
663 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664}
665
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000666static void getARMTargetFeatures(const ToolChain &TC,
667 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000668 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000669 std::vector<const char *> &Features,
670 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000671 const Driver &D = TC.getDriver();
672
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000673 bool KernelOrKext =
674 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000675 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000676 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
677 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
678
Nico Weber6e0ebae2015-04-29 21:16:40 +0000679 if (!ForAS) {
680 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
681 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
682 // stripped out by the ARM target. We should probably pass this a new
683 // -target-option, which is handled by the -cc1/-cc1as invocation.
684 //
685 // FIXME2: For consistency, it would be ideal if we set up the target
686 // machine state the same when using the frontend or the assembler. We don't
687 // currently do that for the assembler, we pass the options directly to the
688 // backend and never even instantiate the frontend TargetInfo. If we did,
689 // and used its handleTargetFeatures hook, then we could ensure the
690 // assembler and the frontend behave the same.
691
692 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000693 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000694 Features.push_back("+soft-float");
695
696 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000698 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000699 } else {
700 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
701 // to the assembler correctly.
702 for (const Arg *A :
703 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
704 StringRef Value = A->getValue();
705 if (Value.startswith("-mfpu=")) {
706 WaFPU = A;
707 } else if (Value.startswith("-mcpu=")) {
708 WaCPU = A;
709 } else if (Value.startswith("-mhwdiv=")) {
710 WaHDiv = A;
711 } else if (Value.startswith("-march=")) {
712 WaArch = A;
713 }
714 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000715 }
716
Renato Golin7c542b42015-07-27 23:44:45 +0000717 // Check -march. ClangAs gives preference to -Wa,-march=.
718 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000719 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000720 if (WaArch) {
721 if (ArchArg)
722 D.Diag(clang::diag::warn_drv_unused_argument)
723 << ArchArg->getAsString(Args);
724 ArchName = StringRef(WaArch->getValue()).substr(7);
725 checkARMArchName(D, WaArch, Args, ArchName, Triple);
726 // FIXME: Set Arch.
727 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
728 } else if (ArchArg) {
729 ArchName = ArchArg->getValue();
730 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000731 }
732
Renato Golin7c542b42015-07-27 23:44:45 +0000733 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
734 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000735 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000736 if (WaCPU) {
737 if (CPUArg)
738 D.Diag(clang::diag::warn_drv_unused_argument)
739 << CPUArg->getAsString(Args);
740 CPUName = StringRef(WaCPU->getValue()).substr(6);
741 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
742 } else if (CPUArg) {
743 CPUName = CPUArg->getValue();
744 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000745 }
John Brawna95c1a82015-05-08 12:52:18 +0000746
Renato Golin23459c62015-07-30 16:40:17 +0000747 // Add CPU features for generic CPUs
748 if (CPUName == "native") {
749 llvm::StringMap<bool> HostFeatures;
750 if (llvm::sys::getHostCPUFeatures(HostFeatures))
751 for (auto &F : HostFeatures)
752 Features.push_back(
753 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
754 }
755
756 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
757 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
758 if (WaFPU) {
759 if (FPUArg)
760 D.Diag(clang::diag::warn_drv_unused_argument)
761 << FPUArg->getAsString(Args);
762 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
763 Features);
764 } else if (FPUArg) {
765 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
766 }
767
768 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
769 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
770 if (WaHDiv) {
771 if (HDivArg)
772 D.Diag(clang::diag::warn_drv_unused_argument)
773 << HDivArg->getAsString(Args);
774 getARMHWDivFeatures(D, WaHDiv, Args,
775 StringRef(WaHDiv->getValue()).substr(8), Features);
776 } else if (HDivArg)
777 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
778
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000779 // Setting -msoft-float effectively disables NEON because of the GCC
780 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000782 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000783 // Also need to explicitly disable features which imply NEON.
784 Features.push_back("-crypto");
785 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000786
Eric Christopher269c2a22015-04-04 03:34:43 +0000787 // En/disable crc code generation.
788 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000789 if (A->getOption().matches(options::OPT_mcrc))
790 Features.push_back("+crc");
791 else
792 Features.push_back("-crc");
793 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000794
795 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
796 Features.insert(Features.begin(), "+v8.1a");
797 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000798
Akira Hatanakac2694822015-07-07 08:28:42 +0000799 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
800 // neither options are specified, see if we are compiling for kernel/kext and
801 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000802 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
803 options::OPT_mno_long_calls)) {
804 if (A->getOption().matches(options::OPT_mlong_calls))
805 Features.push_back("+long-calls");
806 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
807 Features.push_back("+long-calls");
808 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000809
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000810 // Kernel code has more strict alignment requirements.
811 if (KernelOrKext)
812 Features.push_back("+strict-align");
813 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
814 options::OPT_munaligned_access)) {
815 if (A->getOption().matches(options::OPT_munaligned_access)) {
816 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
817 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
818 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
819 } else
820 Features.push_back("+strict-align");
821 } else {
822 // Assume pre-ARMv6 doesn't support unaligned accesses.
823 //
824 // ARMv6 may or may not support unaligned accesses depending on the
825 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
826 // Darwin and NetBSD targets support unaligned accesses, and others don't.
827 //
828 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
829 // which raises an alignment fault on unaligned accesses. Linux
830 // defaults this bit to 0 and handles it as a system-wide (not
831 // per-process) setting. It is therefore safe to assume that ARMv7+
832 // Linux targets support unaligned accesses. The same goes for NaCl.
833 //
834 // The above behavior is consistent with GCC.
835 int VersionNum = getARMSubArchVersionNumber(Triple);
836 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
837 if (VersionNum < 6)
838 Features.push_back("+strict-align");
839 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
840 if (VersionNum < 7)
841 Features.push_back("+strict-align");
842 } else
843 Features.push_back("+strict-align");
844 }
845
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000846 // llvm does not support reserving registers in general. There is support
847 // for reserving r9 on ARM though (defined as a platform-specific register
848 // in ARM EABI).
849 if (Args.hasArg(options::OPT_ffixed_r9))
850 Features.push_back("+reserve-r9");
851
Akira Hatanaka580efb22015-07-16 00:43:00 +0000852 // The kext linker doesn't know how to deal with movw/movt.
853 if (KernelOrKext)
854 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000855}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000856
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000857void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
858 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000860 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000861 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000862 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000863 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000864 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000865 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000866 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000867 ABIName = "aapcs";
868 } else {
869 ABIName = "apcs-gnu";
870 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000871 } else if (Triple.isOSWindows()) {
872 // FIXME: this is invalid for WindowsCE
873 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000874 } else {
875 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000876 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000877 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000878 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000879 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000880 ABIName = "aapcs-linux";
881 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000882 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000883 case llvm::Triple::EABI:
884 ABIName = "aapcs";
885 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000886 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000887 if (Triple.getOS() == llvm::Triple::NetBSD)
888 ABIName = "apcs-gnu";
889 else
890 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000891 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000892 }
893 }
894 CmdArgs.push_back("-target-abi");
895 CmdArgs.push_back(ABIName);
896
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000897 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000898 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000899 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000900 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000901 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000902 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000903 CmdArgs.push_back("-mfloat-abi");
904 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000905 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000906 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000907 CmdArgs.push_back("-mfloat-abi");
908 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000909 } else {
910 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000911 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000912 CmdArgs.push_back("-mfloat-abi");
913 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000914 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000915
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000916 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000917 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
918 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000919 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000920 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000921 CmdArgs.push_back("-arm-global-merge=false");
922 else
923 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000924 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000925
Bob Wilson9c8af452013-04-11 18:53:25 +0000926 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000927 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000928 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000929}
Renato Goline17c5802015-07-27 23:44:42 +0000930// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000931
Tim Northover573cbee2014-05-24 12:52:07 +0000932/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
933/// targeting.
934static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000935 Arg *A;
936 std::string CPU;
937 // If we have -mtune or -mcpu, use that.
938 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000939 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000940 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000941 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000942 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000943 }
944
Kevin Qin110db6f2014-07-18 07:03:22 +0000945 // Handle CPU name is 'native'.
946 if (CPU == "native")
947 return llvm::sys::getHostCPUName();
948 else if (CPU.size())
949 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000950
James Molloy9b1586b2014-04-17 12:51:17 +0000951 // Make sure we pick "cyclone" if -arch is used.
952 // FIXME: Should this be picked by checking the target triple instead?
953 if (Args.getLastArg(options::OPT_arch))
954 return "cyclone";
955
956 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000957}
958
Tim Northover573cbee2014-05-24 12:52:07 +0000959void Clang::AddAArch64TargetArgs(const ArgList &Args,
960 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000961 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
962 llvm::Triple Triple(TripleStr);
963
964 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
965 Args.hasArg(options::OPT_mkernel) ||
966 Args.hasArg(options::OPT_fapple_kext))
967 CmdArgs.push_back("-disable-red-zone");
968
969 if (!Args.hasFlag(options::OPT_mimplicit_float,
970 options::OPT_mno_implicit_float, true))
971 CmdArgs.push_back("-no-implicit-float");
972
Craig Topper92fc2df2014-05-17 16:56:41 +0000973 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000974 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
975 ABIName = A->getValue();
976 else if (Triple.isOSDarwin())
977 ABIName = "darwinpcs";
978 else
979 ABIName = "aapcs";
980
981 CmdArgs.push_back("-target-abi");
982 CmdArgs.push_back(ABIName);
983
Bradley Smith9ff64332014-10-13 10:16:06 +0000984 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
985 options::OPT_mno_fix_cortex_a53_835769)) {
986 CmdArgs.push_back("-backend-option");
987 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
988 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
989 else
990 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +0000991 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
992 // Enabled A53 errata (835769) workaround by default on android
993 CmdArgs.push_back("-backend-option");
994 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +0000995 }
996
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000997 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000998 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
999 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001000 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001001 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001002 CmdArgs.push_back("-aarch64-global-merge=false");
1003 else
1004 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001005 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001006}
1007
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001008// Get CPU and ABI names. They are not independent
1009// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001010void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1011 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001012 const char *DefMips32CPU = "mips32r2";
1013 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001014
Daniel Sanders2bf13662014-07-10 14:40:57 +00001015 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1016 // default for mips64(el)?-img-linux-gnu.
1017 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1018 Triple.getEnvironment() == llvm::Triple::GNU) {
1019 DefMips32CPU = "mips32r6";
1020 DefMips64CPU = "mips64r6";
1021 }
Renato Golin7c542b42015-07-27 23:44:45 +00001022
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001023 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1024 if (Triple.getEnvironment() == llvm::Triple::Android)
1025 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001026
Brad Smithba26f582015-01-06 02:53:17 +00001027 // MIPS3 is the default for mips64*-unknown-openbsd.
1028 if (Triple.getOS() == llvm::Triple::OpenBSD)
1029 DefMips64CPU = "mips3";
1030
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001031 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001032 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001033
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001034 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001035 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001036 // Convert a GNU style Mips ABI name to the name
1037 // accepted by LLVM Mips backend.
1038 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001039 .Case("32", "o32")
1040 .Case("64", "n64")
1041 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001042 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001043
1044 // Setup default CPU and ABI names.
1045 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001046 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001047 default:
1048 llvm_unreachable("Unexpected triple arch name");
1049 case llvm::Triple::mips:
1050 case llvm::Triple::mipsel:
1051 CPUName = DefMips32CPU;
1052 break;
1053 case llvm::Triple::mips64:
1054 case llvm::Triple::mips64el:
1055 CPUName = DefMips64CPU;
1056 break;
1057 }
1058 }
1059
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001060 if (ABIName.empty()) {
1061 // Deduce ABI name from the target triple.
1062 if (Triple.getArch() == llvm::Triple::mips ||
1063 Triple.getArch() == llvm::Triple::mipsel)
1064 ABIName = "o32";
1065 else
1066 ABIName = "n64";
1067 }
1068
1069 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001070 // Deduce CPU name from ABI name.
1071 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001072 .Cases("o32", "eabi", DefMips32CPU)
1073 .Cases("n32", "n64", DefMips64CPU)
1074 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001075 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001076
1077 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001078}
1079
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001080// Convert ABI name to the GNU tools acceptable variant.
1081static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1082 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083 .Case("o32", "32")
1084 .Case("n64", "64")
1085 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001086}
1087
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001088// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1089// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001090static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1091 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 if (Arg *A =
1093 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1094 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001095 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001096 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001097 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001098 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001099 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001100 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1101 .Case("soft", mips::FloatABI::Soft)
1102 .Case("hard", mips::FloatABI::Hard)
1103 .Default(mips::FloatABI::Invalid);
1104 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001105 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001106 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001107 }
1108 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001109 }
1110
1111 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001112 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 // Assume "hard", because it's a default value used by gcc.
1114 // When we start to recognize specific target MIPS processors,
1115 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001116 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001117 }
1118
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001119 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1120 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001121}
1122
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001123static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001124 std::vector<const char *> &Features,
1125 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001126 StringRef FeatureName) {
1127 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001128 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001129 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001130 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001131 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 }
1133}
1134
Daniel Sanders379d44b2014-07-16 11:52:23 +00001135static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1136 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001137 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001138 StringRef CPUName;
1139 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001140 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001141 ABIName = getGnuCompatibleMipsABIName(ABIName);
1142
Daniel Sandersfeb61302014-08-08 15:47:17 +00001143 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1144 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001145
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001146 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1147 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001148 // FIXME: Note, this is a hack. We need to pass the selected float
1149 // mode to the MipsTargetInfoBase to define appropriate macros there.
1150 // Now it is the only method.
1151 Features.push_back("+soft-float");
1152 }
1153
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001155 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001156 if (Val == "2008") {
1157 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1158 Features.push_back("+nan2008");
1159 else {
1160 Features.push_back("-nan2008");
1161 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1162 }
1163 } else if (Val == "legacy") {
1164 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1165 Features.push_back("-nan2008");
1166 else {
1167 Features.push_back("+nan2008");
1168 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1169 }
1170 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001171 D.Diag(diag::err_drv_unsupported_option_argument)
1172 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001173 }
1174
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001175 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1176 options::OPT_mdouble_float, "single-float");
1177 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1178 "mips16");
1179 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1180 options::OPT_mno_micromips, "micromips");
1181 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1182 "dsp");
1183 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1184 "dspr2");
1185 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1186 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001187
1188 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1189 // pass -mfpxx
1190 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1191 options::OPT_mfp64)) {
1192 if (A->getOption().matches(options::OPT_mfp32))
1193 Features.push_back(Args.MakeArgString("-fp64"));
1194 else if (A->getOption().matches(options::OPT_mfpxx)) {
1195 Features.push_back(Args.MakeArgString("+fpxx"));
1196 Features.push_back(Args.MakeArgString("+nooddspreg"));
1197 } else
1198 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001199 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001200 Features.push_back(Args.MakeArgString("+fpxx"));
1201 Features.push_back(Args.MakeArgString("+nooddspreg"));
1202 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001203
Daniel Sanders28e5d392014-07-10 10:39:51 +00001204 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1205 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001206}
1207
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001208void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001209 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001210 const Driver &D = getToolChain().getDriver();
1211 StringRef CPUName;
1212 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001213 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001214 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001215
1216 CmdArgs.push_back("-target-abi");
1217 CmdArgs.push_back(ABIName.data());
1218
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001219 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1220 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001221 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001222 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001223 CmdArgs.push_back("-mfloat-abi");
1224 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001225 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001226 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001227 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001228 CmdArgs.push_back("-mfloat-abi");
1229 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001230 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001231
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001232 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1233 if (A->getOption().matches(options::OPT_mxgot)) {
1234 CmdArgs.push_back("-mllvm");
1235 CmdArgs.push_back("-mxgot");
1236 }
1237 }
1238
Simon Atanasyanc580b322013-05-11 06:33:44 +00001239 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1240 options::OPT_mno_ldc1_sdc1)) {
1241 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1242 CmdArgs.push_back("-mllvm");
1243 CmdArgs.push_back("-mno-ldc1-sdc1");
1244 }
1245 }
1246
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001247 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1248 options::OPT_mno_check_zero_division)) {
1249 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1250 CmdArgs.push_back("-mllvm");
1251 CmdArgs.push_back("-mno-check-zero-division");
1252 }
1253 }
1254
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001255 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001256 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001257 CmdArgs.push_back("-mllvm");
1258 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1259 A->claim();
1260 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001261}
1262
Hal Finkel8eb59282012-06-11 22:35:19 +00001263/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1264static std::string getPPCTargetCPU(const ArgList &Args) {
1265 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001266 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001267
1268 if (CPUName == "native") {
1269 std::string CPU = llvm::sys::getHostCPUName();
1270 if (!CPU.empty() && CPU != "generic")
1271 return CPU;
1272 else
1273 return "";
1274 }
1275
1276 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001277 .Case("common", "generic")
1278 .Case("440", "440")
1279 .Case("440fp", "440")
1280 .Case("450", "450")
1281 .Case("601", "601")
1282 .Case("602", "602")
1283 .Case("603", "603")
1284 .Case("603e", "603e")
1285 .Case("603ev", "603ev")
1286 .Case("604", "604")
1287 .Case("604e", "604e")
1288 .Case("620", "620")
1289 .Case("630", "pwr3")
1290 .Case("G3", "g3")
1291 .Case("7400", "7400")
1292 .Case("G4", "g4")
1293 .Case("7450", "7450")
1294 .Case("G4+", "g4+")
1295 .Case("750", "750")
1296 .Case("970", "970")
1297 .Case("G5", "g5")
1298 .Case("a2", "a2")
1299 .Case("a2q", "a2q")
1300 .Case("e500mc", "e500mc")
1301 .Case("e5500", "e5500")
1302 .Case("power3", "pwr3")
1303 .Case("power4", "pwr4")
1304 .Case("power5", "pwr5")
1305 .Case("power5x", "pwr5x")
1306 .Case("power6", "pwr6")
1307 .Case("power6x", "pwr6x")
1308 .Case("power7", "pwr7")
1309 .Case("power8", "pwr8")
1310 .Case("pwr3", "pwr3")
1311 .Case("pwr4", "pwr4")
1312 .Case("pwr5", "pwr5")
1313 .Case("pwr5x", "pwr5x")
1314 .Case("pwr6", "pwr6")
1315 .Case("pwr6x", "pwr6x")
1316 .Case("pwr7", "pwr7")
1317 .Case("pwr8", "pwr8")
1318 .Case("powerpc", "ppc")
1319 .Case("powerpc64", "ppc64")
1320 .Case("powerpc64le", "ppc64le")
1321 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001322 }
1323
1324 return "";
1325}
1326
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001327static void getPPCTargetFeatures(const ArgList &Args,
1328 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001329 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1330 StringRef Name = A->getOption().getName();
1331 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001332
1333 // Skip over "-m".
1334 assert(Name.startswith("m") && "Invalid feature name.");
1335 Name = Name.substr(1);
1336
1337 bool IsNegative = Name.startswith("no-");
1338 if (IsNegative)
1339 Name = Name.substr(3);
1340
1341 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1342 // pass the correct option to the backend while calling the frontend
1343 // option the same.
1344 // TODO: Change the LLVM backend option maybe?
1345 if (Name == "mfcrf")
1346 Name = "mfocrf";
1347
1348 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1349 }
1350
1351 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001352 AddTargetFeature(Args, Features, options::OPT_faltivec,
1353 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001354}
1355
Ulrich Weigand8afad612014-07-28 13:17:52 +00001356void Clang::AddPPCTargetArgs(const ArgList &Args,
1357 ArgStringList &CmdArgs) const {
1358 // Select the ABI to use.
1359 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001360 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001361 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001362 case llvm::Triple::ppc64: {
1363 // When targeting a processor that supports QPX, or if QPX is
1364 // specifically enabled, default to using the ABI that supports QPX (so
1365 // long as it is not specifically disabled).
1366 bool HasQPX = false;
1367 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1368 HasQPX = A->getValue() == StringRef("a2q");
1369 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1370 if (HasQPX) {
1371 ABIName = "elfv1-qpx";
1372 break;
1373 }
1374
Ulrich Weigand8afad612014-07-28 13:17:52 +00001375 ABIName = "elfv1";
1376 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001377 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001378 case llvm::Triple::ppc64le:
1379 ABIName = "elfv2";
1380 break;
1381 default:
1382 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001383 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001384
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001385 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1386 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1387 // the option if given as we don't have backend support for any targets
1388 // that don't use the altivec abi.
1389 if (StringRef(A->getValue()) != "altivec")
1390 ABIName = A->getValue();
1391
Ulrich Weigand8afad612014-07-28 13:17:52 +00001392 if (ABIName) {
1393 CmdArgs.push_back("-target-abi");
1394 CmdArgs.push_back(ABIName);
1395 }
1396}
1397
1398bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1399 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1400 return A && (A->getValue() == StringRef(Value));
1401}
1402
Tom Stellard6674c702013-04-01 20:56:53 +00001403/// Get the (LLVM) name of the R600 gpu we are targeting.
1404static std::string getR600TargetGPU(const ArgList &Args) {
1405 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001406 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001407 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001408 .Cases("rv630", "rv635", "r600")
1409 .Cases("rv610", "rv620", "rs780", "rs880")
1410 .Case("rv740", "rv770")
1411 .Case("palm", "cedar")
1412 .Cases("sumo", "sumo2", "sumo")
1413 .Case("hemlock", "cypress")
1414 .Case("aruba", "cayman")
1415 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001416 }
1417 return "";
1418}
1419
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001420void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001421 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001422 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001423 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001424
James Y Knightb2406522015-06-15 20:51:24 +00001425 bool SoftFloatABI = false;
1426 if (Arg *A =
1427 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001428 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001429 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001430 }
1431
James Y Knightb2406522015-06-15 20:51:24 +00001432 // Only the hard-float ABI on Sparc is standardized, and it is the
1433 // default. GCC also supports a nonstandard soft-float ABI mode, and
1434 // perhaps LLVM should implement that, too. However, since llvm
1435 // currently does not support Sparc soft-float, at all, display an
1436 // error if it's requested.
1437 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001438 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1439 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001440 }
1441}
1442
Richard Sandiford4652d892013-07-19 16:51:51 +00001443static const char *getSystemZTargetCPU(const ArgList &Args) {
1444 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1445 return A->getValue();
1446 return "z10";
1447}
1448
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001449static void getSystemZTargetFeatures(const ArgList &Args,
1450 std::vector<const char *> &Features) {
1451 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001452 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001453 if (A->getOption().matches(options::OPT_mhtm))
1454 Features.push_back("+transactional-execution");
1455 else
1456 Features.push_back("-transactional-execution");
1457 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001458 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001460 if (A->getOption().matches(options::OPT_mvx))
1461 Features.push_back("+vector");
1462 else
1463 Features.push_back("-vector");
1464 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001465}
1466
Chandler Carruth953fb082013-01-13 11:46:33 +00001467static const char *getX86TargetCPU(const ArgList &Args,
1468 const llvm::Triple &Triple) {
1469 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001470 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001471 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001472 return "core-avx2";
1473
Chandler Carruth953fb082013-01-13 11:46:33 +00001474 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001475 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001476
1477 // FIXME: Reject attempts to use -march=native unless the target matches
1478 // the host.
1479 //
1480 // FIXME: We should also incorporate the detected target features for use
1481 // with -native.
1482 std::string CPU = llvm::sys::getHostCPUName();
1483 if (!CPU.empty() && CPU != "generic")
1484 return Args.MakeArgString(CPU);
1485 }
1486
Reid Kleckner3123eff2015-06-30 16:32:04 +00001487 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1488 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1489 StringRef Arch = A->getValue();
1490 const char *CPU;
1491 if (Triple.getArch() == llvm::Triple::x86) {
1492 CPU = llvm::StringSwitch<const char *>(Arch)
1493 .Case("IA32", "i386")
1494 .Case("SSE", "pentium3")
1495 .Case("SSE2", "pentium4")
1496 .Case("AVX", "sandybridge")
1497 .Case("AVX2", "haswell")
1498 .Default(nullptr);
1499 } else {
1500 CPU = llvm::StringSwitch<const char *>(Arch)
1501 .Case("AVX", "sandybridge")
1502 .Case("AVX2", "haswell")
1503 .Default(nullptr);
1504 }
1505 if (CPU)
1506 return CPU;
1507 }
1508
Chandler Carruth953fb082013-01-13 11:46:33 +00001509 // Select the default CPU if none was given (or detection failed).
1510
1511 if (Triple.getArch() != llvm::Triple::x86_64 &&
1512 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001513 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001514
1515 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1516
1517 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001518 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001519 if (Triple.getArchName() == "x86_64h")
1520 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001521 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001522 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001523
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001524 // Set up default CPU name for PS4 compilers.
1525 if (Triple.isPS4CPU())
1526 return "btver2";
1527
Alexey Bataev286d1b92014-01-31 04:07:13 +00001528 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001529 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001530 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001531
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001532 // Everything else goes to x86-64 in 64-bit mode.
1533 if (Is64Bit)
1534 return "x86-64";
1535
1536 switch (Triple.getOS()) {
1537 case llvm::Triple::FreeBSD:
1538 case llvm::Triple::NetBSD:
1539 case llvm::Triple::OpenBSD:
1540 return "i486";
1541 case llvm::Triple::Haiku:
1542 return "i586";
1543 case llvm::Triple::Bitrig:
1544 return "i686";
1545 default:
1546 // Fallback to p4.
1547 return "pentium4";
1548 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001549}
1550
Dan Gohmanc2853072015-09-03 22:51:53 +00001551/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1552static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1553 // If we have -mcpu=, use that.
1554 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1555 StringRef CPU = A->getValue();
1556
1557#ifdef __wasm__
1558 // Handle "native" by examining the host. "native" isn't meaningful when
1559 // cross compiling, so only support this when the host is also WebAssembly.
1560 if (CPU == "native")
1561 return llvm::sys::getHostCPUName();
1562#endif
1563
1564 return CPU;
1565 }
1566
1567 return "generic";
1568}
1569
Renato Golin7c542b42015-07-27 23:44:45 +00001570static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1571 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001572 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001573 default:
1574 return "";
1575
Amara Emerson703da2e2013-10-31 09:32:33 +00001576 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001577 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001578 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001579
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001581 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001582 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001583 case llvm::Triple::thumbeb: {
1584 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001585 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001586 return arm::getARMTargetCPU(MCPU, MArch, T);
1587 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001588 case llvm::Triple::mips:
1589 case llvm::Triple::mipsel:
1590 case llvm::Triple::mips64:
1591 case llvm::Triple::mips64el: {
1592 StringRef CPUName;
1593 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001594 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 return CPUName;
1596 }
1597
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001598 case llvm::Triple::nvptx:
1599 case llvm::Triple::nvptx64:
1600 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1601 return A->getValue();
1602 return "";
1603
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001604 case llvm::Triple::ppc:
1605 case llvm::Triple::ppc64:
1606 case llvm::Triple::ppc64le: {
1607 std::string TargetCPUName = getPPCTargetCPU(Args);
1608 // LLVM may default to generating code for the native CPU,
1609 // but, like gcc, we default to a more generic option for
1610 // each architecture. (except on Darwin)
1611 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1612 if (T.getArch() == llvm::Triple::ppc64)
1613 TargetCPUName = "ppc64";
1614 else if (T.getArch() == llvm::Triple::ppc64le)
1615 TargetCPUName = "ppc64le";
1616 else
1617 TargetCPUName = "ppc";
1618 }
1619 return TargetCPUName;
1620 }
1621
1622 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001623 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001624 case llvm::Triple::sparcv9:
1625 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001626 return A->getValue();
1627 return "";
1628
1629 case llvm::Triple::x86:
1630 case llvm::Triple::x86_64:
1631 return getX86TargetCPU(Args, T);
1632
1633 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001634 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001635
1636 case llvm::Triple::systemz:
1637 return getSystemZTargetCPU(Args);
1638
1639 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001640 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001641 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001642
1643 case llvm::Triple::wasm32:
1644 case llvm::Triple::wasm64:
1645 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001646 }
1647}
1648
Alp Tokerce365ca2013-12-02 12:43:03 +00001649static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1650 ArgStringList &CmdArgs) {
1651 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1652 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1653 // forward.
1654 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 std::string Plugin =
1656 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001657 CmdArgs.push_back(Args.MakeArgString(Plugin));
1658
1659 // Try to pass driver level flags relevant to LTO code generation down to
1660 // the plugin.
1661
1662 // Handle flags for selecting CPU variants.
1663 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1664 if (!CPU.empty())
1665 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1666}
1667
Sanjay Patel2987c292015-06-11 14:53:41 +00001668/// This is a helper function for validating the optional refinement step
1669/// parameter in reciprocal argument strings. Return false if there is an error
1670/// parsing the refinement step. Otherwise, return true and set the Position
1671/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001672static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001673 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001674 const char RefinementStepToken = ':';
1675 Position = In.find(RefinementStepToken);
1676 if (Position != StringRef::npos) {
1677 StringRef Option = A.getOption().getName();
1678 StringRef RefStep = In.substr(Position + 1);
1679 // Allow exactly one numeric character for the additional refinement
1680 // step parameter. This is reasonable for all currently-supported
1681 // operations and architectures because we would expect that a larger value
1682 // of refinement steps would cause the estimate "optimization" to
1683 // under-perform the native operation. Also, if the estimate does not
1684 // converge quickly, it probably will not ever converge, so further
1685 // refinement steps will not produce a better answer.
1686 if (RefStep.size() != 1) {
1687 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1688 return false;
1689 }
1690 char RefStepChar = RefStep[0];
1691 if (RefStepChar < '0' || RefStepChar > '9') {
1692 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1693 return false;
1694 }
1695 }
1696 return true;
1697}
1698
1699/// The -mrecip flag requires processing of many optional parameters.
1700static void ParseMRecip(const Driver &D, const ArgList &Args,
1701 ArgStringList &OutStrings) {
1702 StringRef DisabledPrefixIn = "!";
1703 StringRef DisabledPrefixOut = "!";
1704 StringRef EnabledPrefixOut = "";
1705 StringRef Out = "-mrecip=";
1706
1707 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1708 if (!A)
1709 return;
1710
1711 unsigned NumOptions = A->getNumValues();
1712 if (NumOptions == 0) {
1713 // No option is the same as "all".
1714 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1715 return;
1716 }
1717
1718 // Pass through "all", "none", or "default" with an optional refinement step.
1719 if (NumOptions == 1) {
1720 StringRef Val = A->getValue(0);
1721 size_t RefStepLoc;
1722 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1723 return;
1724 StringRef ValBase = Val.slice(0, RefStepLoc);
1725 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1726 OutStrings.push_back(Args.MakeArgString(Out + Val));
1727 return;
1728 }
1729 }
1730
1731 // Each reciprocal type may be enabled or disabled individually.
1732 // Check each input value for validity, concatenate them all back together,
1733 // and pass through.
1734
1735 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001736 OptionStrings.insert(std::make_pair("divd", false));
1737 OptionStrings.insert(std::make_pair("divf", false));
1738 OptionStrings.insert(std::make_pair("vec-divd", false));
1739 OptionStrings.insert(std::make_pair("vec-divf", false));
1740 OptionStrings.insert(std::make_pair("sqrtd", false));
1741 OptionStrings.insert(std::make_pair("sqrtf", false));
1742 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1743 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001744
1745 for (unsigned i = 0; i != NumOptions; ++i) {
1746 StringRef Val = A->getValue(i);
1747
1748 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1749 // Ignore the disablement token for string matching.
1750 if (IsDisabled)
1751 Val = Val.substr(1);
1752
1753 size_t RefStep;
1754 if (!getRefinementStep(Val, D, *A, RefStep))
1755 return;
1756
1757 StringRef ValBase = Val.slice(0, RefStep);
1758 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1759 if (OptionIter == OptionStrings.end()) {
1760 // Try again specifying float suffix.
1761 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1762 if (OptionIter == OptionStrings.end()) {
1763 // The input name did not match any known option string.
1764 D.Diag(diag::err_drv_unknown_argument) << Val;
1765 return;
1766 }
1767 // The option was specified without a float or double suffix.
1768 // Make sure that the double entry was not already specified.
1769 // The float entry will be checked below.
1770 if (OptionStrings[ValBase.str() + 'd']) {
1771 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1772 return;
1773 }
1774 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001775
Sanjay Patel2987c292015-06-11 14:53:41 +00001776 if (OptionIter->second == true) {
1777 // Duplicate option specified.
1778 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1779 return;
1780 }
1781
1782 // Mark the matched option as found. Do not allow duplicate specifiers.
1783 OptionIter->second = true;
1784
1785 // If the precision was not specified, also mark the double entry as found.
1786 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1787 OptionStrings[ValBase.str() + 'd'] = true;
1788
1789 // Build the output string.
1790 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1791 Out = Args.MakeArgString(Out + Prefix + Val);
1792 if (i != NumOptions - 1)
1793 Out = Args.MakeArgString(Out + ",");
1794 }
1795
1796 OutStrings.push_back(Args.MakeArgString(Out));
1797}
1798
Eric Christopherc54920a2015-03-23 19:26:05 +00001799static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001800 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001801 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001802 // If -march=native, autodetect the feature list.
1803 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1804 if (StringRef(A->getValue()) == "native") {
1805 llvm::StringMap<bool> HostFeatures;
1806 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1807 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001808 Features.push_back(
1809 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001810 }
1811 }
1812
Jim Grosbach82eee262013-11-16 00:53:35 +00001813 if (Triple.getArchName() == "x86_64h") {
1814 // x86_64h implies quite a few of the more modern subtarget features
1815 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1816 Features.push_back("-rdrnd");
1817 Features.push_back("-aes");
1818 Features.push_back("-pclmul");
1819 Features.push_back("-rtm");
1820 Features.push_back("-hle");
1821 Features.push_back("-fsgsbase");
1822 }
1823
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001824 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001825 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001826 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001827 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001828 Features.push_back("+sse4.2");
1829 Features.push_back("+popcnt");
1830 } else
1831 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001832 }
1833
Eric Christopherc54920a2015-03-23 19:26:05 +00001834 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001835 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1836 StringRef Arch = A->getValue();
1837 bool ArchUsed = false;
1838 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001839 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001840 if (Arch == "AVX" || Arch == "AVX2") {
1841 ArchUsed = true;
1842 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1843 }
1844 }
1845 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001846 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001847 if (Arch == "IA32") {
1848 ArchUsed = true;
1849 } else if (Arch == "SSE" || Arch == "SSE2") {
1850 ArchUsed = true;
1851 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1852 }
1853 }
1854 if (!ArchUsed)
1855 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1856 }
1857
Jim Grosbach82eee262013-11-16 00:53:35 +00001858 // Now add any that the user explicitly requested on the command line,
1859 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001860 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1861 StringRef Name = A->getOption().getName();
1862 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001863
1864 // Skip over "-m".
1865 assert(Name.startswith("m") && "Invalid feature name.");
1866 Name = Name.substr(1);
1867
1868 bool IsNegative = Name.startswith("no-");
1869 if (IsNegative)
1870 Name = Name.substr(3);
1871
1872 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1873 }
1874}
1875
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001876void Clang::AddX86TargetArgs(const ArgList &Args,
1877 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001879 Args.hasArg(options::OPT_mkernel) ||
1880 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001881 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001882
Bob Wilson2616e2e2013-02-10 16:01:41 +00001883 // Default to avoid implicit floating-point for kernel/kext code, but allow
1884 // that to be overridden with -mno-soft-float.
1885 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1886 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001887 if (Arg *A = Args.getLastArg(
1888 options::OPT_msoft_float, options::OPT_mno_soft_float,
1889 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001890 const Option &O = A->getOption();
1891 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1892 O.matches(options::OPT_msoft_float));
1893 }
1894 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001895 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001896
1897 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1898 StringRef Value = A->getValue();
1899 if (Value == "intel" || Value == "att") {
1900 CmdArgs.push_back("-mllvm");
1901 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1902 } else {
1903 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1904 << A->getOption().getName() << Value;
1905 }
1906 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001907}
1908
Tony Linthicum76329bf2011-12-12 21:14:55 +00001909void Clang::AddHexagonTargetArgs(const ArgList &Args,
1910 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001911 CmdArgs.push_back("-mqdsp6-compat");
1912 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001913
Douglas Katzman54366072015-07-27 16:53:08 +00001914 if (const char *v =
1915 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001917 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001919 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920 }
1921
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001922 if (!Args.hasArg(options::OPT_fno_short_enums))
1923 CmdArgs.push_back("-fshort-enums");
1924 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 CmdArgs.push_back("-mllvm");
1926 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001927 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 CmdArgs.push_back("-mllvm");
1929 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001930}
1931
Kevin Qin110db6f2014-07-18 07:03:22 +00001932// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001933static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001934 std::vector<const char *> &Features) {
1935 SmallVector<StringRef, 8> Split;
1936 text.split(Split, StringRef("+"), -1, false);
1937
Douglas Katzman2675d012015-06-29 19:12:56 +00001938 for (const StringRef Feature : Split) {
1939 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001940 .Case("fp", "+fp-armv8")
1941 .Case("simd", "+neon")
1942 .Case("crc", "+crc")
1943 .Case("crypto", "+crypto")
1944 .Case("nofp", "-fp-armv8")
1945 .Case("nosimd", "-neon")
1946 .Case("nocrc", "-crc")
1947 .Case("nocrypto", "-crypto")
1948 .Default(nullptr);
1949 if (result)
1950 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001951 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001952 D.Diag(diag::err_drv_no_neon_modifier);
1953 else
1954 return false;
1955 }
1956 return true;
1957}
1958
1959// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1960// decode CPU and feature.
1961static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1962 std::vector<const char *> &Features) {
1963 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1964 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1966 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001967 Features.push_back("+neon");
1968 Features.push_back("+crc");
1969 Features.push_back("+crypto");
1970 } else if (CPU == "generic") {
1971 Features.push_back("+neon");
1972 } else {
1973 return false;
1974 }
1975
1976 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1977 return false;
1978
1979 return true;
1980}
1981
1982static bool
1983getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1984 const ArgList &Args,
1985 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001986 std::string MarchLowerCase = March.lower();
1987 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001989 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001990 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001991 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001992 Features.push_back("+v8.1a");
1993 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00001994 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001995 }
Kevin Qin110db6f2014-07-18 07:03:22 +00001996
1997 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1998 return false;
1999
2000 return true;
2001}
2002
2003static bool
2004getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2005 const ArgList &Args,
2006 std::vector<const char *> &Features) {
2007 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002008 std::string McpuLowerCase = Mcpu.lower();
2009 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002010 return false;
2011
2012 return true;
2013}
2014
2015static bool
2016getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2017 const ArgList &Args,
2018 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002019 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002021 if (MtuneLowerCase == "native")
2022 MtuneLowerCase = llvm::sys::getHostCPUName();
2023 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002024 Features.push_back("+zcm");
2025 Features.push_back("+zcz");
2026 }
2027 return true;
2028}
2029
2030static bool
2031getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2032 const ArgList &Args,
2033 std::vector<const char *> &Features) {
2034 StringRef CPU;
2035 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002036 std::string McpuLowerCase = Mcpu.lower();
2037 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002038 return false;
2039
2040 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2041}
2042
Akira Hatanaka92500472015-07-27 19:29:04 +00002043static void getAArch64TargetFeatures(const Driver &D,
2044 const llvm::Triple &Triple,
2045 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002046 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002047 Arg *A;
2048 bool success = true;
2049 // Enable NEON by default.
2050 Features.push_back("+neon");
2051 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2052 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2053 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2054 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002055 else if (Args.hasArg(options::OPT_arch))
2056 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2057 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002058
2059 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2060 success =
2061 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2062 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2063 success =
2064 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002065 else if (Args.hasArg(options::OPT_arch))
2066 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2067 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002068
2069 if (!success)
2070 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002071
2072 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2073 Features.push_back("-fp-armv8");
2074 Features.push_back("-crypto");
2075 Features.push_back("-neon");
2076 }
Bradley Smith418c5932014-05-02 15:17:51 +00002077
2078 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002080 if (A->getOption().matches(options::OPT_mcrc))
2081 Features.push_back("+crc");
2082 else
2083 Features.push_back("-crc");
2084 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002085
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002086 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2087 options::OPT_munaligned_access))
2088 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2089 Features.push_back("+strict-align");
2090
Akira Hatanaka92500472015-07-27 19:29:04 +00002091 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002092 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002093}
2094
Dan Gohmanc2853072015-09-03 22:51:53 +00002095static void getWebAssemblyTargetFeatures(const ArgList &Args,
2096 std::vector<const char *> &Features) {
2097 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2098 StringRef Name = A->getOption().getName();
2099 A->claim();
2100
2101 // Skip over "-m".
2102 assert(Name.startswith("m") && "Invalid feature name.");
2103 Name = Name.substr(1);
2104
2105 bool IsNegative = Name.startswith("no-");
2106 if (IsNegative)
2107 Name = Name.substr(3);
2108
2109 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2110 }
2111}
2112
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002113static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002114 const ArgList &Args, ArgStringList &CmdArgs,
2115 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002116 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002117 std::vector<const char *> Features;
2118 switch (Triple.getArch()) {
2119 default:
2120 break;
2121 case llvm::Triple::mips:
2122 case llvm::Triple::mipsel:
2123 case llvm::Triple::mips64:
2124 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002125 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002126 break;
2127
2128 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002129 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002130 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002131 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002132 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002133 break;
2134
2135 case llvm::Triple::ppc:
2136 case llvm::Triple::ppc64:
2137 case llvm::Triple::ppc64le:
2138 getPPCTargetFeatures(Args, Features);
2139 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002140 case llvm::Triple::systemz:
2141 getSystemZTargetFeatures(Args, Features);
2142 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002143 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002144 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002145 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002146 break;
2147 case llvm::Triple::x86:
2148 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002149 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002150 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002151 case llvm::Triple::wasm32:
2152 case llvm::Triple::wasm64:
2153 getWebAssemblyTargetFeatures(Args, Features);
2154 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002155 }
Rafael Espindola43964802013-08-21 17:34:32 +00002156
2157 // Find the last of each feature.
2158 llvm::StringMap<unsigned> LastOpt;
2159 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2160 const char *Name = Features[I];
2161 assert(Name[0] == '-' || Name[0] == '+');
2162 LastOpt[Name + 1] = I;
2163 }
2164
2165 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2166 // If this feature was overridden, ignore it.
2167 const char *Name = Features[I];
2168 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2169 assert(LastI != LastOpt.end());
2170 unsigned Last = LastI->second;
2171 if (Last != I)
2172 continue;
2173
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002174 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002175 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002176 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002177}
2178
David Majnemerae394812014-12-09 00:12:30 +00002179static bool
2180shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2181 const llvm::Triple &Triple) {
2182 // We use the zero-cost exception tables for Objective-C if the non-fragile
2183 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2184 // later.
2185 if (runtime.isNonFragile())
2186 return true;
2187
2188 if (!Triple.isMacOSX())
2189 return false;
2190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002191 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002192 (Triple.getArch() == llvm::Triple::x86_64 ||
2193 Triple.getArch() == llvm::Triple::arm));
2194}
2195
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002196/// Adds exception related arguments to the driver command arguments. There's a
2197/// master flag, -fexceptions and also language specific flags to enable/disable
2198/// C++ and Objective-C exceptions. This makes it possible to for example
2199/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002200static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002201 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002202 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002203 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002204 const Driver &D = TC.getDriver();
2205 const llvm::Triple &Triple = TC.getTriple();
2206
Chad Rosier4fab82c2012-03-26 22:04:46 +00002207 if (KernelOrKext) {
2208 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2209 // arguments now to avoid warnings about unused arguments.
2210 Args.ClaimAllArgs(options::OPT_fexceptions);
2211 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2212 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2213 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2214 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2215 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002216 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002217 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002218
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002219 // See if the user explicitly enabled exceptions.
2220 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2221 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002222
David Majnemerae394812014-12-09 00:12:30 +00002223 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2224 // is not necessarily sensible, but follows GCC.
2225 if (types::isObjC(InputType) &&
2226 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002227 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002228 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002229
David Majnemerae394812014-12-09 00:12:30 +00002230 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002231 }
2232
2233 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002234 // Disable C++ EH by default on XCore, PS4, and MSVC.
2235 // FIXME: Remove MSVC from this list once things work.
2236 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2237 !Triple.isPS4CPU() &&
2238 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002239 Arg *ExceptionArg = Args.getLastArg(
2240 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2241 options::OPT_fexceptions, options::OPT_fno_exceptions);
2242 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002243 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002244 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2245 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002246
2247 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002248 if (Triple.isPS4CPU()) {
2249 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2250 assert(ExceptionArg &&
2251 "On the PS4 exceptions should only be enabled if passing "
2252 "an argument");
2253 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2254 const Arg *RTTIArg = TC.getRTTIArg();
2255 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2256 D.Diag(diag::err_drv_argument_not_allowed_with)
2257 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2258 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2259 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2260 } else
2261 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2262
Anders Carlssone96ab552011-02-28 02:27:16 +00002263 CmdArgs.push_back("-fcxx-exceptions");
2264
David Majnemer8de68642014-12-05 08:11:58 +00002265 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002266 }
2267 }
2268
David Majnemer8de68642014-12-05 08:11:58 +00002269 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002270 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002271}
2272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002273static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002274 bool Default = true;
2275 if (TC.getTriple().isOSDarwin()) {
2276 // The native darwin assembler doesn't support the linker_option directives,
2277 // so we disable them if we think the .s file will be passed to it.
2278 Default = TC.useIntegratedAs();
2279 }
2280 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2281 Default);
2282}
2283
Ted Kremenek62093662013-03-12 17:02:12 +00002284static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2285 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 bool UseDwarfDirectory =
2287 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2288 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002289 return !UseDwarfDirectory;
2290}
2291
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002292/// \brief Check whether the given input tree contains any compilation actions.
2293static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002294 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002295 return true;
2296
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002297 for (const auto &Act : *A)
2298 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002299 return true;
2300
2301 return false;
2302}
2303
2304/// \brief Check if -relax-all should be passed to the internal assembler.
2305/// This is done by default when compiling non-assembler source with -O0.
2306static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2307 bool RelaxDefault = true;
2308
2309 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2310 RelaxDefault = A->getOption().matches(options::OPT_O0);
2311
2312 if (RelaxDefault) {
2313 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002314 for (const auto &Act : C.getActions()) {
2315 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002316 RelaxDefault = true;
2317 break;
2318 }
2319 }
2320 }
2321
2322 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002323 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002324}
2325
David Blaikie9260ed62013-07-25 21:19:01 +00002326static void CollectArgsForIntegratedAssembler(Compilation &C,
2327 const ArgList &Args,
2328 ArgStringList &CmdArgs,
2329 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002330 if (UseRelaxAll(C, Args))
2331 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002333 // When passing -I arguments to the assembler we sometimes need to
2334 // unconditionally take the next argument. For example, when parsing
2335 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2336 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2337 // arg after parsing the '-I' arg.
2338 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002339
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002340 // When using an integrated assembler, translate -Wa, and -Xassembler
2341 // options.
2342 bool CompressDebugSections = false;
2343 for (const Arg *A :
2344 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2345 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002346
Renato Golin7c542b42015-07-27 23:44:45 +00002347 for (const StringRef Value : A->getValues()) {
2348 if (TakeNextArg) {
2349 CmdArgs.push_back(Value.data());
2350 TakeNextArg = false;
2351 continue;
2352 }
David Blaikie9260ed62013-07-25 21:19:01 +00002353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002354 if (Value == "-force_cpusubtype_ALL") {
2355 // Do nothing, this is the default and we don't support anything else.
2356 } else if (Value == "-L") {
2357 CmdArgs.push_back("-msave-temp-labels");
2358 } else if (Value == "--fatal-warnings") {
2359 CmdArgs.push_back("-massembler-fatal-warnings");
2360 } else if (Value == "--noexecstack") {
2361 CmdArgs.push_back("-mnoexecstack");
2362 } else if (Value == "-compress-debug-sections" ||
2363 Value == "--compress-debug-sections") {
2364 CompressDebugSections = true;
2365 } else if (Value == "-nocompress-debug-sections" ||
2366 Value == "--nocompress-debug-sections") {
2367 CompressDebugSections = false;
2368 } else if (Value.startswith("-I")) {
2369 CmdArgs.push_back(Value.data());
2370 // We need to consume the next argument if the current arg is a plain
2371 // -I. The next arg will be the include directory.
2372 if (Value == "-I")
2373 TakeNextArg = true;
2374 } else if (Value.startswith("-gdwarf-")) {
2375 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002376 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2377 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2378 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002379 } else if (Value == "--trap") {
2380 CmdArgs.push_back("-target-feature");
2381 CmdArgs.push_back("+use-tcc-in-div");
2382 } else if (Value == "--break") {
2383 CmdArgs.push_back("-target-feature");
2384 CmdArgs.push_back("-use-tcc-in-div");
Daniel Sanders63f28262015-09-22 13:52:32 +00002385 } else if (Value.startswith("-msoft-float")) {
2386 CmdArgs.push_back("-target-feature");
2387 CmdArgs.push_back("+soft-float");
2388 } else if (Value.startswith("-mhard-float")) {
2389 CmdArgs.push_back("-target-feature");
2390 CmdArgs.push_back("-soft-float");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 } else {
2392 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002393 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002394 }
2395 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002396 }
2397 if (CompressDebugSections) {
2398 if (llvm::zlib::isAvailable())
2399 CmdArgs.push_back("-compress-debug-sections");
2400 else
2401 D.Diag(diag::warn_debug_compression_unavailable);
2402 }
David Blaikie9260ed62013-07-25 21:19:01 +00002403}
2404
Renato Goline807c122014-01-31 11:47:28 +00002405// Until ARM libraries are build separately, we have them all in one library
2406static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002407 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002408 TC.getArch() == llvm::Triple::x86)
2409 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002410 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002411 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002412 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002413}
2414
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002415static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2416 // The runtimes are located in the OS-specific resource directory.
2417 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002418 const llvm::Triple &Triple = TC.getTriple();
2419 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002420 StringRef OSLibName =
2421 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002422 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002423 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002424}
2425
Peter Collingbourne581f4382015-07-02 01:48:12 +00002426SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2427 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002428 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2429 ? "-android"
2430 : "";
2431
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002432 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002433 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2434 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002435 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002436 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002437 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002438 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002439
2440 SmallString<128> Path = getCompilerRTLibDir(TC);
2441 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2442 Arch + Env + Suffix);
2443
2444 return Path;
2445}
2446
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002447// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002448// FIXME: Make sure we can also emit shared objects if they're requested
2449// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002450static void addClangRT(const ToolChain &TC, const ArgList &Args,
2451 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002452 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002453}
2454
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002455static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2456 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002457 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2458 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002459 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002460 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002461 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002462 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002463 Args.hasArg(options::OPT_fcreate_profile) ||
2464 Args.hasArg(options::OPT_coverage)))
2465 return;
2466
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002467 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002468}
2469
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002470namespace {
2471enum OpenMPRuntimeKind {
2472 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2473 /// without knowing what runtime to target.
2474 OMPRT_Unknown,
2475
2476 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2477 /// the default for Clang.
2478 OMPRT_OMP,
2479
2480 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2481 /// this runtime but can swallow the pragmas, and find and link against the
2482 /// runtime library itself.
2483 OMPRT_GOMP,
2484
Chandler Carruthc6625c62015-05-28 21:10:31 +00002485 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002486 /// OpenMP runtime. We support this mode for users with existing dependencies
2487 /// on this runtime library name.
2488 OMPRT_IOMP5
2489};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002490}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002491
2492/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002493static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2494 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002495 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2496
2497 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2498 if (A)
2499 RuntimeName = A->getValue();
2500
2501 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502 .Case("libomp", OMPRT_OMP)
2503 .Case("libgomp", OMPRT_GOMP)
2504 .Case("libiomp5", OMPRT_IOMP5)
2505 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002506
2507 if (RT == OMPRT_Unknown) {
2508 if (A)
2509 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002511 else
2512 // FIXME: We could use a nicer diagnostic here.
2513 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2514 }
2515
2516 return RT;
2517}
2518
Alexey Samsonov52550342014-09-15 19:58:40 +00002519static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2520 ArgStringList &CmdArgs, StringRef Sanitizer,
2521 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002522 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002523 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002524 if (!IsShared)
2525 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002526 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002527 if (!IsShared)
2528 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002529}
2530
Alexey Samsonov52550342014-09-15 19:58:40 +00002531// Tries to use a file with the list of dynamic symbols that need to be exported
2532// from the runtime library. Returns true if the file was found.
2533static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2534 ArgStringList &CmdArgs,
2535 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002536 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2537 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2538 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002539 return true;
2540 }
2541 return false;
2542}
2543
2544static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2545 ArgStringList &CmdArgs) {
2546 // Force linking against the system libraries sanitizers depends on
2547 // (see PR15823 why this is necessary).
2548 CmdArgs.push_back("--no-as-needed");
2549 CmdArgs.push_back("-lpthread");
2550 CmdArgs.push_back("-lrt");
2551 CmdArgs.push_back("-lm");
2552 // There's no libdl on FreeBSD.
2553 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2554 CmdArgs.push_back("-ldl");
2555}
2556
2557static void
2558collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2559 SmallVectorImpl<StringRef> &SharedRuntimes,
2560 SmallVectorImpl<StringRef> &StaticRuntimes,
2561 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2562 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2563 // Collect shared runtimes.
2564 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2565 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002566 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002567
Alexey Samsonov52550342014-09-15 19:58:40 +00002568 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002569 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002570 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2571 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002572 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002573 }
2574 if (SanArgs.needsAsanRt()) {
2575 if (SanArgs.needsSharedAsanRt()) {
2576 HelperStaticRuntimes.push_back("asan-preinit");
2577 } else {
2578 StaticRuntimes.push_back("asan");
2579 if (SanArgs.linkCXXRuntimes())
2580 StaticRuntimes.push_back("asan_cxx");
2581 }
2582 }
2583 if (SanArgs.needsDfsanRt())
2584 StaticRuntimes.push_back("dfsan");
2585 if (SanArgs.needsLsanRt())
2586 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002587 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002588 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002589 if (SanArgs.linkCXXRuntimes())
2590 StaticRuntimes.push_back("msan_cxx");
2591 }
2592 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002593 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002594 if (SanArgs.linkCXXRuntimes())
2595 StaticRuntimes.push_back("tsan_cxx");
2596 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002598 StaticRuntimes.push_back("ubsan_standalone");
2599 if (SanArgs.linkCXXRuntimes())
2600 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002601 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002602 if (SanArgs.needsSafeStackRt())
2603 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002604}
2605
Alexey Samsonov52550342014-09-15 19:58:40 +00002606// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2607// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2608static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002609 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002610 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2611 HelperStaticRuntimes;
2612 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2613 HelperStaticRuntimes);
2614 for (auto RT : SharedRuntimes)
2615 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2616 for (auto RT : HelperStaticRuntimes)
2617 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2618 bool AddExportDynamic = false;
2619 for (auto RT : StaticRuntimes) {
2620 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2621 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2622 }
2623 // If there is a static runtime with no dynamic list, force all the symbols
2624 // to be dynamic to be sure we export sanitizer interface functions.
2625 if (AddExportDynamic)
2626 CmdArgs.push_back("-export-dynamic");
2627 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002628}
2629
Reid Kleckner86ea7702015-02-04 23:45:07 +00002630static bool areOptimizationsEnabled(const ArgList &Args) {
2631 // Find the last -O arg and see if it is non-zero.
2632 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2633 return !A->getOption().matches(options::OPT_O0);
2634 // Defaults to -O0.
2635 return false;
2636}
2637
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002638static bool shouldUseFramePointerForTarget(const ArgList &Args,
2639 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002640 switch (Triple.getArch()) {
2641 case llvm::Triple::xcore:
2642 case llvm::Triple::wasm32:
2643 case llvm::Triple::wasm64:
2644 // XCore never wants frame pointers, regardless of OS.
2645 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002646 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002647 default:
2648 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002649 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002650
2651 if (Triple.isOSLinux()) {
2652 switch (Triple.getArch()) {
2653 // Don't use a frame pointer on linux if optimizing for certain targets.
2654 case llvm::Triple::mips64:
2655 case llvm::Triple::mips64el:
2656 case llvm::Triple::mips:
2657 case llvm::Triple::mipsel:
2658 case llvm::Triple::systemz:
2659 case llvm::Triple::x86:
2660 case llvm::Triple::x86_64:
2661 return !areOptimizationsEnabled(Args);
2662 default:
2663 return true;
2664 }
2665 }
2666
2667 if (Triple.isOSWindows()) {
2668 switch (Triple.getArch()) {
2669 case llvm::Triple::x86:
2670 return !areOptimizationsEnabled(Args);
2671 default:
2672 // All other supported Windows ISAs use xdata unwind information, so frame
2673 // pointers are not generally useful.
2674 return false;
2675 }
2676 }
2677
2678 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002679}
2680
Rafael Espindola224dd632011-12-14 21:02:23 +00002681static bool shouldUseFramePointer(const ArgList &Args,
2682 const llvm::Triple &Triple) {
2683 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2684 options::OPT_fomit_frame_pointer))
2685 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2686
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002687 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002688}
2689
Eric Christopherb7d97e92013-04-03 01:58:53 +00002690static bool shouldUseLeafFramePointer(const ArgList &Args,
2691 const llvm::Triple &Triple) {
2692 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2693 options::OPT_momit_leaf_frame_pointer))
2694 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2695
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002696 if (Triple.isPS4CPU())
2697 return false;
2698
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002699 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002700}
2701
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002702/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002703static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002704 SmallString<128> cwd;
2705 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002706 CmdArgs.push_back("-fdebug-compilation-dir");
2707 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002708 }
2709}
2710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002711static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002712 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2713 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2714 SmallString<128> T(FinalOutput->getValue());
2715 llvm::sys::path::replace_extension(T, "dwo");
2716 return Args.MakeArgString(T);
2717 } else {
2718 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002719 SmallString<128> T(
2720 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002721 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002722 llvm::sys::path::replace_extension(F, "dwo");
2723 T += F;
2724 return Args.MakeArgString(F);
2725 }
2726}
2727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002728static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2729 const JobAction &JA, const ArgList &Args,
2730 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002731 ArgStringList ExtractArgs;
2732 ExtractArgs.push_back("--extract-dwo");
2733
2734 ArgStringList StripArgs;
2735 StripArgs.push_back("--strip-dwo");
2736
2737 // Grabbing the output of the earlier compile step.
2738 StripArgs.push_back(Output.getFilename());
2739 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002740 ExtractArgs.push_back(OutFile);
2741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002743 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002744
2745 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002746 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002747
2748 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002749 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002750}
2751
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002752/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002753/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2754static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002755 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002756 if (A->getOption().matches(options::OPT_O4) ||
2757 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 return true;
2759
2760 if (A->getOption().matches(options::OPT_O0))
2761 return false;
2762
2763 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2764
Rafael Espindola91780de2013-08-26 14:05:41 +00002765 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002766 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002767 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002768 return true;
2769
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002770 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002771 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002772 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002773
2774 unsigned OptLevel = 0;
2775 if (S.getAsInteger(10, OptLevel))
2776 return false;
2777
2778 return OptLevel > 1;
2779 }
2780
2781 return false;
2782}
2783
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002784/// Add -x lang to \p CmdArgs for \p Input.
2785static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2786 ArgStringList &CmdArgs) {
2787 // When using -verify-pch, we don't want to provide the type
2788 // 'precompiled-header' if it was inferred from the file extension
2789 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2790 return;
2791
2792 CmdArgs.push_back("-x");
2793 if (Args.hasArg(options::OPT_rewrite_objc))
2794 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2795 else
2796 CmdArgs.push_back(types::getTypeName(Input.getType()));
2797}
2798
David Majnemerc371ff02015-03-22 08:39:22 +00002799static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002800 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002801 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002802
2803 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002804 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002805
2806 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002808 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002809 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002810}
2811
Rafael Espindola577637a2015-01-03 00:06:04 +00002812// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002813// options that build systems might add but are unused when assembling or only
2814// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002815static void claimNoWarnArgs(const ArgList &Args) {
2816 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002817 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002818 Args.ClaimAllArgs(options::OPT_flto);
2819 Args.ClaimAllArgs(options::OPT_fno_lto);
2820}
2821
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002822static void appendUserToPath(SmallVectorImpl<char> &Result) {
2823#ifdef LLVM_ON_UNIX
2824 const char *Username = getenv("LOGNAME");
2825#else
2826 const char *Username = getenv("USERNAME");
2827#endif
2828 if (Username) {
2829 // Validate that LoginName can be used in a path, and get its length.
2830 size_t Len = 0;
2831 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002832 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002833 Username = nullptr;
2834 break;
2835 }
2836 }
2837
2838 if (Username && Len > 0) {
2839 Result.append(Username, Username + Len);
2840 return;
2841 }
2842 }
2843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002845#ifdef LLVM_ON_UNIX
2846 std::string UID = llvm::utostr(getuid());
2847#else
2848 // FIXME: Windows seems to have an 'SID' that might work.
2849 std::string UID = "9999";
2850#endif
2851 Result.append(UID.begin(), UID.end());
2852}
2853
David Majnemere11d3732015-06-08 00:22:46 +00002854VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2855 const llvm::Triple &Triple,
2856 const llvm::opt::ArgList &Args,
2857 bool IsWindowsMSVC) {
2858 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2859 IsWindowsMSVC) ||
2860 Args.hasArg(options::OPT_fmsc_version) ||
2861 Args.hasArg(options::OPT_fms_compatibility_version)) {
2862 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2863 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002864 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002865
2866 if (MSCVersion && MSCompatibilityVersion) {
2867 if (D)
2868 D->Diag(diag::err_drv_argument_not_allowed_with)
2869 << MSCVersion->getAsString(Args)
2870 << MSCompatibilityVersion->getAsString(Args);
2871 return VersionTuple();
2872 }
2873
2874 if (MSCompatibilityVersion) {
2875 VersionTuple MSVT;
2876 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2877 D->Diag(diag::err_drv_invalid_value)
2878 << MSCompatibilityVersion->getAsString(Args)
2879 << MSCompatibilityVersion->getValue();
2880 return MSVT;
2881 }
2882
2883 if (MSCVersion) {
2884 unsigned Version = 0;
2885 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2886 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2887 << MSCVersion->getValue();
2888 return getMSCompatibilityVersion(Version);
2889 }
2890
2891 unsigned Major, Minor, Micro;
2892 Triple.getEnvironmentVersion(Major, Minor, Micro);
2893 if (Major || Minor || Micro)
2894 return VersionTuple(Major, Minor, Micro);
2895
2896 return VersionTuple(18);
2897 }
2898 return VersionTuple();
2899}
2900
Diego Novilloa0545962015-07-10 18:00:07 +00002901static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2902 const InputInfo &Output, const ArgList &Args,
2903 ArgStringList &CmdArgs) {
2904 auto *ProfileGenerateArg = Args.getLastArg(
2905 options::OPT_fprofile_instr_generate,
2906 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002907 options::OPT_fprofile_generate_EQ,
2908 options::OPT_fno_profile_instr_generate);
2909 if (ProfileGenerateArg &&
2910 ProfileGenerateArg->getOption().matches(
2911 options::OPT_fno_profile_instr_generate))
2912 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002913
2914 auto *ProfileUseArg = Args.getLastArg(
2915 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002916 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2917 options::OPT_fno_profile_instr_use);
2918 if (ProfileUseArg &&
2919 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2920 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002921
2922 if (ProfileGenerateArg && ProfileUseArg)
2923 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002924 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002925
Diego Novillo758f3f52015-08-05 21:49:51 +00002926 if (ProfileGenerateArg) {
2927 if (ProfileGenerateArg->getOption().matches(
2928 options::OPT_fprofile_instr_generate_EQ))
2929 ProfileGenerateArg->render(Args, CmdArgs);
2930 else if (ProfileGenerateArg->getOption().matches(
2931 options::OPT_fprofile_generate_EQ)) {
2932 SmallString<128> Path(ProfileGenerateArg->getValue());
2933 llvm::sys::path::append(Path, "default.profraw");
2934 CmdArgs.push_back(
2935 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2936 } else
2937 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2938 }
Diego Novilloa0545962015-07-10 18:00:07 +00002939
Diego Novillo758f3f52015-08-05 21:49:51 +00002940 if (ProfileUseArg) {
2941 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2942 ProfileUseArg->render(Args, CmdArgs);
2943 else if ((ProfileUseArg->getOption().matches(
2944 options::OPT_fprofile_use_EQ) ||
2945 ProfileUseArg->getOption().matches(
2946 options::OPT_fprofile_instr_use))) {
2947 SmallString<128> Path(
2948 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2949 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2950 llvm::sys::path::append(Path, "default.profdata");
2951 CmdArgs.push_back(
2952 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2953 }
Diego Novilloa0545962015-07-10 18:00:07 +00002954 }
2955
2956 if (Args.hasArg(options::OPT_ftest_coverage) ||
2957 Args.hasArg(options::OPT_coverage))
2958 CmdArgs.push_back("-femit-coverage-notes");
2959 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2960 false) ||
2961 Args.hasArg(options::OPT_coverage))
2962 CmdArgs.push_back("-femit-coverage-data");
2963
Diego Novilloc4b94da2015-08-05 23:27:40 +00002964 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2965 options::OPT_fno_coverage_mapping, false) &&
2966 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002967 D.Diag(diag::err_drv_argument_only_allowed_with)
2968 << "-fcoverage-mapping"
2969 << "-fprofile-instr-generate";
2970
Diego Novilloc4b94da2015-08-05 23:27:40 +00002971 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2972 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002973 CmdArgs.push_back("-fcoverage-mapping");
2974
2975 if (C.getArgs().hasArg(options::OPT_c) ||
2976 C.getArgs().hasArg(options::OPT_S)) {
2977 if (Output.isFilename()) {
2978 CmdArgs.push_back("-coverage-file");
2979 SmallString<128> CoverageFilename;
2980 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2981 CoverageFilename = FinalOutput->getValue();
2982 } else {
2983 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2984 }
2985 if (llvm::sys::path::is_relative(CoverageFilename)) {
2986 SmallString<128> Pwd;
2987 if (!llvm::sys::fs::current_path(Pwd)) {
2988 llvm::sys::path::append(Pwd, CoverageFilename);
2989 CoverageFilename.swap(Pwd);
2990 }
2991 }
2992 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2993 }
2994 }
2995}
2996
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002997/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2998/// smooshes them together with platform defaults, to decide whether
2999/// this compile should be using PIC mode or not. Returns a tuple of
3000/// (RelocationModel, PICLevel, IsPIE).
3001static std::tuple<llvm::Reloc::Model, unsigned, bool>
3002ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3003 const ArgList &Args) {
3004 // FIXME: why does this code...and so much everywhere else, use both
3005 // ToolChain.getTriple() and Triple?
3006 bool PIE = ToolChain.isPIEDefault();
3007 bool PIC = PIE || ToolChain.isPICDefault();
3008 bool IsPICLevelTwo = PIC;
3009
3010 bool KernelOrKext =
3011 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3012
3013 // Android-specific defaults for PIC/PIE
3014 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3015 switch (ToolChain.getArch()) {
3016 case llvm::Triple::arm:
3017 case llvm::Triple::armeb:
3018 case llvm::Triple::thumb:
3019 case llvm::Triple::thumbeb:
3020 case llvm::Triple::aarch64:
3021 case llvm::Triple::mips:
3022 case llvm::Triple::mipsel:
3023 case llvm::Triple::mips64:
3024 case llvm::Triple::mips64el:
3025 PIC = true; // "-fpic"
3026 break;
3027
3028 case llvm::Triple::x86:
3029 case llvm::Triple::x86_64:
3030 PIC = true; // "-fPIC"
3031 IsPICLevelTwo = true;
3032 break;
3033
3034 default:
3035 break;
3036 }
3037 }
3038
3039 // OpenBSD-specific defaults for PIE
3040 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3041 switch (ToolChain.getArch()) {
3042 case llvm::Triple::mips64:
3043 case llvm::Triple::mips64el:
3044 case llvm::Triple::sparcel:
3045 case llvm::Triple::x86:
3046 case llvm::Triple::x86_64:
3047 IsPICLevelTwo = false; // "-fpie"
3048 break;
3049
3050 case llvm::Triple::ppc:
3051 case llvm::Triple::sparc:
3052 case llvm::Triple::sparcv9:
3053 IsPICLevelTwo = true; // "-fPIE"
3054 break;
3055
3056 default:
3057 break;
3058 }
3059 }
3060
3061 // The last argument relating to either PIC or PIE wins, and no
3062 // other argument is used. If the last argument is any flavor of the
3063 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3064 // option implicitly enables PIC at the same level.
3065 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3066 options::OPT_fpic, options::OPT_fno_pic,
3067 options::OPT_fPIE, options::OPT_fno_PIE,
3068 options::OPT_fpie, options::OPT_fno_pie);
3069 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3070 // is forced, then neither PIC nor PIE flags will have no effect.
3071 if (!ToolChain.isPICDefaultForced()) {
3072 if (LastPICArg) {
3073 Option O = LastPICArg->getOption();
3074 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3075 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3076 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3077 PIC =
3078 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3079 IsPICLevelTwo =
3080 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3081 } else {
3082 PIE = PIC = false;
3083 }
3084 }
3085 }
3086
3087 // Introduce a Darwin-specific hack. If the default is PIC, but the
3088 // PIC level would've been set to level 1, force it back to level 2
3089 // PIC instead. This matches the behavior of Darwin GCC (based on
3090 // chandlerc's informal testing in 2012).
3091 if (PIC && ToolChain.getTriple().isOSDarwin())
3092 IsPICLevelTwo |= ToolChain.isPICDefault();
3093
James Y Knightc4015d32015-08-21 04:14:55 +00003094 // This kernel flags are a trump-card: they will disable PIC/PIE
3095 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003096 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3097 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003098
3099 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3100 // This is a very special mode. It trumps the other modes, almost no one
3101 // uses it, and it isn't even valid on any OS but Darwin.
3102 if (!ToolChain.getTriple().isOSDarwin())
3103 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3104 << A->getSpelling() << ToolChain.getTriple().str();
3105
3106 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3107
3108 // Only a forced PIC mode can cause the actual compile to have PIC defines
3109 // etc., no flags are sufficient. This behavior was selected to closely
3110 // match that of llvm-gcc and Apple GCC before that.
3111 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3112
3113 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3114 }
3115
3116 if (PIC)
3117 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3118
3119 return std::make_tuple(llvm::Reloc::Static, 0, false);
3120}
3121
3122static const char *RelocationModelName(llvm::Reloc::Model Model) {
3123 switch (Model) {
3124 case llvm::Reloc::Default:
3125 return nullptr;
3126 case llvm::Reloc::Static:
3127 return "static";
3128 case llvm::Reloc::PIC_:
3129 return "pic";
3130 case llvm::Reloc::DynamicNoPIC:
3131 return "dynamic-no-pic";
3132 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003133 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003134}
3135
3136static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3137 ArgStringList &CmdArgs) {
3138 llvm::Reloc::Model RelocationModel;
3139 unsigned PICLevel;
3140 bool IsPIE;
3141 std::tie(RelocationModel, PICLevel, IsPIE) =
3142 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3143
3144 if (RelocationModel != llvm::Reloc::Static)
3145 CmdArgs.push_back("-KPIC");
3146}
3147
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003148void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003149 const InputInfo &Output, const InputInfoList &Inputs,
3150 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003151 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3152 const llvm::Triple Triple(TripleStr);
3153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003154 bool KernelOrKext =
3155 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003156 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 ArgStringList CmdArgs;
3158
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003159 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003160 bool IsWindowsCygnus =
3161 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003162 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3163
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003164 // Check number of inputs for sanity. We need at least one input.
3165 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003166 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003167 // CUDA compilation may have multiple inputs (source file + results of
3168 // device-side compilations). All other jobs are expected to have exactly one
3169 // input.
3170 bool IsCuda = types::isCuda(Input.getType());
3171 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003172
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003173 // Invoke ourselves in -cc1 mode.
3174 //
3175 // FIXME: Implement custom jobs for internal actions.
3176 CmdArgs.push_back("-cc1");
3177
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003178 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003179 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003180 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003181
James Y Knight2db38f32015-08-15 03:45:25 +00003182 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3183 Triple.getArch() == llvm::Triple::thumb)) {
3184 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003185 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003186 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003187 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003188 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003189 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003190 }
3191
Tim Northover336f1892014-03-29 13:16:12 +00003192 // Push all default warning arguments that are specific to
3193 // the given target. These come before user provided warning options
3194 // are provided.
3195 getToolChain().addClangWarningOptions(CmdArgs);
3196
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003197 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003198 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003199
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003200 if (isa<AnalyzeJobAction>(JA)) {
3201 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3202 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003203 } else if (isa<MigrateJobAction>(JA)) {
3204 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003205 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003206 if (Output.getType() == types::TY_Dependencies)
3207 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003208 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003209 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003210 if (Args.hasArg(options::OPT_rewrite_objc) &&
3211 !Args.hasArg(options::OPT_g_Group))
3212 CmdArgs.push_back("-P");
3213 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003214 } else if (isa<AssembleJobAction>(JA)) {
3215 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003216
David Blaikie9260ed62013-07-25 21:19:01 +00003217 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003218
3219 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003220 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003221 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003222 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003223 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003224
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003225 if (JA.getType() == types::TY_Nothing)
3226 CmdArgs.push_back("-fsyntax-only");
3227 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003228 CmdArgs.push_back("-emit-pch");
3229 else
3230 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003231 } else if (isa<VerifyPCHJobAction>(JA)) {
3232 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003233 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003234 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3235 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003236
Renato Golin7c542b42015-07-27 23:44:45 +00003237 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003238 CmdArgs.push_back("-flto");
3239 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003240 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003241 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003242 } else if (JA.getType() == types::TY_LLVM_IR ||
3243 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003244 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003245 } else if (JA.getType() == types::TY_LLVM_BC ||
3246 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003247 CmdArgs.push_back("-emit-llvm-bc");
3248 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003249 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003250 } else if (JA.getType() == types::TY_AST) {
3251 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003252 } else if (JA.getType() == types::TY_ModuleFile) {
3253 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003254 } else if (JA.getType() == types::TY_RewrittenObjC) {
3255 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003256 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003257 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3258 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003259 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003260 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003261 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003262 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003263
3264 // Preserve use-list order by default when emitting bitcode, so that
3265 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3266 // same result as running passes here. For LTO, we don't need to preserve
3267 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003268 if (JA.getType() == types::TY_LLVM_BC)
3269 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270 }
3271
Justin Bognera88f0122014-06-20 22:59:50 +00003272 // We normally speed up the clang process a bit by skipping destructors at
3273 // exit, but when we're generating diagnostics we can rely on some of the
3274 // cleanup.
3275 if (!C.isForDiagnostics())
3276 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003279#ifdef NDEBUG
3280 CmdArgs.push_back("-disable-llvm-verifier");
3281#endif
3282
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003283 // Set the main file name, so that debug info works even with
3284 // -save-temps.
3285 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003286 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003287
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003288 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003289 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003290 if (Args.hasArg(options::OPT_static))
3291 CmdArgs.push_back("-static-define");
3292
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003293 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003294 // Enable region store model by default.
3295 CmdArgs.push_back("-analyzer-store=region");
3296
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003297 // Treat blocks as analysis entry points.
3298 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3299
Ted Kremenek49c79792011-03-24 00:28:47 +00003300 CmdArgs.push_back("-analyzer-eagerly-assume");
3301
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003303 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003304 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003305
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003306 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003307 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003308
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003309 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003310 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003311
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003312 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003313
Artem Belevichba558952015-05-06 18:20:23 +00003314 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003315 CmdArgs.push_back("-analyzer-checker=cplusplus");
3316
Nico Webere8e53112014-05-11 01:04:02 +00003317 // Enable the following experimental checkers for testing.
3318 CmdArgs.push_back(
3319 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003320 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3321 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003322 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003323 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3324 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003325
3326 // Default nullability checks.
3327 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3328 CmdArgs.push_back(
3329 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003330 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003331
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003332 // Set the output format. The default is plist, for (lame) historical
3333 // reasons.
3334 CmdArgs.push_back("-analyzer-output");
3335 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003336 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003337 else
3338 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003339
Ted Kremenekfe449a22010-03-22 22:32:05 +00003340 // Disable the presentation of standard compiler warnings when
3341 // using --analyze. We only want to show static analyzer diagnostics
3342 // or frontend errors.
3343 CmdArgs.push_back("-w");
3344
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003345 // Add -Xanalyzer arguments when running as analyzer.
3346 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003347 }
3348
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003349 CheckCodeGenerationOptions(D, Args);
3350
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003351 llvm::Reloc::Model RelocationModel;
3352 unsigned PICLevel;
3353 bool IsPIE;
3354 std::tie(RelocationModel, PICLevel, IsPIE) =
3355 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003356
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003357 const char *RMName = RelocationModelName(RelocationModel);
3358 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003359 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003360 CmdArgs.push_back(RMName);
3361 }
3362 if (PICLevel > 0) {
3363 CmdArgs.push_back("-pic-level");
3364 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3365 if (IsPIE) {
3366 CmdArgs.push_back("-pie-level");
3367 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003368 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003369 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003370
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003371 CmdArgs.push_back("-mthread-model");
3372 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3373 CmdArgs.push_back(A->getValue());
3374 else
3375 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3376
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003377 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3378
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003379 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3380 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003381 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003382
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003383 // LLVM Code Generator Options.
3384
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003385 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3386 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003387 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3388 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003389 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003390 CmdArgs.push_back(A->getValue());
3391 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003392 }
3393 }
3394
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003395 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3396 StringRef v = A->getValue();
3397 CmdArgs.push_back("-mllvm");
3398 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3399 A->claim();
3400 }
3401
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003402 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3403 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003404 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003405 }
3406
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003407 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3408 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003409 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003410 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003411 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003412 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3413 CmdArgs.push_back("-fpcc-struct-return");
3414 } else {
3415 assert(A->getOption().matches(options::OPT_freg_struct_return));
3416 CmdArgs.push_back("-freg-struct-return");
3417 }
3418 }
3419
Roman Divacky65b88cd2011-03-01 17:40:53 +00003420 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3421 CmdArgs.push_back("-mrtd");
3422
Rafael Espindola224dd632011-12-14 21:02:23 +00003423 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003424 CmdArgs.push_back("-mdisable-fp-elim");
3425 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3426 options::OPT_fno_zero_initialized_in_bss))
3427 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003428
3429 bool OFastEnabled = isOptimizationLevelFast(Args);
3430 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3431 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432 OptSpecifier StrictAliasingAliasOption =
3433 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003434 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3435 // doesn't do any TBAA.
3436 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003437 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003438 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003439 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003440 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3441 options::OPT_fno_struct_path_tbaa))
3442 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003443 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3444 false))
3445 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003446 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3447 options::OPT_fno_strict_vtable_pointers,
3448 false))
3449 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003450 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3451 options::OPT_fno_optimize_sibling_calls))
3452 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003453
Eric Christopher006208c2013-04-04 06:29:47 +00003454 // Handle segmented stacks.
3455 if (Args.hasArg(options::OPT_fsplit_stack))
3456 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003457
3458 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3459 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003460 OptSpecifier FastMathAliasOption =
3461 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3462
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003463 // Handle various floating point optimization flags, mapping them to the
3464 // appropriate LLVM code generation flags. The pattern for all of these is to
3465 // default off the codegen optimizations, and if any flag enables them and no
3466 // flag disables them after the flag enabling them, enable the codegen
3467 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468 if (Arg *A = Args.getLastArg(
3469 options::OPT_ffast_math, FastMathAliasOption,
3470 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3471 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3472 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003473 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3474 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003475 A->getOption().getID() != options::OPT_fhonor_infinities)
3476 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 if (Arg *A = Args.getLastArg(
3478 options::OPT_ffast_math, FastMathAliasOption,
3479 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3480 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3481 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003482 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3483 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003484 A->getOption().getID() != options::OPT_fhonor_nans)
3485 CmdArgs.push_back("-menable-no-nans");
3486
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003487 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3488 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003489 if (Arg *A =
3490 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3491 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3492 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003493 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3494 // However, turning *off* -ffast_math merely restores the toolchain default
3495 // (which may be false).
3496 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3497 A->getOption().getID() == options::OPT_ffast_math ||
3498 A->getOption().getID() == options::OPT_Ofast)
3499 MathErrno = false;
3500 else if (A->getOption().getID() == options::OPT_fmath_errno)
3501 MathErrno = true;
3502 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003503 if (MathErrno)
3504 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003505
3506 // There are several flags which require disabling very specific
3507 // optimizations. Any of these being disabled forces us to turn off the
3508 // entire set of LLVM optimizations, so collect them through all the flag
3509 // madness.
3510 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 if (Arg *A = Args.getLastArg(
3512 options::OPT_ffast_math, FastMathAliasOption,
3513 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3514 options::OPT_fno_unsafe_math_optimizations,
3515 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003516 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3517 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003518 A->getOption().getID() != options::OPT_fno_associative_math)
3519 AssociativeMath = true;
3520 bool ReciprocalMath = false;
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_funsafe_math_optimizations,
3524 options::OPT_fno_unsafe_math_optimizations,
3525 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003526 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3527 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003528 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3529 ReciprocalMath = true;
3530 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003531 if (Arg *A = Args.getLastArg(
3532 options::OPT_ffast_math, FastMathAliasOption,
3533 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3534 options::OPT_fno_unsafe_math_optimizations,
3535 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003536 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3537 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003538 A->getOption().getID() != options::OPT_fsigned_zeros)
3539 SignedZeros = false;
3540 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003541 if (Arg *A = Args.getLastArg(
3542 options::OPT_ffast_math, FastMathAliasOption,
3543 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3544 options::OPT_fno_unsafe_math_optimizations,
3545 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003546 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3547 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003548 A->getOption().getID() != options::OPT_ftrapping_math)
3549 TrappingMath = false;
3550 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3551 !TrappingMath)
3552 CmdArgs.push_back("-menable-unsafe-fp-math");
3553
Sanjay Patel76c9e092015-01-23 16:40:50 +00003554 if (!SignedZeros)
3555 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003556
Sanjay Patel359b1052015-04-09 15:03:23 +00003557 if (ReciprocalMath)
3558 CmdArgs.push_back("-freciprocal-math");
3559
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003560 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003561 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003562 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003563 options::OPT_ffp_contract)) {
3564 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003565 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003566 if (Val == "fast" || Val == "on" || Val == "off") {
3567 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3568 } else {
3569 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003571 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003572 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3573 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003574 // If fast-math is set then set the fp-contract mode to fast.
3575 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3576 }
3577 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003578
Sanjay Patel2987c292015-06-11 14:53:41 +00003579 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003580
Bob Wilson6a039162012-07-19 03:52:53 +00003581 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3582 // and if we find them, tell the frontend to provide the appropriate
3583 // preprocessor macros. This is distinct from enabling any optimizations as
3584 // these options induce language changes which must survive serialization
3585 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003586 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3587 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003588 if (!A->getOption().matches(options::OPT_fno_fast_math))
3589 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003590 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3591 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003592 if (A->getOption().matches(options::OPT_ffinite_math_only))
3593 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003594
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003595 // Decide whether to use verbose asm. Verbose assembly is the default on
3596 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003597 bool IsIntegratedAssemblerDefault =
3598 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003599 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003600 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003601 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003602 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003603
Rafael Espindolab8a12932015-05-22 20:44:03 +00003604 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3605 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003606 CmdArgs.push_back("-no-integrated-as");
3607
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003608 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3609 CmdArgs.push_back("-mdebug-pass");
3610 CmdArgs.push_back("Structure");
3611 }
3612 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3613 CmdArgs.push_back("-mdebug-pass");
3614 CmdArgs.push_back("Arguments");
3615 }
3616
John McCall8517abc2010-02-19 02:45:38 +00003617 // Enable -mconstructor-aliases except on darwin, where we have to
3618 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003619 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003620 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003621
John McCall7ef5cb32011-03-18 02:56:14 +00003622 // Darwin's kernel doesn't support guard variables; just die if we
3623 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003624 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003625 CmdArgs.push_back("-fforbid-guard-variables");
3626
Douglas Gregordbe39272011-02-01 15:15:22 +00003627 if (Args.hasArg(options::OPT_mms_bitfields)) {
3628 CmdArgs.push_back("-mms-bitfields");
3629 }
John McCall8517abc2010-02-19 02:45:38 +00003630
Daniel Dunbar306945d2009-09-16 06:17:29 +00003631 // This is a coarse approximation of what llvm-gcc actually does, both
3632 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3633 // complicated ways.
3634 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003635 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3636 options::OPT_fno_asynchronous_unwind_tables,
3637 (getToolChain().IsUnwindTablesDefault() ||
3638 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3639 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003640 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3641 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003642 CmdArgs.push_back("-munwind-tables");
3643
Chandler Carruth05fb5852012-11-21 23:40:23 +00003644 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003645
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003646 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3647 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003648 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003649 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003650
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003651 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003652 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003653
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003654 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003655 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003656 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003657 }
3658
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003659 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003660 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003661 if (!CPU.empty()) {
3662 CmdArgs.push_back("-target-cpu");
3663 CmdArgs.push_back(Args.MakeArgString(CPU));
3664 }
3665
Rafael Espindolaeb265472013-08-21 21:59:03 +00003666 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3667 CmdArgs.push_back("-mfpmath");
3668 CmdArgs.push_back(A->getValue());
3669 }
3670
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003671 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003672 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003673
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003674 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003675 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003676 default:
3677 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003678
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003679 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003680 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003681 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003682 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003683 // Use the effective triple, which takes into account the deployment target.
3684 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003685 break;
3686
Tim Northover573cbee2014-05-24 12:52:07 +00003687 case llvm::Triple::aarch64:
3688 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003689 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003690 break;
3691
Eric Christopher0b26a612010-03-02 02:41:08 +00003692 case llvm::Triple::mips:
3693 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003694 case llvm::Triple::mips64:
3695 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003696 AddMIPSTargetArgs(Args, CmdArgs);
3697 break;
3698
Ulrich Weigand8afad612014-07-28 13:17:52 +00003699 case llvm::Triple::ppc:
3700 case llvm::Triple::ppc64:
3701 case llvm::Triple::ppc64le:
3702 AddPPCTargetArgs(Args, CmdArgs);
3703 break;
3704
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003705 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003706 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003707 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003708 AddSparcTargetArgs(Args, CmdArgs);
3709 break;
3710
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003711 case llvm::Triple::x86:
3712 case llvm::Triple::x86_64:
3713 AddX86TargetArgs(Args, CmdArgs);
3714 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003715
3716 case llvm::Triple::hexagon:
3717 AddHexagonTargetArgs(Args, CmdArgs);
3718 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003719 }
3720
Hans Wennborg75958c42013-08-08 00:17:41 +00003721 // Add clang-cl arguments.
3722 if (getToolChain().getDriver().IsCLMode())
3723 AddClangCLArgs(Args, CmdArgs);
3724
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003725 // Pass the linker version in use.
3726 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3727 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003728 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003729 }
3730
Eric Christopherb7d97e92013-04-03 01:58:53 +00003731 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003732 CmdArgs.push_back("-momit-leaf-frame-pointer");
3733
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003734 // Explicitly error on some things we know we don't support and can't just
3735 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003736 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003737 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3738 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003739 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003740 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003741 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3742 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003743 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003744 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003745 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003746 }
3747
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003748 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003749 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003750 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003751 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003752 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3753 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003754 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003755 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003756 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003757
Chad Rosierbe10f982011-08-02 17:58:04 +00003758 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003759 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003760 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3761 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003762 }
3763
Manman Ren17bdb0f2013-11-20 20:22:14 +00003764 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3765 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003766 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003767 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003768 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003769 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3770 A->getOption().matches(options::OPT_g1)) &&
3771 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003772 // FIXME: we should support specifying dwarf version with
3773 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003774 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003775 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003776 const llvm::Triple &Triple = getToolChain().getTriple();
3777 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003778 Triple.getOS() == llvm::Triple::FreeBSD ||
3779 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003780 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003781 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003782 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3783 A->getOption().matches(options::OPT_gdwarf_3) ||
3784 A->getOption().matches(options::OPT_gdwarf_4)) {
3785 A->render(Args, CmdArgs);
3786 } else if (!A->getOption().matches(options::OPT_g0) &&
3787 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003788 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003789 const llvm::Triple &Triple = getToolChain().getTriple();
3790 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003791 Triple.getOS() == llvm::Triple::FreeBSD ||
3792 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003793 CmdArgs.push_back("-gdwarf-2");
3794 else
3795 CmdArgs.push_back("-g");
3796 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003797 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003798
Reid Kleckner124955a2015-08-05 18:51:13 +00003799 // Forward -gcodeview.
3800 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3801
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003802 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3803 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003804 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3805 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003806 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003807
Eric Christopher138c32b2013-09-13 22:37:55 +00003808 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003809 if (Args.hasArg(options::OPT_gmodules)) {
3810 CmdArgs.push_back("-g");
3811 CmdArgs.push_back("-dwarf-ext-refs");
3812 CmdArgs.push_back("-fmodule-format=obj");
3813 }
3814
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003815 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3816 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003817 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003818 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003819 CmdArgs.push_back("-g");
3820 CmdArgs.push_back("-backend-option");
3821 CmdArgs.push_back("-split-dwarf=Enable");
3822 }
3823
Eric Christopher138c32b2013-09-13 22:37:55 +00003824 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3825 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3826 CmdArgs.push_back("-backend-option");
3827 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3828 }
Eric Christophereec89c22013-06-18 00:03:50 +00003829
Eric Christopher0d403d22014-02-14 01:27:03 +00003830 // -gdwarf-aranges turns on the emission of the aranges section in the
3831 // backend.
3832 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3833 CmdArgs.push_back("-backend-option");
3834 CmdArgs.push_back("-generate-arange-section");
3835 }
3836
David Blaikief36d9ba2014-01-27 18:52:43 +00003837 if (Args.hasFlag(options::OPT_fdebug_types_section,
3838 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003839 CmdArgs.push_back("-backend-option");
3840 CmdArgs.push_back("-generate-type-units");
3841 }
Eric Christophereec89c22013-06-18 00:03:50 +00003842
Ed Schouten6e576152015-03-26 17:50:28 +00003843 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3844 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3845
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003846 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003847 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003848 CmdArgs.push_back("-ffunction-sections");
3849 }
3850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003851 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3852 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003853 CmdArgs.push_back("-fdata-sections");
3854 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003855
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003856 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003857 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003858 CmdArgs.push_back("-fno-unique-section-names");
3859
Chris Lattner3c77a352010-06-22 00:03:40 +00003860 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3861
Diego Novilloa0545962015-07-10 18:00:07 +00003862 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003863
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003864 // Pass options for controlling the default header search paths.
3865 if (Args.hasArg(options::OPT_nostdinc)) {
3866 CmdArgs.push_back("-nostdsysteminc");
3867 CmdArgs.push_back("-nobuiltininc");
3868 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003869 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003870 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003871 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3872 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3873 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003874
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003875 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003876 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003877 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003878
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003879 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3880
Ted Kremenekf7639e12012-03-06 20:06:33 +00003881 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003882 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003883 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003884 options::OPT_ccc_arcmt_modify,
3885 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003886 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003887 switch (A->getOption().getID()) {
3888 default:
3889 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003890 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003891 CmdArgs.push_back("-arcmt-check");
3892 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003893 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003894 CmdArgs.push_back("-arcmt-modify");
3895 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003896 case options::OPT_ccc_arcmt_migrate:
3897 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003898 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003899 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003900
3901 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3902 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003903 break;
John McCalld70fb982011-06-15 23:25:17 +00003904 }
3905 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003906 } else {
3907 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3908 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3909 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003910 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003911
Ted Kremenekf7639e12012-03-06 20:06:33 +00003912 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3913 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003914 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3915 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003916 }
3917 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003918 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003919
3920 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003921 options::OPT_objcmt_migrate_subscripting,
3922 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003923 // None specified, means enable them all.
3924 CmdArgs.push_back("-objcmt-migrate-literals");
3925 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003926 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003927 } else {
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003931 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003932 } else {
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003939 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003940 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3941 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3942 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3943 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3944 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3945 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3946 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003947 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003948 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003949 }
3950
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003951 // Add preprocessing options like -I, -D, etc. if we are using the
3952 // preprocessor.
3953 //
3954 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003955 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003956 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003957
Rafael Espindolaa7431922011-07-21 23:40:37 +00003958 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3959 // that "The compiler can only warn and ignore the option if not recognized".
3960 // When building with ccache, it will pass -D options to clang even on
3961 // preprocessed inputs and configure concludes that -fPIC is not supported.
3962 Args.ClaimAllArgs(options::OPT_D);
3963
Alp Toker7874bdc2013-11-15 20:40:58 +00003964 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003965 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3966 if (A->getOption().matches(options::OPT_O4)) {
3967 CmdArgs.push_back("-O3");
3968 D.Diag(diag::warn_O4_is_O3);
3969 } else {
3970 A->render(Args, CmdArgs);
3971 }
3972 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003974 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003975 for (const Arg *A :
3976 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3977 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003978 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003979 }
3980
Rafael Espindola577637a2015-01-03 00:06:04 +00003981 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003982
Richard Smith3be1cb22014-08-07 00:24:21 +00003983 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003984 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003985 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3986 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003987 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003988 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003989
3990 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003991 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003992 //
3993 // If a std is supplied, only add -trigraphs if it follows the
3994 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003995 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003996 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3997 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003998 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003999 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004000 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004001 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004002 else
4003 Std->render(Args, CmdArgs);
4004
Nico Weber00721502014-12-23 22:32:37 +00004005 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004006 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004007 options::OPT_ftrigraphs,
4008 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004009 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004010 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004011 } else {
4012 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004013 //
4014 // FIXME: Clang doesn't correctly handle -std= when the input language
4015 // doesn't match. For the time being just ignore this for C++ inputs;
4016 // eventually we want to do all the standard defaulting here instead of
4017 // splitting it between the driver and clang -cc1.
4018 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004019 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4020 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004021 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004022 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004023
Nico Weber00721502014-12-23 22:32:37 +00004024 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4025 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004026 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004027
Richard Smith282b4492013-09-04 22:50:31 +00004028 // GCC's behavior for -Wwrite-strings is a bit strange:
4029 // * In C, this "warning flag" changes the types of string literals from
4030 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4031 // for the discarded qualifier.
4032 // * In C++, this is just a normal warning flag.
4033 //
4034 // Implementing this warning correctly in C is hard, so we follow GCC's
4035 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4036 // a non-const char* in C, rather than using this crude hack.
4037 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004038 // FIXME: This should behave just like a warning flag, and thus should also
4039 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4040 Arg *WriteStrings =
4041 Args.getLastArg(options::OPT_Wwrite_strings,
4042 options::OPT_Wno_write_strings, options::OPT_w);
4043 if (WriteStrings &&
4044 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004045 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004046 }
4047
Chandler Carruth61fbf622011-04-23 09:27:53 +00004048 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004049 // during C++ compilation, which it is by default. GCC keeps this define even
4050 // in the presence of '-w', match this behavior bug-for-bug.
4051 if (types::isCXX(InputType) &&
4052 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4053 true)) {
4054 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004055 }
4056
Chandler Carruthe0391482010-05-22 02:21:53 +00004057 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4058 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4059 if (Asm->getOption().matches(options::OPT_fasm))
4060 CmdArgs.push_back("-fgnu-keywords");
4061 else
4062 CmdArgs.push_back("-fno-gnu-keywords");
4063 }
4064
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004065 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4066 CmdArgs.push_back("-fno-dwarf-directory-asm");
4067
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004068 if (ShouldDisableAutolink(Args, getToolChain()))
4069 CmdArgs.push_back("-fno-autolink");
4070
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004071 // Add in -fdebug-compilation-dir if necessary.
4072 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004073
Richard Smith9a568822011-11-21 19:36:32 +00004074 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4075 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004076 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004077 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004078 }
4079
Richard Smith79c927b2013-11-06 19:31:51 +00004080 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4081 CmdArgs.push_back("-foperator-arrow-depth");
4082 CmdArgs.push_back(A->getValue());
4083 }
4084
Richard Smith9a568822011-11-21 19:36:32 +00004085 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4086 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004087 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004088 }
4089
Richard Smitha3d3bd22013-05-08 02:12:03 +00004090 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4091 CmdArgs.push_back("-fconstexpr-steps");
4092 CmdArgs.push_back(A->getValue());
4093 }
4094
Richard Smithb3a14522013-02-22 01:59:51 +00004095 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4096 CmdArgs.push_back("-fbracket-depth");
4097 CmdArgs.push_back(A->getValue());
4098 }
4099
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004100 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4101 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004102 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004103 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004104 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4105 } else
4106 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004107 }
4108
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004109 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004110 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004111
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004112 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4113 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004114 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004115 }
David Chisnall5778fce2009-08-31 16:41:57 +00004116
Chris Lattnere23003d2010-01-09 21:54:33 +00004117 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4118 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004119 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004120 }
4121
Chris Lattnerb35583d2010-04-07 20:49:23 +00004122 CmdArgs.push_back("-ferror-limit");
4123 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004124 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004125 else
4126 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004127
Chandler Carrutha77a7272010-05-06 04:55:18 +00004128 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4129 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004130 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004131 }
4132
4133 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4134 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004135 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004136 }
4137
Richard Smithf6f003a2011-12-16 19:06:07 +00004138 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4139 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004140 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004141 }
4142
Nick Lewycky24653262014-12-16 21:39:02 +00004143 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4144 CmdArgs.push_back("-fspell-checking-limit");
4145 CmdArgs.push_back(A->getValue());
4146 }
4147
Daniel Dunbar2c978472009-11-04 06:24:47 +00004148 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004149 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004150 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004151 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004152 } else {
4153 // If -fmessage-length=N was not specified, determine whether this is a
4154 // terminal and, if so, implicitly define -fmessage-length appropriately.
4155 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004156 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004157 }
4158
John McCallb4a99d32013-02-19 01:57:35 +00004159 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4160 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4161 options::OPT_fvisibility_ms_compat)) {
4162 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4163 CmdArgs.push_back("-fvisibility");
4164 CmdArgs.push_back(A->getValue());
4165 } else {
4166 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4167 CmdArgs.push_back("-fvisibility");
4168 CmdArgs.push_back("hidden");
4169 CmdArgs.push_back("-ftype-visibility");
4170 CmdArgs.push_back("default");
4171 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004172 }
4173
Douglas Gregor08329632010-06-15 17:05:35 +00004174 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004175
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004176 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4177
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004178 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004179 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4180 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004181 CmdArgs.push_back("-ffreestanding");
4182
Daniel Dunbare357d562009-12-03 18:42:11 +00004183 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004184 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004185 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004186 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4187 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004188 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004189 // Emulated TLS is enabled by default on Android, and can be enabled manually
4190 // with -femulated-tls.
4191 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4192 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4193 EmulatedTLSDefault))
4194 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004195 // AltiVec-like language extensions aren't relevant for assembling.
4196 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004197 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004198 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4199 }
Richard Trieu91844232012-06-26 18:18:47 +00004200 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4201 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004202
Alexey Bataevdb390212015-05-20 04:24:19 +00004203 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004204 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4205 options::OPT_fno_openmp, false))
4206 switch (getOpenMPRuntime(getToolChain(), Args)) {
4207 case OMPRT_OMP:
4208 case OMPRT_IOMP5:
4209 // Clang can generate useful OpenMP code for these two runtime libraries.
4210 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004211
4212 // If no option regarding the use of TLS in OpenMP codegeneration is
4213 // given, decide a default based on the target. Otherwise rely on the
4214 // options and pass the right information to the frontend.
4215 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004216 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004217 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004218 break;
4219 default:
4220 // By default, if Clang doesn't know how to generate useful OpenMP code
4221 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4222 // down to the actual compilation.
4223 // FIXME: It would be better to have a mode which *only* omits IR
4224 // generation based on the OpenMP support so that we get consistent
4225 // semantic analysis, etc.
4226 break;
4227 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004228
Peter Collingbourne32701642013-11-01 18:16:25 +00004229 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004230 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004231
Eric Christopher459d2712013-02-19 06:16:53 +00004232 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004233 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4234 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4235 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4236 Arch == llvm::Triple::ppc64le))
4237 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4238 << "ppc/ppc64/ppc64le";
4239 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004240
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004241 // -fzvector is incompatible with -faltivec.
4242 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4243 if (Args.hasArg(options::OPT_faltivec))
4244 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4245 << "-faltivec";
4246
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004247 if (getToolChain().SupportsProfiling())
4248 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004249
4250 // -flax-vector-conversions is default.
4251 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4252 options::OPT_fno_lax_vector_conversions))
4253 CmdArgs.push_back("-fno-lax-vector-conversions");
4254
John Brawna7b4ec02015-08-10 11:11:28 +00004255 if (Args.getLastArg(options::OPT_fapple_kext) ||
4256 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004257 CmdArgs.push_back("-fapple-kext");
4258
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004259 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004260 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004261 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004262 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4263 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004264
4265 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4266 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004267 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004268 }
4269
Bob Wilson14adb362012-02-03 06:27:22 +00004270 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004271
Chandler Carruth6e501032011-03-27 00:04:55 +00004272 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4273 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004274 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004275 if (A->getOption().matches(options::OPT_fwrapv))
4276 CmdArgs.push_back("-fwrapv");
4277 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4278 options::OPT_fno_strict_overflow)) {
4279 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4280 CmdArgs.push_back("-fwrapv");
4281 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004282
4283 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4284 options::OPT_fno_reroll_loops))
4285 if (A->getOption().matches(options::OPT_freroll_loops))
4286 CmdArgs.push_back("-freroll-loops");
4287
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004288 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004289 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4290 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004291
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004292 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4293
Daniel Dunbar4930e332009-11-17 08:07:36 +00004294 // -stack-protector=0 is default.
4295 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004296 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4297 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4298 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4299 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4300 Args.ClaimAllArgs(options::OPT_fstack_protector);
4301 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004302 options::OPT_fstack_protector_all,
4303 options::OPT_fstack_protector_strong,
4304 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004305 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004306 StackProtectorLevel = std::max<unsigned>(
4307 LangOptions::SSPOn,
4308 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004309 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004310 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004311 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004312 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004313 } else {
4314 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004315 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004316 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004317 if (StackProtectorLevel) {
4318 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004319 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004320 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004321
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004322 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004323 for (const Arg *A : Args.filtered(options::OPT__param)) {
4324 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004325 if (Str.startswith("ssp-buffer-size=")) {
4326 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004327 CmdArgs.push_back("-stack-protector-buffer-size");
4328 // FIXME: Verify the argument is a valid integer.
4329 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004330 }
Sean Silva14facf32015-06-09 01:57:17 +00004331 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004332 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004333 }
4334
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004335 // Translate -mstackrealign
4336 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004337 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004338 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004339
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004340 if (Args.hasArg(options::OPT_mstack_alignment)) {
4341 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4342 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004343 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004344
Hans Wennborg77dc2362015-01-20 19:45:50 +00004345 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4346 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4347
4348 if (!Size.empty())
4349 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4350 else
4351 CmdArgs.push_back("-mstack-probe-size=0");
4352 }
4353
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004354 switch (getToolChain().getArch()) {
4355 case llvm::Triple::aarch64:
4356 case llvm::Triple::aarch64_be:
4357 case llvm::Triple::arm:
4358 case llvm::Triple::armeb:
4359 case llvm::Triple::thumb:
4360 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004361 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004362 break;
4363
4364 default:
4365 break;
4366 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004367
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004368 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4369 options::OPT_mno_restrict_it)) {
4370 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4371 CmdArgs.push_back("-backend-option");
4372 CmdArgs.push_back("-arm-restrict-it");
4373 } else {
4374 CmdArgs.push_back("-backend-option");
4375 CmdArgs.push_back("-arm-no-restrict-it");
4376 }
James Y Knight2db38f32015-08-15 03:45:25 +00004377 } else if (Triple.isOSWindows() &&
4378 (Triple.getArch() == llvm::Triple::arm ||
4379 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004380 // Windows on ARM expects restricted IT blocks
4381 CmdArgs.push_back("-backend-option");
4382 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004383 }
4384
Daniel Dunbard18049a2009-04-07 21:16:11 +00004385 // Forward -f options with positive and negative forms; we translate
4386 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004387 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4388 StringRef fname = A->getValue();
4389 if (!llvm::sys::fs::exists(fname))
4390 D.Diag(diag::err_drv_no_such_file) << fname;
4391 else
4392 A->render(Args, CmdArgs);
4393 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004394
John Brawna7b4ec02015-08-10 11:11:28 +00004395 // -fbuiltin is default unless -mkernel is used
4396 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4397 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004398 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004399
Nuno Lopes13c88c72009-12-16 16:59:22 +00004400 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4401 options::OPT_fno_assume_sane_operator_new))
4402 CmdArgs.push_back("-fno-assume-sane-operator-new");
4403
Daniel Dunbar4930e332009-11-17 08:07:36 +00004404 // -fblocks=0 is default.
4405 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004406 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004407 (Args.hasArg(options::OPT_fgnu_runtime) &&
4408 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4409 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004410 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004411
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004412 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004413 !getToolChain().hasBlocksRuntime())
4414 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004415 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004416
Richard Smith47972af2015-06-16 00:08:24 +00004417 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004418 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004419 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004420 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004421 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004422 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4423 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004424 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004425 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004426 HaveModules = true;
4427 }
4428 }
4429
Richard Smith47972af2015-06-16 00:08:24 +00004430 // -fmodule-maps enables implicit reading of module map files. By default,
4431 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004432 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4433 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004434 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004435 }
4436
Daniel Jasperac42b752013-10-21 06:34:34 +00004437 // -fmodules-decluse checks that modules used are declared so (off by
4438 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004439 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004440 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004441 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004442 }
4443
Daniel Jasper962b38e2014-04-11 11:47:45 +00004444 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4445 // all #included headers are part of modules.
4446 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004447 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004448 CmdArgs.push_back("-fmodules-strict-decluse");
4449 }
4450
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004451 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4452 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4453 options::OPT_fno_implicit_modules)) {
4454 CmdArgs.push_back("-fno-implicit-modules");
4455 }
4456
Daniel Jasperac42b752013-10-21 06:34:34 +00004457 // -fmodule-name specifies the module that is currently being built (or
4458 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004459 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004460
Richard Smith9887d792014-10-17 01:42:53 +00004461 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004462 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004463 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004464
Richard Smithe842a472014-10-22 02:05:46 +00004465 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004466 if (HaveModules)
4467 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4468 else
4469 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004470
4471 // -fmodule-cache-path specifies where our implicitly-built module files
4472 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004473 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004474 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004475 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004476 if (HaveModules) {
4477 if (C.isForDiagnostics()) {
4478 // When generating crash reports, we want to emit the modules along with
4479 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004480 Path = Output.getFilename();
4481 llvm::sys::path::replace_extension(Path, ".cache");
4482 llvm::sys::path::append(Path, "modules");
4483 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004484 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004485 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004486 llvm::sys::path::append(Path, "org.llvm.clang.");
4487 appendUserToPath(Path);
4488 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004489 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004490 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004491 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4492 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004493 }
4494
4495 // When building modules and generating crashdumps, we need to dump a module
4496 // dependency VFS alongside the output.
4497 if (HaveModules && C.isForDiagnostics()) {
4498 SmallString<128> VFSDir(Output.getFilename());
4499 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004500 // Add the cache directory as a temp so the crash diagnostics pick it up.
4501 C.addTempFile(Args.MakeArgString(VFSDir));
4502
Justin Bognera88f0122014-06-20 22:59:50 +00004503 llvm::sys::path::append(VFSDir, "vfs");
4504 CmdArgs.push_back("-module-dependency-dir");
4505 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004506 }
4507
Richard Smith9887d792014-10-17 01:42:53 +00004508 if (HaveModules)
4509 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004510
Douglas Gregor35b04d62013-02-07 19:01:24 +00004511 // Pass through all -fmodules-ignore-macro arguments.
4512 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004513 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4514 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004515
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004516 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4517
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004518 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4519 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4520 D.Diag(diag::err_drv_argument_not_allowed_with)
4521 << A->getAsString(Args) << "-fbuild-session-timestamp";
4522
4523 llvm::sys::fs::file_status Status;
4524 if (llvm::sys::fs::status(A->getValue(), Status))
4525 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004526 CmdArgs.push_back(Args.MakeArgString(
4527 "-fbuild-session-timestamp=" +
4528 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004529 }
4530
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004531 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004532 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4533 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004534 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4535
4536 Args.AddLastArg(CmdArgs,
4537 options::OPT_fmodules_validate_once_per_build_session);
4538 }
4539
Ben Langmuirdcf73862014-03-12 00:06:17 +00004540 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4541
John McCalldfea9982010-04-09 19:12:06 +00004542 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004543 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004544 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004545 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004546
Anders Carlssond470fef2010-11-21 00:09:52 +00004547 // -felide-constructors is the default.
4548 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004549 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004550 CmdArgs.push_back("-fno-elide-constructors");
4551
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004552 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004553
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004554 if (KernelOrKext || (types::isCXX(InputType) &&
4555 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4556 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004557 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004558
Tony Linthicum76329bf2011-12-12 21:14:55 +00004559 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004560 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4561 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004562 CmdArgs.push_back("-fshort-enums");
4563
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004564 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004565 if (Arg *A = Args.getLastArg(
4566 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4567 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4568 if (A->getOption().matches(options::OPT_funsigned_char) ||
4569 A->getOption().matches(options::OPT_fno_signed_char)) {
4570 CmdArgs.push_back("-fno-signed-char");
4571 }
4572 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004573 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004574 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004575
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004576 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004577 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4578 options::OPT_fno_use_cxa_atexit,
4579 !IsWindowsCygnus && !IsWindowsGNU &&
Rafael Espindolafe71f382015-09-14 23:21:31 +00004580 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4581 getToolChain().getArch() != llvm::Triple::hexagon &&
4582 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004583 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004584 CmdArgs.push_back("-fno-use-cxa-atexit");
4585
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004586 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004587 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004588 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004589 CmdArgs.push_back("-fms-extensions");
4590
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004591 // -fno-use-line-directives is default.
4592 if (Args.hasFlag(options::OPT_fuse_line_directives,
4593 options::OPT_fno_use_line_directives, false))
4594 CmdArgs.push_back("-fuse-line-directives");
4595
Francois Pichet1b4f1632011-09-17 04:32:15 +00004596 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004597 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004598 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004599 (IsWindowsMSVC &&
4600 Args.hasFlag(options::OPT_fms_extensions,
4601 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004602 CmdArgs.push_back("-fms-compatibility");
4603
David Majnemerc371ff02015-03-22 08:39:22 +00004604 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004605 VersionTuple MSVT = visualstudio::getMSVCVersion(
4606 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4607 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004608 CmdArgs.push_back(
4609 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004610
David Majnemer8db91762015-05-18 04:49:30 +00004611 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4612 if (ImplyVCPPCXXVer) {
4613 if (IsMSVC2015Compatible)
4614 CmdArgs.push_back("-std=c++14");
4615 else
4616 CmdArgs.push_back("-std=c++11");
4617 }
4618
Eric Christopher5ecce122013-02-18 00:38:31 +00004619 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004620 if (Args.hasFlag(options::OPT_fborland_extensions,
4621 options::OPT_fno_borland_extensions, false))
4622 CmdArgs.push_back("-fborland-extensions");
4623
David Majnemerc371ff02015-03-22 08:39:22 +00004624 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4625 // than 19.
4626 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4627 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004628 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004629 CmdArgs.push_back("-fno-threadsafe-statics");
4630
Francois Pichet02744872011-09-01 16:38:08 +00004631 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4632 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004633 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004634 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004635 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004636
Chandler Carruthe03aa552010-04-17 20:17:31 +00004637 // -fgnu-keywords default varies depending on language; only pass if
4638 // specified.
4639 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004640 options::OPT_fno_gnu_keywords))
4641 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004642
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004643 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004644 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004645 CmdArgs.push_back("-fgnu89-inline");
4646
Chad Rosier9c76d242012-03-15 22:31:42 +00004647 if (Args.hasArg(options::OPT_fno_inline))
4648 CmdArgs.push_back("-fno-inline");
4649
Chad Rosier64d6be92012-03-06 21:17:19 +00004650 if (Args.hasArg(options::OPT_fno_inline_functions))
4651 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004652
John McCall5fb5df92012-06-20 06:18:46 +00004653 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004654
John McCall5fb5df92012-06-20 06:18:46 +00004655 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004656 // legacy is the default. Except for deployment taget of 10.5,
4657 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4658 // gets ignored silently.
4659 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004660 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4661 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004662 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004663 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004664 if (getToolChain().UseObjCMixedDispatch())
4665 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4666 else
4667 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4668 }
4669 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004670
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004671 // When ObjectiveC legacy runtime is in effect on MacOSX,
4672 // turn on the option to do Array/Dictionary subscripting
4673 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004674 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004675 getToolChain().getTriple().isMacOSX() &&
4676 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4677 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004678 objcRuntime.isNeXTFamily())
4679 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004680
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004681 // -fencode-extended-block-signature=1 is default.
4682 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4683 CmdArgs.push_back("-fencode-extended-block-signature");
4684 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004685
John McCall24fc0de2011-07-06 00:26:06 +00004686 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4687 // NOTE: This logic is duplicated in ToolChains.cpp.
4688 bool ARC = isObjCAutoRefCount(Args);
4689 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004690 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004691
John McCall24fc0de2011-07-06 00:26:06 +00004692 CmdArgs.push_back("-fobjc-arc");
4693
Chandler Carruth491db322011-11-04 07:34:47 +00004694 // FIXME: It seems like this entire block, and several around it should be
4695 // wrapped in isObjC, but for now we just use it here as this is where it
4696 // was being used previously.
4697 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4698 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4699 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4700 else
4701 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4702 }
4703
John McCall24fc0de2011-07-06 00:26:06 +00004704 // Allow the user to enable full exceptions code emission.
4705 // We define off for Objective-CC, on for Objective-C++.
4706 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4707 options::OPT_fno_objc_arc_exceptions,
4708 /*default*/ types::isCXX(InputType)))
4709 CmdArgs.push_back("-fobjc-arc-exceptions");
4710 }
4711
4712 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4713 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004714 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004715 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004716
John McCall24fc0de2011-07-06 00:26:06 +00004717 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4718 // takes precedence.
4719 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4720 if (!GCArg)
4721 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4722 if (GCArg) {
4723 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004725 } else if (getToolChain().SupportsObjCGC()) {
4726 GCArg->render(Args, CmdArgs);
4727 } else {
4728 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004729 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004730 }
4731 }
4732
Bob Wilsonb111ec92015-03-02 19:01:14 +00004733 if (Args.hasFlag(options::OPT_fapplication_extension,
4734 options::OPT_fno_application_extension, false))
4735 CmdArgs.push_back("-fapplication-extension");
4736
Reid Klecknerc542d372014-06-27 17:02:02 +00004737 // Handle GCC-style exception args.
4738 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004739 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4740 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004741
4742 if (getToolChain().UseSjLjExceptions())
4743 CmdArgs.push_back("-fsjlj-exceptions");
4744
4745 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004746 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4747 options::OPT_fno_assume_sane_operator_new))
4748 CmdArgs.push_back("-fno-assume-sane-operator-new");
4749
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004750 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4751 // most platforms.
4752 if (Args.hasFlag(options::OPT_fsized_deallocation,
4753 options::OPT_fno_sized_deallocation, false))
4754 CmdArgs.push_back("-fsized-deallocation");
4755
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004756 // -fconstant-cfstrings is default, and may be subject to argument translation
4757 // on Darwin.
4758 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4759 options::OPT_fno_constant_cfstrings) ||
4760 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4761 options::OPT_mno_constant_cfstrings))
4762 CmdArgs.push_back("-fno-constant-cfstrings");
4763
John Thompsoned4e2952009-11-05 20:14:16 +00004764 // -fshort-wchar default varies depending on platform; only
4765 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004766 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4767 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004768 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004769
Hans Wennborg28c96312013-07-31 23:39:13 +00004770 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004771 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004772 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004773 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004774
Daniel Dunbar096ed292011-10-05 21:04:55 +00004775 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4776 // -fno-pack-struct doesn't apply to -fpack-struct=.
4777 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004778 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004779 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004780 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004781 } else if (Args.hasFlag(options::OPT_fpack_struct,
4782 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004783 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004784 }
4785
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004786 // Handle -fmax-type-align=N and -fno-type-align
4787 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4788 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4789 if (!SkipMaxTypeAlign) {
4790 std::string MaxTypeAlignStr = "-fmax-type-align=";
4791 MaxTypeAlignStr += A->getValue();
4792 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4793 }
4794 } else if (getToolChain().getTriple().isOSDarwin()) {
4795 if (!SkipMaxTypeAlign) {
4796 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4797 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4798 }
4799 }
4800
John Brawna7b4ec02015-08-10 11:11:28 +00004801 // -fcommon is the default unless compiling kernel code or the target says so
4802 bool NoCommonDefault =
4803 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4804 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4805 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004806 CmdArgs.push_back("-fno-common");
4807
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004808 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004809 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004810 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004811 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004812 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004813 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004814
Daniel Dunbar6358d682010-10-15 22:30:42 +00004815 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004816 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004817 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004818 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004819
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004820 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004821 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4822 StringRef value = inputCharset->getValue();
4823 if (value != "UTF-8")
4824 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4825 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004826 }
4827
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004828 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004829 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4830 StringRef value = execCharset->getValue();
4831 if (value != "UTF-8")
4832 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4833 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004834 }
4835
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004836 // -fcaret-diagnostics is default.
4837 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4838 options::OPT_fno_caret_diagnostics, true))
4839 CmdArgs.push_back("-fno-caret-diagnostics");
4840
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004841 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004842 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004843 options::OPT_fno_diagnostics_fixit_info))
4844 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004845
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004846 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004847 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004848 options::OPT_fno_diagnostics_show_option))
4849 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004850
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004851 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004852 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004853 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004854 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004855 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004856
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004858 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004859 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004860 }
4861
Chandler Carruthb6766f02011-03-27 01:50:55 +00004862 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004863 options::OPT_fdiagnostics_show_note_include_stack,
4864 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004865 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004866 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004867 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4868 else
4869 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4870 }
4871
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004872 // Color diagnostics are the default, unless the terminal doesn't support
4873 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004874 // Support both clang's -f[no-]color-diagnostics and gcc's
4875 // -f[no-]diagnostics-colors[=never|always|auto].
4876 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004877 for (const auto &Arg : Args) {
4878 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004879 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4880 !O.matches(options::OPT_fdiagnostics_color) &&
4881 !O.matches(options::OPT_fno_color_diagnostics) &&
4882 !O.matches(options::OPT_fno_diagnostics_color) &&
4883 !O.matches(options::OPT_fdiagnostics_color_EQ))
4884 continue;
4885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004886 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004887 if (O.matches(options::OPT_fcolor_diagnostics) ||
4888 O.matches(options::OPT_fdiagnostics_color)) {
4889 ShowColors = Colors_On;
4890 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4891 O.matches(options::OPT_fno_diagnostics_color)) {
4892 ShowColors = Colors_Off;
4893 } else {
4894 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004895 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004896 if (value == "always")
4897 ShowColors = Colors_On;
4898 else if (value == "never")
4899 ShowColors = Colors_Off;
4900 else if (value == "auto")
4901 ShowColors = Colors_Auto;
4902 else
4903 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004904 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004905 }
4906 }
4907 if (ShowColors == Colors_On ||
4908 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004909 CmdArgs.push_back("-fcolor-diagnostics");
4910
Nico Rieck7857d462013-09-11 00:38:02 +00004911 if (Args.hasArg(options::OPT_fansi_escape_codes))
4912 CmdArgs.push_back("-fansi-escape-codes");
4913
Daniel Dunbardb097022009-06-08 21:13:54 +00004914 if (!Args.hasFlag(options::OPT_fshow_source_location,
4915 options::OPT_fno_show_source_location))
4916 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004918 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004919 true))
4920 CmdArgs.push_back("-fno-show-column");
4921
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004922 if (!Args.hasFlag(options::OPT_fspell_checking,
4923 options::OPT_fno_spell_checking))
4924 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004925
Chad Rosierc8e56e82012-12-05 21:08:21 +00004926 // -fno-asm-blocks is default.
4927 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4928 false))
4929 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004930
Steven Wucb0d13f2015-01-16 23:05:28 +00004931 // -fgnu-inline-asm is default.
4932 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4933 options::OPT_fno_gnu_inline_asm, true))
4934 CmdArgs.push_back("-fno-gnu-inline-asm");
4935
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004936 // Enable vectorization per default according to the optimization level
4937 // selected. For optimization levels that want vectorization we use the alias
4938 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004939 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004940 OptSpecifier VectorizeAliasOption =
4941 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004942 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004943 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004944 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004945
Chad Rosier136d67d2014-04-28 19:30:57 +00004946 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004947 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004948 OptSpecifier SLPVectAliasOption =
4949 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004950 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004951 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004952 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004953
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004954 // -fno-slp-vectorize-aggressive is default.
4955 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004956 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004957 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004958
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004959 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4960 A->render(Args, CmdArgs);
4961
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004962 // -fdollars-in-identifiers default varies depending on platform and
4963 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004964 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004965 options::OPT_fno_dollars_in_identifiers)) {
4966 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004967 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004968 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004969 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004970 }
4971
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004972 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4973 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004974 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004975 options::OPT_fno_unit_at_a_time)) {
4976 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004977 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004978 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004979
Eli Friedman055c9702011-11-02 01:53:16 +00004980 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4981 options::OPT_fno_apple_pragma_pack, false))
4982 CmdArgs.push_back("-fapple-pragma-pack");
4983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004984 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004985 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4986 // by default.
4987 if (getToolChain().getArch() == llvm::Triple::le32) {
4988 CmdArgs.push_back("-fno-math-builtin");
4989 }
4990
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004991// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4992//
4993// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004994#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004995 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004996 (getToolChain().getArch() == llvm::Triple::arm ||
4997 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004998 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4999 CmdArgs.push_back("-fno-builtin-strcat");
5000 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5001 CmdArgs.push_back("-fno-builtin-strcpy");
5002 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005003#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005004
Justin Bognera88f0122014-06-20 22:59:50 +00005005 // Enable rewrite includes if the user's asked for it or if we're generating
5006 // diagnostics.
5007 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5008 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005009 if (Args.hasFlag(options::OPT_frewrite_includes,
5010 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005011 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005012 CmdArgs.push_back("-frewrite-includes");
5013
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005014 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005015 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005016 options::OPT_traditional_cpp)) {
5017 if (isa<PreprocessJobAction>(JA))
5018 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005019 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005020 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005021 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005022
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005023 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005024 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005026 // Handle serialized diagnostics.
5027 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5028 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005029 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005030 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005031
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005032 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5033 CmdArgs.push_back("-fretain-comments-from-system-headers");
5034
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005035 // Forward -fcomment-block-commands to -cc1.
5036 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005037 // Forward -fparse-all-comments to -cc1.
5038 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005039
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005040 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5041 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005042 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005043 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5044 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005045
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005046 // We translate this by hand to the -cc1 argument, since nightly test uses
5047 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005048 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005049 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005050 } else
Sean Silva14facf32015-06-09 01:57:17 +00005051 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005052 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005053
Bob Wilson23a55f12014-12-21 07:00:00 +00005054 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005055 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5056 // by the frontend.
5057 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5058 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005059
Daniel Dunbard67a3222009-03-30 06:36:42 +00005060 if (Output.getType() == types::TY_Dependencies) {
5061 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005062 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005063 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005064 CmdArgs.push_back(Output.getFilename());
5065 } else {
5066 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005067 }
5068
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005069 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005070
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005071 if (Input.isFilename())
5072 CmdArgs.push_back(Input.getFilename());
5073 else
5074 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005075
Chris Lattnere9d7d782009-11-03 19:50:27 +00005076 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5077
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005078 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005079
5080 // Optionally embed the -cc1 level arguments into the debug info, for build
5081 // analysis.
5082 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005083 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005084 for (const auto &Arg : Args)
5085 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005086
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005087 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005088 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005089 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005090 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005091 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005092 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005093 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005094 }
5095 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005096 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005097 }
5098
Eric Christopherd3804002013-02-22 20:12:52 +00005099 // Add the split debug info name to the command lines here so we
5100 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005101 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005102 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5103 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005104 const char *SplitDwarfOut;
5105 if (SplitDwarf) {
5106 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005107 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005108 CmdArgs.push_back(SplitDwarfOut);
5109 }
5110
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005111 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5112 // Include them with -fcuda-include-gpubinary.
5113 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005114 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005115 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005116 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005117 }
5118
Eric Christopherd3804002013-02-22 20:12:52 +00005119 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005120 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005121 Output.getType() == types::TY_Object &&
5122 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005123 auto CLCommand =
5124 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005125 C.addCommand(llvm::make_unique<FallbackCommand>(
5126 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005127 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005128 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005129 }
5130
Eric Christopherf1545832013-02-22 23:50:16 +00005131 // Handle the debug info splitting at object creation time if we're
5132 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005133 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005134 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005135 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005136
Roman Divacky178e01602011-02-10 16:52:03 +00005137 if (Arg *A = Args.getLastArg(options::OPT_pg))
5138 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005139 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5140 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005141
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005142 // Claim some arguments which clang supports automatically.
5143
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005144 // -fpch-preprocess is used with gcc to add a special marker in the output to
5145 // include the PCH file. Clang's PTH solution is completely transparent, so we
5146 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005147 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005148
Daniel Dunbar17731772009-03-23 19:03:36 +00005149 // Claim some arguments which clang doesn't support, but we don't
5150 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005151 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5152 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005153
Rafael Espindolab0092d72013-09-04 19:37:35 +00005154 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005155 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005156}
5157
John McCall5fb5df92012-06-20 06:18:46 +00005158/// Add options related to the Objective-C runtime/ABI.
5159///
5160/// Returns true if the runtime is non-fragile.
5161ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5162 ArgStringList &cmdArgs,
5163 RewriteKind rewriteKind) const {
5164 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005165 Arg *runtimeArg =
5166 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5167 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005168
5169 // Just forward -fobjc-runtime= to the frontend. This supercedes
5170 // options about fragility.
5171 if (runtimeArg &&
5172 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5173 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005174 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005175 if (runtime.tryParse(value)) {
5176 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005177 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005178 }
5179
5180 runtimeArg->render(args, cmdArgs);
5181 return runtime;
5182 }
5183
5184 // Otherwise, we'll need the ABI "version". Version numbers are
5185 // slightly confusing for historical reasons:
5186 // 1 - Traditional "fragile" ABI
5187 // 2 - Non-fragile ABI, version 1
5188 // 3 - Non-fragile ABI, version 2
5189 unsigned objcABIVersion = 1;
5190 // If -fobjc-abi-version= is present, use that to set the version.
5191 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005192 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005193 if (value == "1")
5194 objcABIVersion = 1;
5195 else if (value == "2")
5196 objcABIVersion = 2;
5197 else if (value == "3")
5198 objcABIVersion = 3;
5199 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005200 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005201 } else {
5202 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005203 bool nonFragileABIIsDefault =
5204 (rewriteKind == RK_NonFragile ||
5205 (rewriteKind == RK_None &&
5206 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005207 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5208 options::OPT_fno_objc_nonfragile_abi,
5209 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005210// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005211#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5212 unsigned nonFragileABIVersion = 1;
5213#else
5214 unsigned nonFragileABIVersion = 2;
5215#endif
5216
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005217 if (Arg *abiArg =
5218 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005219 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005220 if (value == "1")
5221 nonFragileABIVersion = 1;
5222 else if (value == "2")
5223 nonFragileABIVersion = 2;
5224 else
5225 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005226 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005227 }
5228
5229 objcABIVersion = 1 + nonFragileABIVersion;
5230 } else {
5231 objcABIVersion = 1;
5232 }
5233 }
5234
5235 // We don't actually care about the ABI version other than whether
5236 // it's non-fragile.
5237 bool isNonFragile = objcABIVersion != 1;
5238
5239 // If we have no runtime argument, ask the toolchain for its default runtime.
5240 // However, the rewriter only really supports the Mac runtime, so assume that.
5241 ObjCRuntime runtime;
5242 if (!runtimeArg) {
5243 switch (rewriteKind) {
5244 case RK_None:
5245 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5246 break;
5247 case RK_Fragile:
5248 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5249 break;
5250 case RK_NonFragile:
5251 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5252 break;
5253 }
5254
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005256 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5257 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005258 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005259 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5260
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005261 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005262 } else {
5263 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5264 }
5265
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005266 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005267 } else {
5268 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005269 // Legacy behaviour is to target the gnustep runtime if we are i
5270 // non-fragile mode or the GCC runtime in fragile mode.
5271 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005272 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005273 else
5274 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005275 }
5276
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005277 cmdArgs.push_back(
5278 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005279 return runtime;
5280}
5281
Reid Klecknerc542d372014-06-27 17:02:02 +00005282static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5283 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5284 I += HaveDash;
5285 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005286}
Reid Klecknerc542d372014-06-27 17:02:02 +00005287
5288struct EHFlags {
5289 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5290 bool Synch;
5291 bool Asynch;
5292 bool NoExceptC;
5293};
5294
5295/// /EH controls whether to run destructor cleanups when exceptions are
5296/// thrown. There are three modifiers:
5297/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5298/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5299/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5300/// - c: Assume that extern "C" functions are implicitly noexcept. This
5301/// modifier is an optimization, so we ignore it for now.
5302/// The default is /EHs-c-, meaning cleanups are disabled.
5303static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5304 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005305
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005306 std::vector<std::string> EHArgs =
5307 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005308 for (auto EHVal : EHArgs) {
5309 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5310 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005311 case 'a':
5312 EH.Asynch = maybeConsumeDash(EHVal, I);
5313 continue;
5314 case 'c':
5315 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5316 continue;
5317 case 's':
5318 EH.Synch = maybeConsumeDash(EHVal, I);
5319 continue;
5320 default:
5321 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005322 }
5323 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5324 break;
5325 }
5326 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005327
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005328 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5329 // can use -Xclang to manually enable C++ EH until then.
5330 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005331
Reid Klecknerc542d372014-06-27 17:02:02 +00005332 return EH;
5333}
5334
Hans Wennborg75958c42013-08-08 00:17:41 +00005335void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5336 unsigned RTOptionID = options::OPT__SLASH_MT;
5337
Hans Wennborgf1a74252013-09-10 20:18:04 +00005338 if (Args.hasArg(options::OPT__SLASH_LDd))
5339 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5340 // but defining _DEBUG is sticky.
5341 RTOptionID = options::OPT__SLASH_MTd;
5342
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005343 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005344 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005345
David Majnemere2afb472015-07-24 06:49:13 +00005346 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005347 switch (RTOptionID) {
5348 case options::OPT__SLASH_MD:
5349 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005350 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005351 CmdArgs.push_back("-D_MT");
5352 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005353 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354 break;
5355 case options::OPT__SLASH_MDd:
5356 CmdArgs.push_back("-D_DEBUG");
5357 CmdArgs.push_back("-D_MT");
5358 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005359 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 break;
5361 case options::OPT__SLASH_MT:
5362 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005363 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005365 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005366 break;
5367 case options::OPT__SLASH_MTd:
5368 CmdArgs.push_back("-D_DEBUG");
5369 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005370 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005371 break;
5372 default:
5373 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005374 }
5375
David Majnemere2afb472015-07-24 06:49:13 +00005376 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5377 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5378 } else {
5379 CmdArgs.push_back(FlagForCRT.data());
5380
5381 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5382 // users want. The /Za flag to cl.exe turns this off, but it's not
5383 // implemented in clang.
5384 CmdArgs.push_back("--dependent-lib=oldnames");
5385 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005386
Hans Wennborg8858a032014-07-21 23:42:07 +00005387 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5388 // would produce interleaved output, so ignore /showIncludes in such cases.
5389 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5390 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5391 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005392
David Majnemerf6072342014-07-01 22:24:56 +00005393 // This controls whether or not we emit RTTI data for polymorphic types.
5394 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5395 /*default=*/false))
5396 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005397
Reid Kleckner124955a2015-08-05 18:51:13 +00005398 // Emit CodeView if -Z7 is present.
5399 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5400 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5401 // If we are emitting CV but not DWARF, don't build information that LLVM
5402 // can't yet process.
5403 if (EmitCodeView && !EmitDwarf)
5404 CmdArgs.push_back("-gline-tables-only");
5405 if (EmitCodeView)
5406 CmdArgs.push_back("-gcodeview");
5407
Reid Klecknerc542d372014-06-27 17:02:02 +00005408 const Driver &D = getToolChain().getDriver();
5409 EHFlags EH = parseClangCLEHFlags(D, Args);
5410 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005411 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005412 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005413 CmdArgs.push_back("-fexceptions");
5414 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005415
Hans Wennborge50cec32014-06-13 20:59:54 +00005416 // /EP should expand to -E -P.
5417 if (Args.hasArg(options::OPT__SLASH_EP)) {
5418 CmdArgs.push_back("-E");
5419 CmdArgs.push_back("-P");
5420 }
5421
David Majnemera5b195a2015-02-14 01:35:12 +00005422 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005423 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5424 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005425 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5426 else
5427 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5428
5429 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5430 VolatileOptionID = A->getOption().getID();
5431
5432 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5433 CmdArgs.push_back("-fms-volatile");
5434
David Majnemer86c318f2014-02-11 21:05:00 +00005435 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5436 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5437 if (MostGeneralArg && BestCaseArg)
5438 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5439 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5440
5441 if (MostGeneralArg) {
5442 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5443 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5444 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5445
5446 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5447 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5448 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5449 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5450 << FirstConflict->getAsString(Args)
5451 << SecondConflict->getAsString(Args);
5452
5453 if (SingleArg)
5454 CmdArgs.push_back("-fms-memptr-rep=single");
5455 else if (MultipleArg)
5456 CmdArgs.push_back("-fms-memptr-rep=multiple");
5457 else
5458 CmdArgs.push_back("-fms-memptr-rep=virtual");
5459 }
5460
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005461 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5462 A->render(Args, CmdArgs);
5463
Hans Wennborg81f74482013-09-10 01:07:07 +00005464 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5465 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005466 if (Args.hasArg(options::OPT__SLASH_fallback))
5467 CmdArgs.push_back("msvc-fallback");
5468 else
5469 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005470 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005471}
5472
Douglas Katzman95354292015-06-23 20:42:09 +00005473visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005474 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005475 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005476 return CLFallback.get();
5477}
5478
Daniel Sanders7f933f42015-01-30 17:35:23 +00005479void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5480 ArgStringList &CmdArgs) const {
5481 StringRef CPUName;
5482 StringRef ABIName;
5483 const llvm::Triple &Triple = getToolChain().getTriple();
5484 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5485
5486 CmdArgs.push_back("-target-abi");
5487 CmdArgs.push_back(ABIName.data());
5488}
5489
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005490void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005491 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005492 const ArgList &Args,
5493 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005494 ArgStringList CmdArgs;
5495
5496 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5497 const InputInfo &Input = Inputs[0];
5498
James Y Knight2db38f32015-08-15 03:45:25 +00005499 std::string TripleStr =
5500 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5501 const llvm::Triple Triple(TripleStr);
5502
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005503 // Don't warn about "clang -w -c foo.s"
5504 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005505 // and "clang -emit-llvm -c foo.s"
5506 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005507
Rafael Espindola577637a2015-01-03 00:06:04 +00005508 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005509
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005510 // Invoke ourselves in -cc1as mode.
5511 //
5512 // FIXME: Implement custom jobs for internal actions.
5513 CmdArgs.push_back("-cc1as");
5514
5515 // Add the "effective" target triple.
5516 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005517 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5518
5519 // Set the output mode, we currently only expect to be used as a real
5520 // assembler.
5521 CmdArgs.push_back("-filetype");
5522 CmdArgs.push_back("obj");
5523
Eric Christopher45f2e712012-12-18 00:31:10 +00005524 // Set the main file name, so that debug info works even with
5525 // -save-temps or preprocessed assembly.
5526 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005527 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005528
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005529 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005530 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005531 if (!CPU.empty()) {
5532 CmdArgs.push_back("-target-cpu");
5533 CmdArgs.push_back(Args.MakeArgString(CPU));
5534 }
5535
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005536 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005537 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005538
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005539 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005540 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005541
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005542 // Pass along any -I options so we get proper .include search paths.
5543 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5544
Eric Christopherfc3ee562012-01-10 00:38:01 +00005545 // Determine the original source input.
5546 const Action *SourceAction = &JA;
5547 while (SourceAction->getKind() != Action::InputClass) {
5548 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5549 SourceAction = SourceAction->getInputs()[0];
5550 }
5551
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005552 // Forward -g and handle debug info related flags, assuming we are dealing
5553 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005554 if (SourceAction->getType() == types::TY_Asm ||
5555 SourceAction->getType() == types::TY_PP_Asm) {
5556 Args.ClaimAllArgs(options::OPT_g_Group);
5557 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5558 if (!A->getOption().matches(options::OPT_g0))
5559 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005560
Douglas Katzman553927a2015-09-14 20:31:28 +00005561 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5562 options::OPT_gdwarf_4))
5563 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005564
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005565 // Add the -fdebug-compilation-dir flag if needed.
5566 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005567
5568 // Set the AT_producer to the clang version when using the integrated
5569 // assembler on assembly source files.
5570 CmdArgs.push_back("-dwarf-debug-producer");
5571 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005572
5573 // And pass along -I options
5574 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005575 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005576
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005577 // Handle -fPIC et al -- the relocation-model affects the assembler
5578 // for some targets.
5579 llvm::Reloc::Model RelocationModel;
5580 unsigned PICLevel;
5581 bool IsPIE;
5582 std::tie(RelocationModel, PICLevel, IsPIE) =
5583 ParsePICArgs(getToolChain(), Triple, Args);
5584
5585 const char *RMName = RelocationModelName(RelocationModel);
5586 if (RMName) {
5587 CmdArgs.push_back("-mrelocation-model");
5588 CmdArgs.push_back(RMName);
5589 }
5590
Kevin Enderby292dc082011-12-22 19:31:58 +00005591 // Optionally embed the -cc1as level arguments into the debug info, for build
5592 // analysis.
5593 if (getToolChain().UseDwarfDebugFlags()) {
5594 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005595 for (const auto &Arg : Args)
5596 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005597
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005598 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005599 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5600 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005601 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005602 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005603 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005604 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005605 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005606 }
5607 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005608 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005609 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005610
5611 // FIXME: Add -static support, once we have it.
5612
Daniel Sanders7f933f42015-01-30 17:35:23 +00005613 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005614 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005615 default:
5616 break;
5617
5618 case llvm::Triple::mips:
5619 case llvm::Triple::mipsel:
5620 case llvm::Triple::mips64:
5621 case llvm::Triple::mips64el:
5622 AddMIPSTargetArgs(Args, CmdArgs);
5623 break;
5624 }
5625
David Blaikie372d9502014-01-17 03:17:40 +00005626 // Consume all the warning flags. Usually this would be handled more
5627 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5628 // doesn't handle that so rather than warning about unused flags that are
5629 // actually used, we'll lie by omission instead.
5630 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005631 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5632 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005633
David Blaikie9260ed62013-07-25 21:19:01 +00005634 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5635 getToolChain().getDriver());
5636
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005637 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005638
5639 assert(Output.isFilename() && "Unexpected lipo output.");
5640 CmdArgs.push_back("-o");
5641 CmdArgs.push_back(Output.getFilename());
5642
Daniel Dunbarb440f562010-08-02 02:38:21 +00005643 assert(Input.isFilename() && "Invalid input.");
5644 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005645
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005646 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005648
5649 // Handle the debug info splitting at object creation time if we're
5650 // creating an object.
5651 // TODO: Currently only works on linux with newer objcopy.
5652 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005653 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005655 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005656}
5657
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005658void GnuTool::anchor() {}
5659
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005661 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005662 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005663 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005664 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005665 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005667 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005668 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005669 // Don't forward any -g arguments to assembly steps.
5670 if (isa<AssembleJobAction>(JA) &&
5671 A->getOption().matches(options::OPT_g_Group))
5672 continue;
5673
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005674 // Don't forward any -W arguments to assembly and link steps.
5675 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5676 A->getOption().matches(options::OPT_W_Group))
5677 continue;
5678
Daniel Dunbar2da02722009-03-19 07:55:12 +00005679 // It is unfortunate that we have to claim here, as this means
5680 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005681 // platforms using a generic gcc, even if we are just using gcc
5682 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005683 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005684 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005685 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005686 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005687
Daniel Dunbar4e295052010-01-25 22:35:08 +00005688 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005689
5690 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005691 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005692 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005693 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005694 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005695 }
5696
Daniel Dunbar5716d872009-05-02 21:41:52 +00005697 // Try to force gcc to match the tool chain we want, if we recognize
5698 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005699 //
5700 // FIXME: The triple class should directly provide the information we want
5701 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005702 switch (getToolChain().getArch()) {
5703 default:
5704 break;
5705 case llvm::Triple::x86:
5706 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005707 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005708 break;
5709 case llvm::Triple::x86_64:
5710 case llvm::Triple::ppc64:
5711 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005712 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005713 break;
5714 case llvm::Triple::sparcel:
5715 CmdArgs.push_back("-EL");
5716 break;
5717 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005718
Daniel Dunbarb440f562010-08-02 02:38:21 +00005719 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005720 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005721 CmdArgs.push_back(Output.getFilename());
5722 } else {
5723 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005724 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005725 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005728
5729 // Only pass -x if gcc will understand it; otherwise hope gcc
5730 // understands the suffix correctly. The main use case this would go
5731 // wrong in is for linker inputs if they happened to have an odd
5732 // suffix; really the only way to get this to happen is a command
5733 // like '-x foobar a.c' which will treat a.c like a linker input.
5734 //
5735 // FIXME: For the linker case specifically, can we safely convert
5736 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005737 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005738 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005739 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5740 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005741 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005743 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005744 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005745 else if (II.getType() == types::TY_ModuleFile)
5746 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005747 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005748
Daniel Dunbara3246a02009-03-18 08:07:30 +00005749 if (types::canTypeBeUserSpecified(II.getType())) {
5750 CmdArgs.push_back("-x");
5751 CmdArgs.push_back(types::getTypeName(II.getType()));
5752 }
5753
Daniel Dunbarb440f562010-08-02 02:38:21 +00005754 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005755 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005756 else {
5757 const Arg &A = II.getInputArg();
5758
5759 // Reverse translate some rewritten options.
5760 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5761 CmdArgs.push_back("-lstdc++");
5762 continue;
5763 }
5764
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005765 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005766 A.render(Args, CmdArgs);
5767 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005768 }
5769
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005770 const std::string customGCCName = D.getCCCGenericGCCName();
5771 const char *GCCName;
5772 if (!customGCCName.empty())
5773 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005774 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005775 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005776 } else
5777 GCCName = "gcc";
5778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005779 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005780 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005781}
5782
Douglas Katzman95354292015-06-23 20:42:09 +00005783void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5784 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005785 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005786}
5787
Douglas Katzman95354292015-06-23 20:42:09 +00005788void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5789 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005790 const Driver &D = getToolChain().getDriver();
5791
Eric Christophercc7ff502015-01-29 00:56:17 +00005792 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005793 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005794 case types::TY_LLVM_IR:
5795 case types::TY_LTO_IR:
5796 case types::TY_LLVM_BC:
5797 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005798 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005799 break;
5800 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005801 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005802 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005803 case types::TY_Nothing:
5804 CmdArgs.push_back("-fsyntax-only");
5805 break;
5806 default:
5807 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005808 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005809}
5810
Douglas Katzman95354292015-06-23 20:42:09 +00005811void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5812 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005813 // The types are (hopefully) good enough.
5814}
5815
Tony Linthicum76329bf2011-12-12 21:14:55 +00005816// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005817void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5818 ArgStringList &CmdArgs) const {}
5819void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5820 const InputInfo &Output,
5821 const InputInfoList &Inputs,
5822 const ArgList &Args,
5823 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005824 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005825
5826 const Driver &D = getToolChain().getDriver();
5827 ArgStringList CmdArgs;
5828
5829 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005830 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005831 CmdArgs.push_back(Args.MakeArgString(MarchString));
5832
5833 RenderExtraToolArgs(JA, CmdArgs);
5834
5835 if (Output.isFilename()) {
5836 CmdArgs.push_back("-o");
5837 CmdArgs.push_back(Output.getFilename());
5838 } else {
5839 assert(Output.isNothing() && "Unexpected output");
5840 CmdArgs.push_back("-fsyntax-only");
5841 }
5842
Douglas Katzman54366072015-07-27 16:53:08 +00005843 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005844 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005845
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005847
Tony Linthicum76329bf2011-12-12 21:14:55 +00005848 // Only pass -x if gcc will understand it; otherwise hope gcc
5849 // understands the suffix correctly. The main use case this would go
5850 // wrong in is for linker inputs if they happened to have an odd
5851 // suffix; really the only way to get this to happen is a command
5852 // like '-x foobar a.c' which will treat a.c like a linker input.
5853 //
5854 // FIXME: For the linker case specifically, can we safely convert
5855 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005856 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005857 // Don't try to pass LLVM or AST inputs to a generic gcc.
5858 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5859 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5860 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005862 else if (II.getType() == types::TY_AST)
5863 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005865 else if (II.getType() == types::TY_ModuleFile)
5866 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005867 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005868
5869 if (II.isFilename())
5870 CmdArgs.push_back(II.getFilename());
5871 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 // Don't render as input, we need gcc to do the translations.
5873 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005874 II.getInputArg().render(Args, CmdArgs);
5875 }
5876
5877 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +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));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005880}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005881
Douglas Katzman95354292015-06-23 20:42:09 +00005882void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5883 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005884 // The types are (hopefully) good enough.
5885}
5886
Douglas Katzman54366072015-07-27 16:53:08 +00005887static void
5888constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5889 const toolchains::HexagonToolChain &ToolChain,
5890 const InputInfo &Output, const InputInfoList &Inputs,
5891 const ArgList &Args, ArgStringList &CmdArgs,
5892 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005893
Matthew Curtise689b052012-12-06 15:46:07 +00005894 const Driver &D = ToolChain.getDriver();
5895
Matthew Curtise689b052012-12-06 15:46:07 +00005896 //----------------------------------------------------------------------------
5897 //
5898 //----------------------------------------------------------------------------
5899 bool hasStaticArg = Args.hasArg(options::OPT_static);
5900 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005901 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005902 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5903 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5904 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005905 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005906 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005907
Matthew Curtise689b052012-12-06 15:46:07 +00005908 //----------------------------------------------------------------------------
5909 // Silence warnings for various options
5910 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005911
Matthew Curtise689b052012-12-06 15:46:07 +00005912 Args.ClaimAllArgs(options::OPT_g_Group);
5913 Args.ClaimAllArgs(options::OPT_emit_llvm);
5914 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5915 // handled somewhere else.
5916 Args.ClaimAllArgs(options::OPT_static_libgcc);
5917
5918 //----------------------------------------------------------------------------
5919 //
5920 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005921 for (const auto &Opt : ToolChain.ExtraOpts)
5922 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005923
Douglas Katzman54366072015-07-27 16:53:08 +00005924 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005925 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005926
Matthew Curtise689b052012-12-06 15:46:07 +00005927 if (buildingLib) {
5928 CmdArgs.push_back("-shared");
5929 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5930 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005931 }
5932
Matthew Curtise689b052012-12-06 15:46:07 +00005933 if (hasStaticArg)
5934 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005935
Matthew Curtise8f80a12012-12-06 17:49:03 +00005936 if (buildPIE && !buildingLib)
5937 CmdArgs.push_back("-pie");
5938
Douglas Katzman54366072015-07-27 16:53:08 +00005939 if (const char *v =
5940 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005941 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005942 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005943 }
5944
Matthew Curtise689b052012-12-06 15:46:07 +00005945 //----------------------------------------------------------------------------
5946 //
5947 //----------------------------------------------------------------------------
5948 CmdArgs.push_back("-o");
5949 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005950
Matthew Curtise689b052012-12-06 15:46:07 +00005951 const std::string MarchSuffix = "/" + MarchString;
5952 const std::string G0Suffix = "/G0";
5953 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005954 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005955 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005956 const std::string StartFilesDir =
5957 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005958
5959 //----------------------------------------------------------------------------
5960 // moslib
5961 //----------------------------------------------------------------------------
5962 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005964
Sean Silva14facf32015-06-09 01:57:17 +00005965 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5966 A->claim();
5967 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005968 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005969 }
Matthew Curtise689b052012-12-06 15:46:07 +00005970 if (oslibs.empty()) {
5971 oslibs.push_back("standalone");
5972 hasStandalone = true;
5973 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005974
Matthew Curtise689b052012-12-06 15:46:07 +00005975 //----------------------------------------------------------------------------
5976 // Start Files
5977 //----------------------------------------------------------------------------
5978 if (incStdLib && incStartFiles) {
5979
5980 if (!buildingLib) {
5981 if (hasStandalone) {
5982 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005983 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005984 }
5985 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5986 }
5987 std::string initObj = useShared ? "/initS.o" : "/init.o";
5988 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5989 }
5990
5991 //----------------------------------------------------------------------------
5992 // Library Search Paths
5993 //----------------------------------------------------------------------------
5994 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005995 for (const auto &LibPath : LibPaths)
5996 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005997
5998 //----------------------------------------------------------------------------
5999 //
6000 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006001 Args.AddAllArgs(CmdArgs,
6002 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6003 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006004
6005 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6006
6007 //----------------------------------------------------------------------------
6008 // Libraries
6009 //----------------------------------------------------------------------------
6010 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006011 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006012 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6013 CmdArgs.push_back("-lm");
6014 }
6015
6016 CmdArgs.push_back("--start-group");
6017
6018 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006019 for (const std::string &Lib : oslibs)
6020 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006021 CmdArgs.push_back("-lc");
6022 }
6023 CmdArgs.push_back("-lgcc");
6024
6025 CmdArgs.push_back("--end-group");
6026 }
6027
6028 //----------------------------------------------------------------------------
6029 // End files
6030 //----------------------------------------------------------------------------
6031 if (incStdLib && incStartFiles) {
6032 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6033 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6034 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006035}
6036
Douglas Katzman95354292015-06-23 20:42:09 +00006037void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6038 const InputInfo &Output,
6039 const InputInfoList &Inputs,
6040 const ArgList &Args,
6041 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006042
Douglas Katzman54366072015-07-27 16:53:08 +00006043 const toolchains::HexagonToolChain &ToolChain =
6044 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006045
6046 ArgStringList CmdArgs;
6047 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6048 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006049
6050 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006051 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006052 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006053}
6054// Hexagon tools end.
6055
Tom Stellard8fa33092015-07-18 01:49:05 +00006056void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6057 const InputInfo &Output,
6058 const InputInfoList &Inputs,
6059 const ArgList &Args,
6060 const char *LinkingOutput) const {
6061
6062 std::string Linker = getToolChain().GetProgramPath(getShortName());
6063 ArgStringList CmdArgs;
6064 CmdArgs.push_back("-flavor");
6065 CmdArgs.push_back("gnu");
6066 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006067 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006068 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6069 CmdArgs.push_back("-o");
6070 CmdArgs.push_back(Output.getFilename());
6071 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6072 CmdArgs, Inputs));
6073}
6074// AMDGPU tools end.
6075
Renato Golin7c542b42015-07-27 23:44:45 +00006076const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006077 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006078 if (!Arch.empty())
6079 MArch = Arch;
6080 else
Bernard Ogden31561762013-12-12 13:27:11 +00006081 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006082 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006083
6084 // Handle -march=native.
6085 if (MArch == "native") {
6086 std::string CPU = llvm::sys::getHostCPUName();
6087 if (CPU != "generic") {
6088 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006089 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006090 // If there is no valid architecture suffix for this CPU we don't know how
6091 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006092 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006093 MArch = "";
6094 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006095 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006096 }
6097 }
6098
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006099 return MArch;
6100}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006101
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006102/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006103StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006104 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006105 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6106 // here means an -march=native that we can't handle, so instead return no CPU.
6107 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006108 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006109
John Brawna95c1a82015-05-08 12:52:18 +00006110 // We need to return an empty string here on invalid MArch values as the
6111 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006112 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006113}
6114
6115/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006116std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006117 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006118 // FIXME: Warn on inconsistent use of -mcpu and -march.
6119 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006120 if (!CPU.empty()) {
6121 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006122 // Handle -mcpu=native.
6123 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006124 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006125 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006126 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006127 }
6128
Renato Goline17c5802015-07-27 23:44:42 +00006129 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006130}
6131
6132/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006133/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006134// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006135StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6136 const llvm::Triple &Triple) {
6137 unsigned ArchKind;
6138 Arch = tools::arm::getARMArch(Arch, Triple);
6139 if (CPU == "generic") {
6140 ArchKind = llvm::ARM::parseArch(Arch);
6141 if (ArchKind == llvm::ARM::AK_INVALID)
6142 // In case of generic Arch, i.e. "arm",
6143 // extract arch from default cpu of the Triple
6144 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(Arch));
6145 } else {
6146 ArchKind = llvm::ARM::parseCPUArch(CPU);
6147 }
Renato Golin3c007252015-05-28 15:05:53 +00006148 if (ArchKind == llvm::ARM::AK_INVALID)
6149 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006150 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006151}
6152
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006153void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006154 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006155 if (Args.hasArg(options::OPT_r))
6156 return;
6157
John Brawn94fd9632015-05-21 12:19:49 +00006158 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6159 // to generate BE-8 executables.
6160 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6161 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006162}
6163
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006164mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6165 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6166 .Case("mips1", NanLegacy)
6167 .Case("mips2", NanLegacy)
6168 .Case("mips3", NanLegacy)
6169 .Case("mips4", NanLegacy)
6170 .Case("mips5", NanLegacy)
6171 .Case("mips32", NanLegacy)
6172 .Case("mips32r2", NanLegacy)
6173 .Case("mips32r3", NanLegacy | Nan2008)
6174 .Case("mips32r5", NanLegacy | Nan2008)
6175 .Case("mips32r6", Nan2008)
6176 .Case("mips64", NanLegacy)
6177 .Case("mips64r2", NanLegacy)
6178 .Case("mips64r3", NanLegacy | Nan2008)
6179 .Case("mips64r5", NanLegacy | Nan2008)
6180 .Case("mips64r6", Nan2008)
6181 .Default(NanLegacy);
6182}
6183
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006184bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6185 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6186 return A && (A->getValue() == StringRef(Value));
6187}
6188
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006189bool mips::isUCLibc(const ArgList &Args) {
6190 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006191 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006192}
6193
Daniel Sanders2bf13662014-07-10 14:40:57 +00006194bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006195 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6196 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006197 .Case("2008", true)
6198 .Case("legacy", false)
6199 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006200
6201 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006202 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006203 .Cases("mips32r6", "mips64r6", true)
6204 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006205
6206 return false;
6207}
6208
Daniel Sanders379d44b2014-07-16 11:52:23 +00006209bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006210 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006211 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006212 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006213 return false;
6214
6215 if (ABIName != "32")
6216 return false;
6217
Toma Tabacu94ea6862015-06-16 13:54:13 +00006218 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6219 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006220 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006221 return false;
6222
Daniel Sanders379d44b2014-07-16 11:52:23 +00006223 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006224 .Cases("mips2", "mips3", "mips4", "mips5", true)
6225 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6226 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6227 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006228}
6229
Toma Tabacu94ea6862015-06-16 13:54:13 +00006230bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6231 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006232 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006233 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6234
6235 // FPXX shouldn't be used if -msingle-float is present.
6236 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6237 options::OPT_mdouble_float))
6238 if (A->getOption().matches(options::OPT_msingle_float))
6239 UseFPXX = false;
6240
6241 return UseFPXX;
6242}
6243
Tim Northover157d9112014-01-16 08:48:16 +00006244llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006245 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6246 // archs which Darwin doesn't use.
6247
6248 // The matching this routine does is fairly pointless, since it is neither the
6249 // complete architecture list, nor a reasonable subset. The problem is that
6250 // historically the driver driver accepts this and also ties its -march=
6251 // handling to the architecture name, so we need to be careful before removing
6252 // support for it.
6253
6254 // This code must be kept in sync with Clang's Darwin specific argument
6255 // translation.
6256
6257 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006258 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6259 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6260 .Case("ppc64", llvm::Triple::ppc64)
6261 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6262 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6263 llvm::Triple::x86)
6264 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6265 // This is derived from the driver driver.
6266 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6267 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6268 .Cases("armv7s", "xscale", llvm::Triple::arm)
6269 .Case("arm64", llvm::Triple::aarch64)
6270 .Case("r600", llvm::Triple::r600)
6271 .Case("amdgcn", llvm::Triple::amdgcn)
6272 .Case("nvptx", llvm::Triple::nvptx)
6273 .Case("nvptx64", llvm::Triple::nvptx64)
6274 .Case("amdil", llvm::Triple::amdil)
6275 .Case("spir", llvm::Triple::spir)
6276 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006277}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006278
Tim Northover157d9112014-01-16 08:48:16 +00006279void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006280 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006281 T.setArch(Arch);
6282
6283 if (Str == "x86_64h")
6284 T.setArchName(Str);
6285 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6286 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006287 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006288 }
6289}
6290
Bob Wilsondecc03e2012-11-23 06:14:39 +00006291const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006292 const InputInfo &Input) {
6293 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006294}
6295
Bob Wilsondecc03e2012-11-23 06:14:39 +00006296const char *Clang::getBaseInputStem(const ArgList &Args,
6297 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006298 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006299
Chris Lattner906bb902011-01-16 08:14:11 +00006300 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006301 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006302
6303 return Str;
6304}
6305
Bob Wilsondecc03e2012-11-23 06:14:39 +00006306const char *Clang::getDependencyFileName(const ArgList &Args,
6307 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006308 // FIXME: Think about this more.
6309 std::string Res;
6310
6311 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006312 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006313 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006314 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006315 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006316 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006317 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006318}
6319
Douglas Katzman95354292015-06-23 20:42:09 +00006320void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6321 const InputInfo &Output,
6322 const InputInfoList &Inputs,
6323 const ArgList &Args,
6324 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006325 const ToolChain &ToolChain = getToolChain();
6326 const Driver &D = ToolChain.getDriver();
6327 ArgStringList CmdArgs;
6328
6329 // Silence warning for "clang -g foo.o -o foo"
6330 Args.ClaimAllArgs(options::OPT_g_Group);
6331 // and "clang -emit-llvm foo.o -o foo"
6332 Args.ClaimAllArgs(options::OPT_emit_llvm);
6333 // and for "clang -w foo.o -o foo". Other warning options are already
6334 // handled somewhere else.
6335 Args.ClaimAllArgs(options::OPT_w);
6336
6337 if (!D.SysRoot.empty())
6338 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6339
6340 // CloudABI only supports static linkage.
6341 CmdArgs.push_back("-Bstatic");
6342 CmdArgs.push_back("--eh-frame-hdr");
6343 CmdArgs.push_back("--gc-sections");
6344
6345 if (Output.isFilename()) {
6346 CmdArgs.push_back("-o");
6347 CmdArgs.push_back(Output.getFilename());
6348 } else {
6349 assert(Output.isNothing() && "Invalid output.");
6350 }
6351
6352 if (!Args.hasArg(options::OPT_nostdlib) &&
6353 !Args.hasArg(options::OPT_nostartfiles)) {
6354 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6355 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6356 }
6357
6358 Args.AddAllArgs(CmdArgs, options::OPT_L);
6359 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6360 for (const auto &Path : Paths)
6361 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006362 Args.AddAllArgs(CmdArgs,
6363 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6364 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006365
Alexey Samsonov907880e2015-06-19 19:57:46 +00006366 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006367 AddGoldPlugin(ToolChain, Args, CmdArgs);
6368
6369 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6370
6371 if (!Args.hasArg(options::OPT_nostdlib) &&
6372 !Args.hasArg(options::OPT_nodefaultlibs)) {
6373 if (D.CCCIsCXX())
6374 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6375 CmdArgs.push_back("-lc");
6376 CmdArgs.push_back("-lcompiler_rt");
6377 }
6378
6379 if (!Args.hasArg(options::OPT_nostdlib) &&
6380 !Args.hasArg(options::OPT_nostartfiles))
6381 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6382
6383 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006384 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006385}
6386
Douglas Katzman95354292015-06-23 20:42:09 +00006387void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6388 const InputInfo &Output,
6389 const InputInfoList &Inputs,
6390 const ArgList &Args,
6391 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006392 ArgStringList CmdArgs;
6393
6394 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6395 const InputInfo &Input = Inputs[0];
6396
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006397 // Determine the original source input.
6398 const Action *SourceAction = &JA;
6399 while (SourceAction->getKind() != Action::InputClass) {
6400 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6401 SourceAction = SourceAction->getInputs()[0];
6402 }
6403
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006404 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006405 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006406 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6407 // FIXME: at run-time detect assembler capabilities or rely on version
6408 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006409 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006410 const llvm::Triple &T(getToolChain().getTriple());
6411 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006412 CmdArgs.push_back("-Q");
6413 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006414
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006415 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006416 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006417 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006418 if (Args.hasArg(options::OPT_gstabs))
6419 CmdArgs.push_back("--gstabs");
6420 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006421 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006422 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006423
Daniel Dunbarbe220842009-03-20 16:06:39 +00006424 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006425 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006426
Daniel Dunbar6d484762010-07-22 01:47:22 +00006427 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006428 if (getToolChain().getArch() == llvm::Triple::x86 ||
6429 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006430 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6431 CmdArgs.push_back("-force_cpusubtype_ALL");
6432
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006433 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006434 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006435 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006436 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006437 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006438 CmdArgs.push_back("-static");
6439
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006440 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006441
6442 assert(Output.isFilename() && "Unexpected lipo output.");
6443 CmdArgs.push_back("-o");
6444 CmdArgs.push_back(Output.getFilename());
6445
Daniel Dunbarb440f562010-08-02 02:38:21 +00006446 assert(Input.isFilename() && "Invalid input.");
6447 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006448
6449 // asm_final spec is empty.
6450
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006451 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006452 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006453}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006454
Tim Northover157d9112014-01-16 08:48:16 +00006455void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006456
Tim Northover157d9112014-01-16 08:48:16 +00006457void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6458 ArgStringList &CmdArgs) const {
6459 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006460
Daniel Dunbarc1964212009-03-26 16:23:12 +00006461 // Derived from darwin_arch spec.
6462 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006463 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006464
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006465 // FIXME: Is this needed anymore?
6466 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006467 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006468}
6469
Douglas Katzman95354292015-06-23 20:42:09 +00006470bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006471 // We only need to generate a temp path for LTO if we aren't compiling object
6472 // files. When compiling source files, we run 'dsymutil' after linking. We
6473 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006474 for (const auto &Input : Inputs)
6475 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006476 return true;
6477
6478 return false;
6479}
6480
Douglas Katzman95354292015-06-23 20:42:09 +00006481void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6482 ArgStringList &CmdArgs,
6483 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006484 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006485 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006486
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006487 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006488 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6489 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006490 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6491 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006492 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006493 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006494 }
6495
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006496 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006497 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006498 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6499 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006500
Bob Wilson3d27dad2013-08-02 22:25:34 +00006501 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6502 CmdArgs.push_back("-export_dynamic");
6503
Bob Wilsonb111ec92015-03-02 19:01:14 +00006504 // If we are using App Extension restrictions, pass a flag to the linker
6505 // telling it that the compiled code has been audited.
6506 if (Args.hasFlag(options::OPT_fapplication_extension,
6507 options::OPT_fno_application_extension, false))
6508 CmdArgs.push_back("-application_extension");
6509
Bill Wendling313b6bf2012-11-16 23:03:00 +00006510 // If we are using LTO, then automatically create a temporary file path for
6511 // the linker to use, so that it's lifetime will extend past a possible
6512 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006513 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006514 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006515 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006516 C.addTempFile(TmpPath);
6517 CmdArgs.push_back("-object_path_lto");
6518 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006519 }
6520
Daniel Dunbarc1964212009-03-26 16:23:12 +00006521 // Derived from the "link" spec.
6522 Args.AddAllArgs(CmdArgs, options::OPT_static);
6523 if (!Args.hasArg(options::OPT_static))
6524 CmdArgs.push_back("-dynamic");
6525 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6526 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6527 // here. How do we wish to handle such things?
6528 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006529
Daniel Dunbarc1964212009-03-26 16:23:12 +00006530 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006531 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006532 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006533 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006534
6535 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6536 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6537 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6538
6539 Arg *A;
6540 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6541 (A = Args.getLastArg(options::OPT_current__version)) ||
6542 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006543 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6544 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006545
6546 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6547 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6548 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6549 } else {
6550 CmdArgs.push_back("-dylib");
6551
6552 Arg *A;
6553 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6554 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6555 (A = Args.getLastArg(options::OPT_client__name)) ||
6556 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6557 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6558 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006559 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6560 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006561
Daniel Dunbarc1964212009-03-26 16:23:12 +00006562 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6563 "-dylib_compatibility_version");
6564 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6565 "-dylib_current_version");
6566
Tim Northover157d9112014-01-16 08:48:16 +00006567 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006568
6569 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6570 "-dylib_install_name");
6571 }
6572
6573 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6574 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6575 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006576 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006577 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006578 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6579 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6580 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6581 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6582 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6583 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006584 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006585 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6586 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6587 Args.AddAllArgs(CmdArgs, options::OPT_init);
6588
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006589 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006590 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006591
Daniel Dunbarc1964212009-03-26 16:23:12 +00006592 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6593 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6594 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6595 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6596 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006597
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006598 if (const Arg *A =
6599 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6600 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006601 if (A->getOption().matches(options::OPT_fpie) ||
6602 A->getOption().matches(options::OPT_fPIE))
6603 CmdArgs.push_back("-pie");
6604 else
6605 CmdArgs.push_back("-no_pie");
6606 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006607
6608 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6609 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6610 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6611 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6612 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6613 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6614 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6615 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6616 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6617 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6618 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6619 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6620 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6621 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6622 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6623 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006624
Daniel Dunbar84384642011-05-02 21:03:47 +00006625 // Give --sysroot= preference, over the Apple specific behavior to also use
6626 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006627 StringRef sysroot = C.getSysRoot();
6628 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006629 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006630 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006631 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6632 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006633 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006634 }
6635
Daniel Dunbarc1964212009-03-26 16:23:12 +00006636 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6637 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6638 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6639 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6640 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006641 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006642 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6643 Args.AddAllArgs(CmdArgs, options::OPT_y);
6644 Args.AddLastArg(CmdArgs, options::OPT_w);
6645 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6646 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6647 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6648 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6649 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6650 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6651 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6652 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6653 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6654 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6655 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6656 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6657}
6658
Douglas Katzman95354292015-06-23 20:42:09 +00006659void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6660 const InputInfo &Output,
6661 const InputInfoList &Inputs,
6662 const ArgList &Args,
6663 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006664 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006665
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006666 // If the number of arguments surpasses the system limits, we will encode the
6667 // input files in a separate file, shortening the command line. To this end,
6668 // build a list of input file names that can be passed via a file with the
6669 // -filelist linker option.
6670 llvm::opt::ArgStringList InputFileList;
6671
Daniel Dunbarc1964212009-03-26 16:23:12 +00006672 // The logic here is derived from gcc's behavior; most of which
6673 // comes from specs (starting with link_command). Consult gcc for
6674 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006675 ArgStringList CmdArgs;
6676
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006677 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6678 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6679 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006680 for (const auto &Arg : Args)
6681 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006682 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006683 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006684 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006685 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006686 return;
6687 }
6688
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689 // I'm not sure why this particular decomposition exists in gcc, but
6690 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006691 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006692
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006693 // It seems that the 'e' option is completely ignored for dynamic executables
6694 // (the default), and with static executables, the last one wins, as expected.
6695 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6696 options::OPT_Z_Flag, options::OPT_u_Group,
6697 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006698
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006699 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6700 // members of static archive libraries which implement Objective-C classes or
6701 // categories.
6702 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6703 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006704
Daniel Dunbarc1964212009-03-26 16:23:12 +00006705 CmdArgs.push_back("-o");
6706 CmdArgs.push_back(Output.getFilename());
6707
Chad Rosier06fd3c62012-05-16 23:45:12 +00006708 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006709 !Args.hasArg(options::OPT_nostartfiles))
6710 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006711
Peter Collingbournec4122c12015-06-15 21:08:13 +00006712 // SafeStack requires its own runtime libraries
6713 // These libraries should be linked first, to make sure the
6714 // __safestack_init constructor executes before everything else
6715 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6716 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6717 "libclang_rt.safestack_osx.a",
6718 /*AlwaysLink=*/true);
6719 }
6720
Daniel Dunbarc1964212009-03-26 16:23:12 +00006721 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006722
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006723 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6724 options::OPT_fno_openmp, false)) {
6725 switch (getOpenMPRuntime(getToolChain(), Args)) {
6726 case OMPRT_OMP:
6727 CmdArgs.push_back("-lomp");
6728 break;
6729 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006730 CmdArgs.push_back("-lgomp");
6731 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006732 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006733 CmdArgs.push_back("-liomp5");
6734 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006735 case OMPRT_Unknown:
6736 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006737 break;
6738 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006739 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006740
Douglas Gregor9295df02012-05-15 21:00:27 +00006741 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006742 // Build the input file for -filelist (list of linker input files) in case we
6743 // need it later
6744 for (const auto &II : Inputs) {
6745 if (!II.isFilename()) {
6746 // This is a linker input argument.
6747 // We cannot mix input arguments and file names in a -filelist input, thus
6748 // we prematurely stop our list (remaining files shall be passed as
6749 // arguments).
6750 if (InputFileList.size() > 0)
6751 break;
6752
6753 continue;
6754 }
6755
6756 InputFileList.push_back(II.getFilename());
6757 }
6758
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006759 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006760 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006761 // We use arclite library for both ARC and subscripting support.
6762 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6763
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006764 CmdArgs.push_back("-framework");
6765 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006766 // Link libobj.
6767 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006768 }
John McCall31168b02011-06-15 23:02:42 +00006769
Daniel Dunbarc1964212009-03-26 16:23:12 +00006770 if (LinkingOutput) {
6771 CmdArgs.push_back("-arch_multiple");
6772 CmdArgs.push_back("-final_output");
6773 CmdArgs.push_back(LinkingOutput);
6774 }
6775
Daniel Dunbarc1964212009-03-26 16:23:12 +00006776 if (Args.hasArg(options::OPT_fnested_functions))
6777 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006778
Justin Bognerc7701242015-05-12 05:44:36 +00006779 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6780 // paths are different enough from other toolchains that this needs a fair
6781 // amount of refactoring done first.
6782 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6783
Daniel Dunbarc1964212009-03-26 16:23:12 +00006784 if (!Args.hasArg(options::OPT_nostdlib) &&
6785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006786 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006787 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006788
Daniel Dunbarc1964212009-03-26 16:23:12 +00006789 // link_ssp spec is empty.
6790
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006791 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006792 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006793 }
6794
Chad Rosier06fd3c62012-05-16 23:45:12 +00006795 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006796 !Args.hasArg(options::OPT_nostartfiles)) {
6797 // endfile_spec is empty.
6798 }
6799
6800 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6801 Args.AddAllArgs(CmdArgs, options::OPT_F);
6802
Steven Wu3ffb61b2015-02-06 18:08:29 +00006803 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006804 for (const Arg *A : Args.filtered(options::OPT_iframework))
6805 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006806
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006807 if (!Args.hasArg(options::OPT_nostdlib) &&
6808 !Args.hasArg(options::OPT_nodefaultlibs)) {
6809 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6810 if (A->getValue() == StringRef("Accelerate")) {
6811 CmdArgs.push_back("-framework");
6812 CmdArgs.push_back("Accelerate");
6813 }
6814 }
6815 }
6816
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006817 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006818 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006819 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006820 Cmd->setInputFileList(std::move(InputFileList));
6821 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006822}
6823
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006824void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006825 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006826 const InputInfoList &Inputs,
6827 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006828 const char *LinkingOutput) const {
6829 ArgStringList CmdArgs;
6830
6831 CmdArgs.push_back("-create");
6832 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006833
6834 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006835 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006836
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006837 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006838 assert(II.isFilename() && "Unexpected lipo input.");
6839 CmdArgs.push_back(II.getFilename());
6840 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006841
6842 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006843 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006844}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006845
Daniel Dunbar88299622010-06-04 18:28:36 +00006846void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006847 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006848 const InputInfoList &Inputs,
6849 const ArgList &Args,
6850 const char *LinkingOutput) const {
6851 ArgStringList CmdArgs;
6852
Daniel Dunbareb86b042011-05-09 17:23:16 +00006853 CmdArgs.push_back("-o");
6854 CmdArgs.push_back(Output.getFilename());
6855
Daniel Dunbar88299622010-06-04 18:28:36 +00006856 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6857 const InputInfo &Input = Inputs[0];
6858 assert(Input.isFilename() && "Unexpected dsymutil input.");
6859 CmdArgs.push_back(Input.getFilename());
6860
Daniel Dunbar88299622010-06-04 18:28:36 +00006861 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006862 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006863 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006864}
6865
Eric Christopher551ef452011-08-23 17:56:55 +00006866void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006867 const InputInfo &Output,
6868 const InputInfoList &Inputs,
6869 const ArgList &Args,
6870 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006871 ArgStringList CmdArgs;
6872 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006873 CmdArgs.push_back("--debug-info");
6874 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006875 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006876
6877 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6878 const InputInfo &Input = Inputs[0];
6879 assert(Input.isFilename() && "Unexpected verify input");
6880
6881 // Grabbing the output of the earlier dsymutil run.
6882 CmdArgs.push_back(Input.getFilename());
6883
6884 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006885 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006887}
6888
Douglas Katzman95354292015-06-23 20:42:09 +00006889void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006890 const InputInfo &Output,
6891 const InputInfoList &Inputs,
6892 const ArgList &Args,
6893 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006894 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006895 ArgStringList CmdArgs;
6896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006897 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006898
6899 CmdArgs.push_back("-o");
6900 CmdArgs.push_back(Output.getFilename());
6901
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006902 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006903 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006904
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006905 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006907}
6908
Douglas Katzman95354292015-06-23 20:42:09 +00006909void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6910 const InputInfo &Output,
6911 const InputInfoList &Inputs,
6912 const ArgList &Args,
6913 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006914 ArgStringList CmdArgs;
6915
David Chisnall272a0712012-02-29 15:06:12 +00006916 // Demangle C++ names in errors
6917 CmdArgs.push_back("-C");
6918
David Chisnallf571cde2012-02-15 13:39:01 +00006919 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6920 (!Args.hasArg(options::OPT_shared))) {
6921 CmdArgs.push_back("-e");
6922 CmdArgs.push_back("_start");
6923 }
6924
6925 if (Args.hasArg(options::OPT_static)) {
6926 CmdArgs.push_back("-Bstatic");
6927 CmdArgs.push_back("-dn");
6928 } else {
6929 CmdArgs.push_back("-Bdynamic");
6930 if (Args.hasArg(options::OPT_shared)) {
6931 CmdArgs.push_back("-shared");
6932 } else {
6933 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006934 CmdArgs.push_back(
6935 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006936 }
6937 }
6938
6939 if (Output.isFilename()) {
6940 CmdArgs.push_back("-o");
6941 CmdArgs.push_back(Output.getFilename());
6942 } else {
6943 assert(Output.isNothing() && "Invalid output.");
6944 }
6945
6946 if (!Args.hasArg(options::OPT_nostdlib) &&
6947 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006948 if (!Args.hasArg(options::OPT_shared))
6949 CmdArgs.push_back(
6950 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6951
6952 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6953 CmdArgs.push_back(
6954 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6955 CmdArgs.push_back(
6956 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006957 }
6958
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006959 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6960 for (const auto &Path : Paths)
6961 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006962
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006963 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6964 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006965
6966 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6967
6968 if (!Args.hasArg(options::OPT_nostdlib) &&
6969 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006970 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006971 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006972 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006973 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006974 if (!Args.hasArg(options::OPT_shared)) {
6975 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006976 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006977 }
David Chisnallf571cde2012-02-15 13:39:01 +00006978 }
6979
6980 if (!Args.hasArg(options::OPT_nostdlib) &&
6981 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006982 CmdArgs.push_back(
6983 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006984 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006985 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006986
Alexey Samsonov7811d192014-02-20 13:57:37 +00006987 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006989 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006990 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006991}
6992
Douglas Katzman95354292015-06-23 20:42:09 +00006993void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6994 const InputInfo &Output,
6995 const InputInfoList &Inputs,
6996 const ArgList &Args,
6997 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006998 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006999 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00007000 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007001
Rafael Espindolacc126272014-02-28 01:55:21 +00007002 switch (getToolChain().getArch()) {
7003 case llvm::Triple::x86:
7004 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7005 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007006 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007007 break;
7008
7009 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007010 CmdArgs.push_back("-mppc");
7011 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007012 break;
7013
7014 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007015 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007016 CmdArgs.push_back("-32");
7017 NeedsKPIC = true;
7018 break;
7019
7020 case llvm::Triple::sparcv9:
7021 CmdArgs.push_back("-64");
7022 CmdArgs.push_back("-Av9a");
7023 NeedsKPIC = true;
7024 break;
7025
7026 case llvm::Triple::mips64:
7027 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007028 StringRef CPUName;
7029 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007030 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007031
7032 CmdArgs.push_back("-mabi");
7033 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7034
7035 if (getToolChain().getArch() == llvm::Triple::mips64)
7036 CmdArgs.push_back("-EB");
7037 else
7038 CmdArgs.push_back("-EL");
7039
Rafael Espindolacc126272014-02-28 01:55:21 +00007040 NeedsKPIC = true;
7041 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007042 }
7043
Rafael Espindolacc126272014-02-28 01:55:21 +00007044 default:
7045 break;
7046 }
7047
7048 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007049 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007050
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007051 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007052
7053 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007054 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007055
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007056 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007057 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007058
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007059 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007060 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007061}
7062
Douglas Katzman95354292015-06-23 20:42:09 +00007063void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7064 const InputInfo &Output,
7065 const InputInfoList &Inputs,
7066 const ArgList &Args,
7067 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007068 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007069 ArgStringList CmdArgs;
7070
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007071 // Silence warning for "clang -g foo.o -o foo"
7072 Args.ClaimAllArgs(options::OPT_g_Group);
7073 // and "clang -emit-llvm foo.o -o foo"
7074 Args.ClaimAllArgs(options::OPT_emit_llvm);
7075 // and for "clang -w foo.o -o foo". Other warning options are already
7076 // handled somewhere else.
7077 Args.ClaimAllArgs(options::OPT_w);
7078
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007079 if (getToolChain().getArch() == llvm::Triple::mips64)
7080 CmdArgs.push_back("-EB");
7081 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7082 CmdArgs.push_back("-EL");
7083
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007084 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007085 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007086 CmdArgs.push_back("-e");
7087 CmdArgs.push_back("__start");
7088 }
7089
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007090 if (Args.hasArg(options::OPT_static)) {
7091 CmdArgs.push_back("-Bstatic");
7092 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007093 if (Args.hasArg(options::OPT_rdynamic))
7094 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007095 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007096 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007097 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007098 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007099 } else {
7100 CmdArgs.push_back("-dynamic-linker");
7101 CmdArgs.push_back("/usr/libexec/ld.so");
7102 }
7103 }
7104
Rafael Espindola044f7832013-06-05 04:28:55 +00007105 if (Args.hasArg(options::OPT_nopie))
7106 CmdArgs.push_back("-nopie");
7107
Daniel Dunbarb440f562010-08-02 02:38:21 +00007108 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007109 CmdArgs.push_back("-o");
7110 CmdArgs.push_back(Output.getFilename());
7111 } else {
7112 assert(Output.isNothing() && "Invalid output.");
7113 }
7114
7115 if (!Args.hasArg(options::OPT_nostdlib) &&
7116 !Args.hasArg(options::OPT_nostartfiles)) {
7117 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007118 if (Args.hasArg(options::OPT_pg))
7119 CmdArgs.push_back(
7120 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007121 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007122 CmdArgs.push_back(
7123 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7124 CmdArgs.push_back(
7125 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007126 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007127 CmdArgs.push_back(
7128 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007129 }
7130 }
7131
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007132 std::string Triple = getToolChain().getTripleString();
7133 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007134 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007135 CmdArgs.push_back(
7136 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007137
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007138 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7139 options::OPT_e, options::OPT_s, options::OPT_t,
7140 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007141
Daniel Dunbar54423b22010-09-17 00:24:54 +00007142 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007143
7144 if (!Args.hasArg(options::OPT_nostdlib) &&
7145 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007146 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007147 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007148 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007149 CmdArgs.push_back("-lm_p");
7150 else
7151 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007152 }
7153
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007154 // FIXME: For some reason GCC passes -lgcc before adding
7155 // the default system libraries. Just mimic this for now.
7156 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007157
Eric Christopher17674ec2012-09-13 06:32:34 +00007158 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7160 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007161 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007162 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007163 }
7164
Chandler Carruth45661652011-12-17 22:32:42 +00007165 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007166 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007167 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007168 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007169 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007170 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007171
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007172 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007173 }
7174
7175 if (!Args.hasArg(options::OPT_nostdlib) &&
7176 !Args.hasArg(options::OPT_nostartfiles)) {
7177 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007178 CmdArgs.push_back(
7179 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007180 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007181 CmdArgs.push_back(
7182 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007183 }
7184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007185 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007186 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007187}
Ed Schoutene33194b2009-04-02 19:13:12 +00007188
Douglas Katzman95354292015-06-23 20:42:09 +00007189void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7190 const InputInfo &Output,
7191 const InputInfoList &Inputs,
7192 const ArgList &Args,
7193 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007194 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007195 ArgStringList CmdArgs;
7196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007197 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007198
7199 CmdArgs.push_back("-o");
7200 CmdArgs.push_back(Output.getFilename());
7201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007202 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007203 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007205 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007207}
7208
Douglas Katzman95354292015-06-23 20:42:09 +00007209void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7210 const InputInfo &Output,
7211 const InputInfoList &Inputs,
7212 const ArgList &Args,
7213 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007214 const Driver &D = getToolChain().getDriver();
7215 ArgStringList CmdArgs;
7216
7217 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7218 (!Args.hasArg(options::OPT_shared))) {
7219 CmdArgs.push_back("-e");
7220 CmdArgs.push_back("__start");
7221 }
7222
7223 if (Args.hasArg(options::OPT_static)) {
7224 CmdArgs.push_back("-Bstatic");
7225 } else {
7226 if (Args.hasArg(options::OPT_rdynamic))
7227 CmdArgs.push_back("-export-dynamic");
7228 CmdArgs.push_back("--eh-frame-hdr");
7229 CmdArgs.push_back("-Bdynamic");
7230 if (Args.hasArg(options::OPT_shared)) {
7231 CmdArgs.push_back("-shared");
7232 } else {
7233 CmdArgs.push_back("-dynamic-linker");
7234 CmdArgs.push_back("/usr/libexec/ld.so");
7235 }
7236 }
7237
7238 if (Output.isFilename()) {
7239 CmdArgs.push_back("-o");
7240 CmdArgs.push_back(Output.getFilename());
7241 } else {
7242 assert(Output.isNothing() && "Invalid output.");
7243 }
7244
7245 if (!Args.hasArg(options::OPT_nostdlib) &&
7246 !Args.hasArg(options::OPT_nostartfiles)) {
7247 if (!Args.hasArg(options::OPT_shared)) {
7248 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007249 CmdArgs.push_back(
7250 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007251 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007252 CmdArgs.push_back(
7253 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7254 CmdArgs.push_back(
7255 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007256 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007257 CmdArgs.push_back(
7258 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007259 }
7260 }
7261
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007262 Args.AddAllArgs(CmdArgs,
7263 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007264
7265 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7266
7267 if (!Args.hasArg(options::OPT_nostdlib) &&
7268 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007269 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007270 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7271 if (Args.hasArg(options::OPT_pg))
7272 CmdArgs.push_back("-lm_p");
7273 else
7274 CmdArgs.push_back("-lm");
7275 }
7276
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007277 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007278 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007279 CmdArgs.push_back("-lpthread_p");
7280 else
7281 CmdArgs.push_back("-lpthread");
7282 }
7283
Eli Friedman9fa28852012-08-08 23:57:20 +00007284 if (!Args.hasArg(options::OPT_shared)) {
7285 if (Args.hasArg(options::OPT_pg))
7286 CmdArgs.push_back("-lc_p");
7287 else
7288 CmdArgs.push_back("-lc");
7289 }
7290
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007291 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007292 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007293 case llvm::Triple::arm:
7294 MyArch = "arm";
7295 break;
7296 case llvm::Triple::x86:
7297 MyArch = "i386";
7298 break;
7299 case llvm::Triple::x86_64:
7300 MyArch = "amd64";
7301 break;
7302 default:
7303 llvm_unreachable("Unsupported architecture");
7304 }
7305 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007306 }
7307
7308 if (!Args.hasArg(options::OPT_nostdlib) &&
7309 !Args.hasArg(options::OPT_nostartfiles)) {
7310 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007311 CmdArgs.push_back(
7312 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007313 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007314 CmdArgs.push_back(
7315 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007316 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007318 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007319 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007320}
7321
Douglas Katzman95354292015-06-23 20:42:09 +00007322void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7323 const InputInfo &Output,
7324 const InputInfoList &Inputs,
7325 const ArgList &Args,
7326 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007327 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007328 ArgStringList CmdArgs;
7329
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007330 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7331 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007332 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007333 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007334 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007335 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007336 else if (getToolChain().getArch() == llvm::Triple::mips ||
7337 getToolChain().getArch() == llvm::Triple::mipsel ||
7338 getToolChain().getArch() == llvm::Triple::mips64 ||
7339 getToolChain().getArch() == llvm::Triple::mips64el) {
7340 StringRef CPUName;
7341 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007342 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007343
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007344 CmdArgs.push_back("-march");
7345 CmdArgs.push_back(CPUName.data());
7346
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007347 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007348 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007349
7350 if (getToolChain().getArch() == llvm::Triple::mips ||
7351 getToolChain().getArch() == llvm::Triple::mips64)
7352 CmdArgs.push_back("-EB");
7353 else
7354 CmdArgs.push_back("-EL");
7355
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007356 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007357 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007358 getToolChain().getArch() == llvm::Triple::armeb ||
7359 getToolChain().getArch() == llvm::Triple::thumb ||
7360 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007361 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007362
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007363 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007364 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007365 else
Renato Golinf4421f72014-02-19 10:44:07 +00007366 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007367
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007368 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007369 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007370 case llvm::Triple::GNUEABI:
7371 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007372 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007373 break;
7374
7375 default:
7376 CmdArgs.push_back("-matpcs");
7377 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007378 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007379 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007380 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007381 if (getToolChain().getArch() == llvm::Triple::sparc)
7382 CmdArgs.push_back("-Av8plusa");
7383 else
7384 CmdArgs.push_back("-Av9a");
7385
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007386 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007387 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007388
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007389 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007390
7391 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007392 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007393
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007394 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007395 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007397 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007398 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007399}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007400
Douglas Katzman95354292015-06-23 20:42:09 +00007401void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7402 const InputInfo &Output,
7403 const InputInfoList &Inputs,
7404 const ArgList &Args,
7405 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007406 const toolchains::FreeBSD &ToolChain =
7407 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007408 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007409 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007410 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007411 !Args.hasArg(options::OPT_shared) &&
7412 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007413 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007414
7415 // Silence warning for "clang -g foo.o -o foo"
7416 Args.ClaimAllArgs(options::OPT_g_Group);
7417 // and "clang -emit-llvm foo.o -o foo"
7418 Args.ClaimAllArgs(options::OPT_emit_llvm);
7419 // and for "clang -w foo.o -o foo". Other warning options are already
7420 // handled somewhere else.
7421 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007422
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007423 if (!D.SysRoot.empty())
7424 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7425
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007426 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007427 CmdArgs.push_back("-pie");
7428
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007429 if (Args.hasArg(options::OPT_static)) {
7430 CmdArgs.push_back("-Bstatic");
7431 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007432 if (Args.hasArg(options::OPT_rdynamic))
7433 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007434 CmdArgs.push_back("--eh-frame-hdr");
7435 if (Args.hasArg(options::OPT_shared)) {
7436 CmdArgs.push_back("-Bshareable");
7437 } else {
7438 CmdArgs.push_back("-dynamic-linker");
7439 CmdArgs.push_back("/libexec/ld-elf.so.1");
7440 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007441 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007442 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7443 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7444 CmdArgs.push_back("--hash-style=both");
7445 }
7446 }
7447 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007448 }
7449
7450 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7451 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007452 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007453 CmdArgs.push_back("-m");
7454 CmdArgs.push_back("elf_i386_fbsd");
7455 }
7456
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007457 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007458 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007459 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007460 }
7461
Daniel Dunbarb440f562010-08-02 02:38:21 +00007462 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007463 CmdArgs.push_back("-o");
7464 CmdArgs.push_back(Output.getFilename());
7465 } else {
7466 assert(Output.isNothing() && "Invalid output.");
7467 }
7468
7469 if (!Args.hasArg(options::OPT_nostdlib) &&
7470 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007471 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007472 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007473 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007474 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007475 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007476 crt1 = "Scrt1.o";
7477 else
7478 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007479 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007480 if (crt1)
7481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7482
7483 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7484
Craig Topper92fc2df2014-05-17 16:56:41 +00007485 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007486 if (Args.hasArg(options::OPT_static))
7487 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007488 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007489 crtbegin = "crtbeginS.o";
7490 else
7491 crtbegin = "crtbegin.o";
7492
7493 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007494 }
7495
7496 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007497 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007498 for (const auto &Path : Paths)
7499 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007500 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7501 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007502 Args.AddAllArgs(CmdArgs, options::OPT_s);
7503 Args.AddAllArgs(CmdArgs, options::OPT_t);
7504 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7505 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007506
Alexey Samsonov907880e2015-06-19 19:57:46 +00007507 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007508 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007509
Alexey Samsonov52550342014-09-15 19:58:40 +00007510 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007511 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007512
7513 if (!Args.hasArg(options::OPT_nostdlib) &&
7514 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007515 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007516 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007517 if (Args.hasArg(options::OPT_pg))
7518 CmdArgs.push_back("-lm_p");
7519 else
7520 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007521 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007522 if (NeedsSanitizerDeps)
7523 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007524 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7525 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007526 if (Args.hasArg(options::OPT_pg))
7527 CmdArgs.push_back("-lgcc_p");
7528 else
7529 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007530 if (Args.hasArg(options::OPT_static)) {
7531 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007532 } else if (Args.hasArg(options::OPT_pg)) {
7533 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007534 } else {
7535 CmdArgs.push_back("--as-needed");
7536 CmdArgs.push_back("-lgcc_s");
7537 CmdArgs.push_back("--no-as-needed");
7538 }
7539
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007540 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007541 if (Args.hasArg(options::OPT_pg))
7542 CmdArgs.push_back("-lpthread_p");
7543 else
7544 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007545 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007546
Roman Divacky66f22762011-02-10 16:59:40 +00007547 if (Args.hasArg(options::OPT_pg)) {
7548 if (Args.hasArg(options::OPT_shared))
7549 CmdArgs.push_back("-lc");
7550 else
7551 CmdArgs.push_back("-lc_p");
7552 CmdArgs.push_back("-lgcc_p");
7553 } else {
7554 CmdArgs.push_back("-lc");
7555 CmdArgs.push_back("-lgcc");
7556 }
7557
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007558 if (Args.hasArg(options::OPT_static)) {
7559 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007560 } else if (Args.hasArg(options::OPT_pg)) {
7561 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007562 } else {
7563 CmdArgs.push_back("--as-needed");
7564 CmdArgs.push_back("-lgcc_s");
7565 CmdArgs.push_back("--no-as-needed");
7566 }
7567 }
7568
7569 if (!Args.hasArg(options::OPT_nostdlib) &&
7570 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007571 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007572 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007573 else
7574 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007575 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007576 }
7577
Alexey Samsonov7811d192014-02-20 13:57:37 +00007578 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007580 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007581 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007582}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007583
Douglas Katzman95354292015-06-23 20:42:09 +00007584void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007585 const InputInfo &Output,
7586 const InputInfoList &Inputs,
7587 const ArgList &Args,
7588 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007589 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007590 ArgStringList CmdArgs;
7591
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007592 // GNU as needs different flags for creating the correct output format
7593 // on architectures with different ABIs or optional feature sets.
7594 switch (getToolChain().getArch()) {
7595 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007596 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007597 break;
7598 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007599 case llvm::Triple::armeb:
7600 case llvm::Triple::thumb:
7601 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007602 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007603 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7604 std::string Arch =
7605 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007606 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007607 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007608 }
7609
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007610 case llvm::Triple::mips:
7611 case llvm::Triple::mipsel:
7612 case llvm::Triple::mips64:
7613 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007614 StringRef CPUName;
7615 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007616 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007617
7618 CmdArgs.push_back("-march");
7619 CmdArgs.push_back(CPUName.data());
7620
7621 CmdArgs.push_back("-mabi");
7622 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7623
7624 if (getToolChain().getArch() == llvm::Triple::mips ||
7625 getToolChain().getArch() == llvm::Triple::mips64)
7626 CmdArgs.push_back("-EB");
7627 else
7628 CmdArgs.push_back("-EL");
7629
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007630 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007631 break;
7632 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007633
7634 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007635 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007636 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007637 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007638 break;
7639
7640 case llvm::Triple::sparcv9:
7641 CmdArgs.push_back("-64");
7642 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007643 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007644 break;
7645
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007646 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007647 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007648 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007649
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007650 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007651
7652 CmdArgs.push_back("-o");
7653 CmdArgs.push_back(Output.getFilename());
7654
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007655 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007656 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007657
David Chisnallddbd68f2011-09-27 22:03:18 +00007658 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007659 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007660}
7661
Douglas Katzman95354292015-06-23 20:42:09 +00007662void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7663 const InputInfo &Output,
7664 const InputInfoList &Inputs,
7665 const ArgList &Args,
7666 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007667 const Driver &D = getToolChain().getDriver();
7668 ArgStringList CmdArgs;
7669
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007670 if (!D.SysRoot.empty())
7671 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7672
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007673 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007674 if (Args.hasArg(options::OPT_static)) {
7675 CmdArgs.push_back("-Bstatic");
7676 } else {
7677 if (Args.hasArg(options::OPT_rdynamic))
7678 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007679 if (Args.hasArg(options::OPT_shared)) {
7680 CmdArgs.push_back("-Bshareable");
7681 } else {
7682 CmdArgs.push_back("-dynamic-linker");
7683 CmdArgs.push_back("/libexec/ld.elf_so");
7684 }
7685 }
7686
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007687 // Many NetBSD architectures support more than one ABI.
7688 // Determine the correct emulation for ld.
7689 switch (getToolChain().getArch()) {
7690 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007691 CmdArgs.push_back("-m");
7692 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007693 break;
7694 case llvm::Triple::arm:
7695 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007696 CmdArgs.push_back("-m");
7697 switch (getToolChain().getTriple().getEnvironment()) {
7698 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007699 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007700 CmdArgs.push_back("armelf_nbsd_eabi");
7701 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007702 case llvm::Triple::EABIHF:
7703 case llvm::Triple::GNUEABIHF:
7704 CmdArgs.push_back("armelf_nbsd_eabihf");
7705 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007706 default:
7707 CmdArgs.push_back("armelf_nbsd");
7708 break;
7709 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007710 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007711 case llvm::Triple::armeb:
7712 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007713 arm::appendEBLinkFlags(
7714 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007715 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007716 CmdArgs.push_back("-m");
7717 switch (getToolChain().getTriple().getEnvironment()) {
7718 case llvm::Triple::EABI:
7719 case llvm::Triple::GNUEABI:
7720 CmdArgs.push_back("armelfb_nbsd_eabi");
7721 break;
7722 case llvm::Triple::EABIHF:
7723 case llvm::Triple::GNUEABIHF:
7724 CmdArgs.push_back("armelfb_nbsd_eabihf");
7725 break;
7726 default:
7727 CmdArgs.push_back("armelfb_nbsd");
7728 break;
7729 }
7730 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007731 case llvm::Triple::mips64:
7732 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007733 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007734 CmdArgs.push_back("-m");
7735 if (getToolChain().getArch() == llvm::Triple::mips64)
7736 CmdArgs.push_back("elf32btsmip");
7737 else
7738 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007739 } else if (mips::hasMipsAbiArg(Args, "64")) {
7740 CmdArgs.push_back("-m");
7741 if (getToolChain().getArch() == llvm::Triple::mips64)
7742 CmdArgs.push_back("elf64btsmip");
7743 else
7744 CmdArgs.push_back("elf64ltsmip");
7745 }
7746 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007747 case llvm::Triple::ppc:
7748 CmdArgs.push_back("-m");
7749 CmdArgs.push_back("elf32ppc_nbsd");
7750 break;
7751
7752 case llvm::Triple::ppc64:
7753 case llvm::Triple::ppc64le:
7754 CmdArgs.push_back("-m");
7755 CmdArgs.push_back("elf64ppc");
7756 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007757
7758 case llvm::Triple::sparc:
7759 CmdArgs.push_back("-m");
7760 CmdArgs.push_back("elf32_sparc");
7761 break;
7762
7763 case llvm::Triple::sparcv9:
7764 CmdArgs.push_back("-m");
7765 CmdArgs.push_back("elf64_sparc");
7766 break;
7767
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007768 default:
7769 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007770 }
7771
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007772 if (Output.isFilename()) {
7773 CmdArgs.push_back("-o");
7774 CmdArgs.push_back(Output.getFilename());
7775 } else {
7776 assert(Output.isNothing() && "Invalid output.");
7777 }
7778
7779 if (!Args.hasArg(options::OPT_nostdlib) &&
7780 !Args.hasArg(options::OPT_nostartfiles)) {
7781 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007782 CmdArgs.push_back(
7783 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7784 CmdArgs.push_back(
7785 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7786 CmdArgs.push_back(
7787 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007788 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007789 CmdArgs.push_back(
7790 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7791 CmdArgs.push_back(
7792 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007793 }
7794 }
7795
7796 Args.AddAllArgs(CmdArgs, options::OPT_L);
7797 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7798 Args.AddAllArgs(CmdArgs, options::OPT_e);
7799 Args.AddAllArgs(CmdArgs, options::OPT_s);
7800 Args.AddAllArgs(CmdArgs, options::OPT_t);
7801 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7802 Args.AddAllArgs(CmdArgs, options::OPT_r);
7803
7804 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7805
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007806 unsigned Major, Minor, Micro;
7807 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7808 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007809 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007810 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007811 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007812 case llvm::Triple::arm:
7813 case llvm::Triple::armeb:
7814 case llvm::Triple::thumb:
7815 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007816 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007817 case llvm::Triple::ppc64:
7818 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007819 case llvm::Triple::x86:
7820 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007821 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007822 break;
7823 default:
7824 break;
7825 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007826 }
7827
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007828 if (!Args.hasArg(options::OPT_nostdlib) &&
7829 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007830 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007831 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7832 CmdArgs.push_back("-lm");
7833 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007834 if (Args.hasArg(options::OPT_pthread))
7835 CmdArgs.push_back("-lpthread");
7836 CmdArgs.push_back("-lc");
7837
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007838 if (useLibgcc) {
7839 if (Args.hasArg(options::OPT_static)) {
7840 // libgcc_eh depends on libc, so resolve as much as possible,
7841 // pull in any new requirements from libc and then get the rest
7842 // of libgcc.
7843 CmdArgs.push_back("-lgcc_eh");
7844 CmdArgs.push_back("-lc");
7845 CmdArgs.push_back("-lgcc");
7846 } else {
7847 CmdArgs.push_back("-lgcc");
7848 CmdArgs.push_back("--as-needed");
7849 CmdArgs.push_back("-lgcc_s");
7850 CmdArgs.push_back("--no-as-needed");
7851 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007852 }
7853 }
7854
7855 if (!Args.hasArg(options::OPT_nostdlib) &&
7856 !Args.hasArg(options::OPT_nostartfiles)) {
7857 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007858 CmdArgs.push_back(
7859 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007860 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007861 CmdArgs.push_back(
7862 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7863 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007864 }
7865
Alexey Samsonov7811d192014-02-20 13:57:37 +00007866 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007867
Logan Chieneb9162f2014-06-26 14:23:45 +00007868 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007869 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007870}
7871
Douglas Katzman95354292015-06-23 20:42:09 +00007872void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7873 const InputInfo &Output,
7874 const InputInfoList &Inputs,
7875 const ArgList &Args,
7876 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007877 claimNoWarnArgs(Args);
7878
James Y Knight2db38f32015-08-15 03:45:25 +00007879 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7880 llvm::Triple Triple = llvm::Triple(TripleStr);
7881
Rafael Espindola92b00932010-08-10 00:25:48 +00007882 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007883 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007884
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007885 llvm::Reloc::Model RelocationModel;
7886 unsigned PICLevel;
7887 bool IsPIE;
7888 std::tie(RelocationModel, PICLevel, IsPIE) =
7889 ParsePICArgs(getToolChain(), Triple, Args);
7890
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007891 switch (getToolChain().getArch()) {
7892 default:
7893 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007894 // Add --32/--64 to make sure we get the format we want.
7895 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007896 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007897 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007898 break;
7899 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007900 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7901 CmdArgs.push_back("--x32");
7902 else
7903 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007904 break;
7905 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007906 CmdArgs.push_back("-a32");
7907 CmdArgs.push_back("-mppc");
7908 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007909 break;
7910 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007911 CmdArgs.push_back("-a64");
7912 CmdArgs.push_back("-mppc64");
7913 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007914 break;
7915 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007916 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007917 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007918 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007919 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007920 break;
7921 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007922 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007923 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007924 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007925 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007926 break;
7927 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007928 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007929 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007930 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007931 break;
7932 case llvm::Triple::arm:
7933 case llvm::Triple::armeb:
7934 case llvm::Triple::thumb:
7935 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007936 const llvm::Triple &Triple2 = getToolChain().getTriple();
7937 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007938 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007939 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007940 break;
7941 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007942 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007943 break;
7944 default:
7945 break;
7946 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007947
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007948 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007949 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
7950 case arm::FloatABI::Soft:
7951 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
7952 break;
7953 case arm::FloatABI::SoftFP:
7954 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
7955 break;
7956 case arm::FloatABI::Hard:
7957 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
7958 break;
7959 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007960
7961 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007962
7963 // FIXME: remove krait check when GNU tools support krait cpu
7964 // for now replace it with -march=armv7-a to avoid a lower
7965 // march from being picked in the absence of a cpu flag.
7966 Arg *A;
7967 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007968 StringRef(A->getValue()).lower() == "krait")
7969 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007970 else
7971 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007972 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007973 break;
7974 }
7975 case llvm::Triple::mips:
7976 case llvm::Triple::mipsel:
7977 case llvm::Triple::mips64:
7978 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007979 StringRef CPUName;
7980 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007981 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007982 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007983
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007984 CmdArgs.push_back("-march");
7985 CmdArgs.push_back(CPUName.data());
7986
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007987 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007988 CmdArgs.push_back(ABIName.data());
7989
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007990 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7991 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007992 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007993 CmdArgs.push_back("-mno-shared");
7994
Daniel Sanders379d44b2014-07-16 11:52:23 +00007995 // LLVM doesn't support -mplt yet and acts as if it is always given.
7996 // However, -mplt has no effect with the N64 ABI.
7997 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007998
7999 if (getToolChain().getArch() == llvm::Triple::mips ||
8000 getToolChain().getArch() == llvm::Triple::mips64)
8001 CmdArgs.push_back("-EB");
8002 else
8003 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008004
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008005 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8006 if (StringRef(A->getValue()) == "2008")
8007 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8008 }
8009
Daniel Sanders379d44b2014-07-16 11:52:23 +00008010 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8011 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8012 options::OPT_mfp64)) {
8013 A->claim();
8014 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008015 } else if (mips::shouldUseFPXX(
8016 Args, getToolChain().getTriple(), CPUName, ABIName,
8017 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008018 CmdArgs.push_back("-mfpxx");
8019
8020 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8021 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008022 if (Arg *A =
8023 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008024 if (A->getOption().matches(options::OPT_mips16)) {
8025 A->claim();
8026 A->render(Args, CmdArgs);
8027 } else {
8028 A->claim();
8029 CmdArgs.push_back("-no-mips16");
8030 }
8031 }
8032
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008033 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8034 options::OPT_mno_micromips);
8035 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8036 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8037
Simon Atanasyanbd986632013-11-26 11:58:04 +00008038 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8039 // Do not use AddLastArg because not all versions of MIPS assembler
8040 // support -mmsa / -mno-msa options.
8041 if (A->getOption().matches(options::OPT_mmsa))
8042 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8043 }
8044
Daniel Sanders379d44b2014-07-16 11:52:23 +00008045 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8046 options::OPT_msoft_float);
8047
Toma Tabacub36d6102015-06-11 12:13:18 +00008048 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8049 options::OPT_msingle_float);
8050
Daniel Sanders379d44b2014-07-16 11:52:23 +00008051 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8052 options::OPT_mno_odd_spreg);
8053
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008054 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008055 break;
8056 }
8057 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008058 // Always pass an -march option, since our default of z10 is later
8059 // than the GNU assembler's default.
8060 StringRef CPUName = getSystemZTargetCPU(Args);
8061 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008062 break;
8063 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008064 }
8065
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008066 if (NeedsKPIC) {
8067 if (RelocationModel != llvm::Reloc::Static)
8068 CmdArgs.push_back("-KPIC");
8069 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008070
Renato Golina74bbc72015-07-22 15:32:36 +00008071 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008072 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008073
8074 CmdArgs.push_back("-o");
8075 CmdArgs.push_back(Output.getFilename());
8076
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008077 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008078 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008079
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008080 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008081 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008082
8083 // Handle the debug info splitting at object creation time if we're
8084 // creating an object.
8085 // TODO: Currently only works on linux with newer objcopy.
8086 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008087 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008088 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008089 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008090}
8091
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008092static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008093 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008094 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008095 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008096 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8097 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008098 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008099 CmdArgs.push_back("-lgcc");
8100
Logan Chien3d3373c2012-11-19 12:04:11 +00008101 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008102 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008103 CmdArgs.push_back("-lgcc");
8104 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008105 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008106 CmdArgs.push_back("--as-needed");
8107 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008108 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008109 CmdArgs.push_back("--no-as-needed");
8110 }
8111
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008112 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008113 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008114 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008115 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008116
8117 // According to Android ABI, we have to link with libdl if we are
8118 // linking with non-static libgcc.
8119 //
8120 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8121 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8122 if (isAndroid && !StaticLibgcc)
8123 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008124}
8125
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008126static std::string getLinuxDynamicLinker(const ArgList &Args,
8127 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008128 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8129
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008130 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8131 if (ToolChain.getTriple().isArch64Bit())
8132 return "/system/bin/linker64";
8133 else
8134 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008135 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8136 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008137 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008138 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008139 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008140 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008141 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008142 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008143 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008144 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008145 return "/lib/ld-linux-armhf.so.3";
8146 else
8147 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008148 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8149 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008150 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008151 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008152 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008153 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008154 return "/lib/ld-linux.so.3";
8155 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8156 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008157 StringRef CPUName;
8158 StringRef ABIName;
8159 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8160 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8161
8162 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8163 .Case("o32", "/lib")
8164 .Case("n32", "/lib32")
8165 .Case("n64", "/lib64")
8166 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008167 StringRef LibName;
8168 if (mips::isUCLibc(Args))
8169 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8170 else
8171 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008172
8173 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008174 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008175 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008176 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008177 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8178 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008179 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008180 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008181 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8182 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008183 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008184 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008185 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008186 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008187 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008188 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008189 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8190 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008191 else
8192 return "/lib64/ld-linux-x86-64.so.2";
8193}
8194
Renato Golinc4b49242014-02-13 10:01:16 +00008195static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008196 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008197 // Make use of compiler-rt if --rtlib option is used
8198 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8199
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008200 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008201 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008202 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008203 default:
8204 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008205 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008206 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008207 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008208 break;
8209 }
Renato Golinc4b49242014-02-13 10:01:16 +00008210 break;
8211 case ToolChain::RLT_Libgcc:
8212 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8213 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008214 }
8215}
8216
Rafael Espindola1e085772014-08-15 17:14:35 +00008217static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8218 switch (T.getArch()) {
8219 case llvm::Triple::x86:
8220 return "elf_i386";
8221 case llvm::Triple::aarch64:
8222 return "aarch64linux";
8223 case llvm::Triple::aarch64_be:
8224 return "aarch64_be_linux";
8225 case llvm::Triple::arm:
8226 case llvm::Triple::thumb:
8227 return "armelf_linux_eabi";
8228 case llvm::Triple::armeb:
8229 case llvm::Triple::thumbeb:
8230 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8231 case llvm::Triple::ppc:
8232 return "elf32ppclinux";
8233 case llvm::Triple::ppc64:
8234 return "elf64ppc";
8235 case llvm::Triple::ppc64le:
8236 return "elf64lppc";
8237 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008238 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008239 return "elf32_sparc";
8240 case llvm::Triple::sparcv9:
8241 return "elf64_sparc";
8242 case llvm::Triple::mips:
8243 return "elf32btsmip";
8244 case llvm::Triple::mipsel:
8245 return "elf32ltsmip";
8246 case llvm::Triple::mips64:
8247 if (mips::hasMipsAbiArg(Args, "n32"))
8248 return "elf32btsmipn32";
8249 return "elf64btsmip";
8250 case llvm::Triple::mips64el:
8251 if (mips::hasMipsAbiArg(Args, "n32"))
8252 return "elf32ltsmipn32";
8253 return "elf64ltsmip";
8254 case llvm::Triple::systemz:
8255 return "elf64_s390";
8256 case llvm::Triple::x86_64:
8257 if (T.getEnvironment() == llvm::Triple::GNUX32)
8258 return "elf32_x86_64";
8259 return "elf_x86_64";
8260 default:
8261 llvm_unreachable("Unexpected arch");
8262 }
8263}
8264
Douglas Katzman95354292015-06-23 20:42:09 +00008265void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8266 const InputInfo &Output,
8267 const InputInfoList &Inputs,
8268 const ArgList &Args,
8269 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008270 const toolchains::Linux &ToolChain =
8271 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008272 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008273
8274 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8275 llvm::Triple Triple = llvm::Triple(TripleStr);
8276
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008277 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008278 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008279 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008280 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008281 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8282 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008283
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008284 ArgStringList CmdArgs;
8285
Rafael Espindolad1002f62010-11-15 18:28:16 +00008286 // Silence warning for "clang -g foo.o -o foo"
8287 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008288 // and "clang -emit-llvm foo.o -o foo"
8289 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008290 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008291 // handled somewhere else.
8292 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008293
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008294 if (!D.SysRoot.empty())
8295 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008296
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008297 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008298 CmdArgs.push_back("-pie");
8299
Rafael Espindola1c76c592010-11-07 22:57:16 +00008300 if (Args.hasArg(options::OPT_rdynamic))
8301 CmdArgs.push_back("-export-dynamic");
8302
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008303 if (Args.hasArg(options::OPT_s))
8304 CmdArgs.push_back("-s");
8305
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008306 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008307 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008308
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008309 for (const auto &Opt : ToolChain.ExtraOpts)
8310 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008311
8312 if (!Args.hasArg(options::OPT_static)) {
8313 CmdArgs.push_back("--eh-frame-hdr");
8314 }
8315
8316 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008317 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008318
8319 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008320 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8321 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008322 CmdArgs.push_back("-Bstatic");
8323 else
8324 CmdArgs.push_back("-static");
8325 } else if (Args.hasArg(options::OPT_shared)) {
8326 CmdArgs.push_back("-shared");
8327 }
8328
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008329 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8330 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008331 (!Args.hasArg(options::OPT_static) &&
8332 !Args.hasArg(options::OPT_shared))) {
8333 CmdArgs.push_back("-dynamic-linker");
8334 CmdArgs.push_back(Args.MakeArgString(
8335 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8336 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008337
8338 CmdArgs.push_back("-o");
8339 CmdArgs.push_back(Output.getFilename());
8340
Rafael Espindola81937ec2010-12-01 01:52:43 +00008341 if (!Args.hasArg(options::OPT_nostdlib) &&
8342 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008343 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008344 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008345 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008346 if (Args.hasArg(options::OPT_pg))
8347 crt1 = "gcrt1.o";
8348 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008349 crt1 = "Scrt1.o";
8350 else
8351 crt1 = "crt1.o";
8352 }
8353 if (crt1)
8354 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008355
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008356 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8357 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008358
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008359 const char *crtbegin;
8360 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008361 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008362 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008363 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008364 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008365 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008366 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008367 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008368 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008369
8370 // Add crtfastmath.o if available and fast math is enabled.
8371 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008372 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008373
8374 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008375 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008376
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008377 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008378
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008379 for (const auto &Path : Paths)
8380 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008381
Alexey Samsonov907880e2015-06-19 19:57:46 +00008382 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008383 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008384
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008385 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8386 CmdArgs.push_back("--no-demangle");
8387
Alexey Samsonov52550342014-09-15 19:58:40 +00008388 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008389 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008390 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008391 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008392
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008393 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008394 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008395 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008396 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008397 if (OnlyLibstdcxxStatic)
8398 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008399 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008400 if (OnlyLibstdcxxStatic)
8401 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008402 CmdArgs.push_back("-lm");
8403 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008404 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8405 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008406
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008407 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008408 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8409 if (Args.hasArg(options::OPT_static))
8410 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008411
Alexey Samsonov52550342014-09-15 19:58:40 +00008412 if (NeedsSanitizerDeps)
8413 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8414
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008415 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8416 Args.hasArg(options::OPT_pthreads);
8417
8418 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8419 options::OPT_fno_openmp, false)) {
8420 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8421 // FIXME: Does this really make sense for all GNU toolchains?
8422 WantPthread = true;
8423
8424 // Also link the particular OpenMP runtimes.
8425 switch (getOpenMPRuntime(ToolChain, Args)) {
8426 case OMPRT_OMP:
8427 CmdArgs.push_back("-lomp");
8428 break;
8429 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008430 CmdArgs.push_back("-lgomp");
8431
8432 // FIXME: Exclude this for platforms with libgomp that don't require
8433 // librt. Most modern Linux platforms require it, but some may not.
8434 CmdArgs.push_back("-lrt");
8435 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008436 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008437 CmdArgs.push_back("-liomp5");
8438 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008439 case OMPRT_Unknown:
8440 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008441 break;
8442 }
Chandler Carruth01538002013-01-17 13:19:29 +00008443 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008444
Renato Golinc4b49242014-02-13 10:01:16 +00008445 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008446
Richard Smith31d1de22015-05-20 22:48:44 +00008447 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008448 CmdArgs.push_back("-lpthread");
8449
8450 CmdArgs.push_back("-lc");
8451
8452 if (Args.hasArg(options::OPT_static))
8453 CmdArgs.push_back("--end-group");
8454 else
Renato Golinc4b49242014-02-13 10:01:16 +00008455 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008456 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008457
Rafael Espindola81937ec2010-12-01 01:52:43 +00008458 if (!Args.hasArg(options::OPT_nostartfiles)) {
8459 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008460 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008461 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008462 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008463 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008464 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008465 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008466
Rafael Espindola81937ec2010-12-01 01:52:43 +00008467 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008468 if (!isAndroid)
8469 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008470 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008471 }
8472
Justin Bognerd3371d82015-07-17 03:35:54 +00008473 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8474 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008475}
8476
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008477// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8478// for the various SFI requirements like register masking. The assembly tool
8479// inserts the file containing the macros as an input into all the assembly
8480// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008481void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8482 const InputInfo &Output,
8483 const InputInfoList &Inputs,
8484 const ArgList &Args,
8485 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008486 const toolchains::NaClToolChain &ToolChain =
8487 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008488 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8489 "nacl-arm-macros.s");
8490 InputInfoList NewInputs;
8491 NewInputs.push_back(NaClMacros);
8492 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008493 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8494 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008495}
8496
Douglas Katzman750cfc52015-06-29 18:42:16 +00008497// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008498// we use static by default, do not yet support sanitizers or LTO, and a few
8499// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008500// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008501void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8502 const InputInfo &Output,
8503 const InputInfoList &Inputs,
8504 const ArgList &Args,
8505 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008506
Douglas Katzman54366072015-07-27 16:53:08 +00008507 const toolchains::NaClToolChain &ToolChain =
8508 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008509 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008510 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008511 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008512 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008513
8514 ArgStringList CmdArgs;
8515
8516 // Silence warning for "clang -g foo.o -o foo"
8517 Args.ClaimAllArgs(options::OPT_g_Group);
8518 // and "clang -emit-llvm foo.o -o foo"
8519 Args.ClaimAllArgs(options::OPT_emit_llvm);
8520 // and for "clang -w foo.o -o foo". Other warning options are already
8521 // handled somewhere else.
8522 Args.ClaimAllArgs(options::OPT_w);
8523
8524 if (!D.SysRoot.empty())
8525 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8526
8527 if (Args.hasArg(options::OPT_rdynamic))
8528 CmdArgs.push_back("-export-dynamic");
8529
8530 if (Args.hasArg(options::OPT_s))
8531 CmdArgs.push_back("-s");
8532
Douglas Katzman54366072015-07-27 16:53:08 +00008533 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8534 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008535 CmdArgs.push_back("--build-id");
8536
8537 if (!IsStatic)
8538 CmdArgs.push_back("--eh-frame-hdr");
8539
8540 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008541 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008542 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008543 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008544 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008545 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008546 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008547 else if (Arch == llvm::Triple::mipsel)
8548 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008549 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008550 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8551 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008552
8553 if (IsStatic)
8554 CmdArgs.push_back("-static");
8555 else if (Args.hasArg(options::OPT_shared))
8556 CmdArgs.push_back("-shared");
8557
8558 CmdArgs.push_back("-o");
8559 CmdArgs.push_back(Output.getFilename());
8560 if (!Args.hasArg(options::OPT_nostdlib) &&
8561 !Args.hasArg(options::OPT_nostartfiles)) {
8562 if (!Args.hasArg(options::OPT_shared))
8563 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8565
8566 const char *crtbegin;
8567 if (IsStatic)
8568 crtbegin = "crtbeginT.o";
8569 else if (Args.hasArg(options::OPT_shared))
8570 crtbegin = "crtbeginS.o";
8571 else
8572 crtbegin = "crtbegin.o";
8573 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8574 }
8575
8576 Args.AddAllArgs(CmdArgs, options::OPT_L);
8577 Args.AddAllArgs(CmdArgs, options::OPT_u);
8578
8579 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8580
8581 for (const auto &Path : Paths)
8582 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8583
8584 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8585 CmdArgs.push_back("--no-demangle");
8586
8587 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8588
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008589 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008590 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008591 bool OnlyLibstdcxxStatic =
8592 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008593 if (OnlyLibstdcxxStatic)
8594 CmdArgs.push_back("-Bstatic");
8595 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8596 if (OnlyLibstdcxxStatic)
8597 CmdArgs.push_back("-Bdynamic");
8598 CmdArgs.push_back("-lm");
8599 }
8600
8601 if (!Args.hasArg(options::OPT_nostdlib)) {
8602 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8603 // Always use groups, since it has no effect on dynamic libraries.
8604 CmdArgs.push_back("--start-group");
8605 CmdArgs.push_back("-lc");
8606 // NaCl's libc++ currently requires libpthread, so just always include it
8607 // in the group for C++.
8608 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008609 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008610 // Gold, used by Mips, handles nested groups differently than ld, and
8611 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8612 // which is not a desired behaviour here.
8613 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8614 if (getToolChain().getArch() == llvm::Triple::mipsel)
8615 CmdArgs.push_back("-lnacl");
8616
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008617 CmdArgs.push_back("-lpthread");
8618 }
8619
8620 CmdArgs.push_back("-lgcc");
8621 CmdArgs.push_back("--as-needed");
8622 if (IsStatic)
8623 CmdArgs.push_back("-lgcc_eh");
8624 else
8625 CmdArgs.push_back("-lgcc_s");
8626 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008627
8628 // Mips needs to create and use pnacl_legacy library that contains
8629 // definitions from bitcode/pnaclmm.c and definitions for
8630 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8631 if (getToolChain().getArch() == llvm::Triple::mipsel)
8632 CmdArgs.push_back("-lpnacl_legacy");
8633
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008634 CmdArgs.push_back("--end-group");
8635 }
8636
8637 if (!Args.hasArg(options::OPT_nostartfiles)) {
8638 const char *crtend;
8639 if (Args.hasArg(options::OPT_shared))
8640 crtend = "crtendS.o";
8641 else
8642 crtend = "crtend.o";
8643
8644 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8645 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8646 }
8647 }
8648
Justin Bognerd3371d82015-07-17 03:35:54 +00008649 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8650 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008651}
8652
Douglas Katzman95354292015-06-23 20:42:09 +00008653void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8654 const InputInfo &Output,
8655 const InputInfoList &Inputs,
8656 const ArgList &Args,
8657 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008658 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008659 ArgStringList CmdArgs;
8660
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008661 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008662
8663 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008664 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008665
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008666 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008667 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008668
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008669 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008670 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008671}
8672
Douglas Katzman95354292015-06-23 20:42:09 +00008673void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8674 const InputInfo &Output,
8675 const InputInfoList &Inputs,
8676 const ArgList &Args,
8677 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008678 const Driver &D = getToolChain().getDriver();
8679 ArgStringList CmdArgs;
8680
Daniel Dunbarb440f562010-08-02 02:38:21 +00008681 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008682 CmdArgs.push_back("-o");
8683 CmdArgs.push_back(Output.getFilename());
8684 } else {
8685 assert(Output.isNothing() && "Invalid output.");
8686 }
8687
8688 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008689 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008690 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8691 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8692 CmdArgs.push_back(
8693 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8694 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008695 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008696
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008697 Args.AddAllArgs(CmdArgs,
8698 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008699
Daniel Dunbar54423b22010-09-17 00:24:54 +00008700 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008701
Alexey Samsonov7811d192014-02-20 13:57:37 +00008702 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008703
Chris Lattner3e2ee142010-07-07 16:01:42 +00008704 if (!Args.hasArg(options::OPT_nostdlib) &&
8705 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008706 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008707 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008708 CmdArgs.push_back("-lm");
8709 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008710 }
8711
8712 if (!Args.hasArg(options::OPT_nostdlib) &&
8713 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008714 if (Args.hasArg(options::OPT_pthread))
8715 CmdArgs.push_back("-lpthread");
8716 CmdArgs.push_back("-lc");
8717 CmdArgs.push_back("-lCompilerRT-Generic");
8718 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8719 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008720 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008721 }
8722
Logan Chieneb9162f2014-06-26 14:23:45 +00008723 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008724 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008725}
8726
Daniel Dunbarcc912342009-05-02 18:28:39 +00008727/// DragonFly Tools
8728
8729// For now, DragonFly Assemble does just about the same as for
8730// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008731void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8732 const InputInfo &Output,
8733 const InputInfoList &Inputs,
8734 const ArgList &Args,
8735 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008736 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008737 ArgStringList CmdArgs;
8738
8739 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8740 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008741 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008742 CmdArgs.push_back("--32");
8743
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008744 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008745
8746 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008747 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008748
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008749 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008750 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008751
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008752 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008754}
8755
Douglas Katzman95354292015-06-23 20:42:09 +00008756void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8757 const InputInfo &Output,
8758 const InputInfoList &Inputs,
8759 const ArgList &Args,
8760 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008761 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008762 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008763 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008764
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008765 if (!D.SysRoot.empty())
8766 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8767
John McCall65b8da02013-04-11 22:55:55 +00008768 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008769 if (Args.hasArg(options::OPT_static)) {
8770 CmdArgs.push_back("-Bstatic");
8771 } else {
John McCall65b8da02013-04-11 22:55:55 +00008772 if (Args.hasArg(options::OPT_rdynamic))
8773 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008774 if (Args.hasArg(options::OPT_shared))
8775 CmdArgs.push_back("-Bshareable");
8776 else {
8777 CmdArgs.push_back("-dynamic-linker");
8778 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8779 }
John McCall65b8da02013-04-11 22:55:55 +00008780 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008781 }
8782
8783 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8784 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008785 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008786 CmdArgs.push_back("-m");
8787 CmdArgs.push_back("elf_i386");
8788 }
8789
Daniel Dunbarb440f562010-08-02 02:38:21 +00008790 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008791 CmdArgs.push_back("-o");
8792 CmdArgs.push_back(Output.getFilename());
8793 } else {
8794 assert(Output.isNothing() && "Invalid output.");
8795 }
8796
8797 if (!Args.hasArg(options::OPT_nostdlib) &&
8798 !Args.hasArg(options::OPT_nostartfiles)) {
8799 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008800 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008801 CmdArgs.push_back(
8802 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008803 else {
8804 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008805 CmdArgs.push_back(
8806 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008807 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008808 CmdArgs.push_back(
8809 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008810 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008811 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008812 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008813 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008814 CmdArgs.push_back(
8815 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008816 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008817 CmdArgs.push_back(
8818 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008819 }
8820
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008821 Args.AddAllArgs(CmdArgs,
8822 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008823
Daniel Dunbar54423b22010-09-17 00:24:54 +00008824 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008825
8826 if (!Args.hasArg(options::OPT_nostdlib) &&
8827 !Args.hasArg(options::OPT_nodefaultlibs)) {
8828 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8829 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008830 if (UseGCC47)
8831 CmdArgs.push_back("-L/usr/lib/gcc47");
8832 else
8833 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008834
8835 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008836 if (UseGCC47) {
8837 CmdArgs.push_back("-rpath");
8838 CmdArgs.push_back("/usr/lib/gcc47");
8839 } else {
8840 CmdArgs.push_back("-rpath");
8841 CmdArgs.push_back("/usr/lib/gcc44");
8842 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008843 }
8844
Hans Wennborg70850d82013-07-18 20:29:38 +00008845 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008846 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008847 CmdArgs.push_back("-lm");
8848 }
8849
Daniel Dunbarcc912342009-05-02 18:28:39 +00008850 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008851 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008852
8853 if (!Args.hasArg(options::OPT_nolibc)) {
8854 CmdArgs.push_back("-lc");
8855 }
8856
John McCall65b8da02013-04-11 22:55:55 +00008857 if (UseGCC47) {
8858 if (Args.hasArg(options::OPT_static) ||
8859 Args.hasArg(options::OPT_static_libgcc)) {
8860 CmdArgs.push_back("-lgcc");
8861 CmdArgs.push_back("-lgcc_eh");
8862 } else {
8863 if (Args.hasArg(options::OPT_shared_libgcc)) {
8864 CmdArgs.push_back("-lgcc_pic");
8865 if (!Args.hasArg(options::OPT_shared))
8866 CmdArgs.push_back("-lgcc");
8867 } else {
8868 CmdArgs.push_back("-lgcc");
8869 CmdArgs.push_back("--as-needed");
8870 CmdArgs.push_back("-lgcc_pic");
8871 CmdArgs.push_back("--no-as-needed");
8872 }
8873 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008874 } else {
John McCall65b8da02013-04-11 22:55:55 +00008875 if (Args.hasArg(options::OPT_shared)) {
8876 CmdArgs.push_back("-lgcc_pic");
8877 } else {
8878 CmdArgs.push_back("-lgcc");
8879 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008880 }
8881 }
8882
8883 if (!Args.hasArg(options::OPT_nostdlib) &&
8884 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008885 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008886 CmdArgs.push_back(
8887 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008888 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008889 CmdArgs.push_back(
8890 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8891 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008892 }
8893
Alexey Samsonov7811d192014-02-20 13:57:37 +00008894 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008895
Logan Chieneb9162f2014-06-26 14:23:45 +00008896 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008897 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008898}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008899
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008900// Try to find Exe from a Visual Studio distribution. This first tries to find
8901// an installed copy of Visual Studio and, failing that, looks in the PATH,
8902// making sure that whatever executable that's found is not a same-named exe
8903// from clang itself to prevent clang from falling back to itself.
8904static std::string FindVisualStudioExecutable(const ToolChain &TC,
8905 const char *Exe,
8906 const char *ClangProgramPath) {
8907 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8908 std::string visualStudioBinDir;
8909 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8910 visualStudioBinDir)) {
8911 SmallString<128> FilePath(visualStudioBinDir);
8912 llvm::sys::path::append(FilePath, Exe);
8913 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8914 return FilePath.str();
8915 }
8916
8917 return Exe;
8918}
8919
Douglas Katzman95354292015-06-23 20:42:09 +00008920void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8921 const InputInfo &Output,
8922 const InputInfoList &Inputs,
8923 const ArgList &Args,
8924 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008925 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008926 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008927
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008928 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8929 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008930 CmdArgs.push_back(
8931 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008932
8933 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008934 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008935 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008936
Zachary Turner10d75b22014-10-22 20:40:43 +00008937 if (!llvm::sys::Process::GetEnv("LIB")) {
8938 // If the VC environment hasn't been configured (perhaps because the user
8939 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008940 // the environment variable is set however, assume the user knows what
8941 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008942 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008943 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008944 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8945 SmallString<128> LibDir(VisualStudioDir);
8946 llvm::sys::path::append(LibDir, "VC", "lib");
8947 switch (MSVC.getArch()) {
8948 case llvm::Triple::x86:
8949 // x86 just puts the libraries directly in lib
8950 break;
8951 case llvm::Triple::x86_64:
8952 llvm::sys::path::append(LibDir, "amd64");
8953 break;
8954 case llvm::Triple::arm:
8955 llvm::sys::path::append(LibDir, "arm");
8956 break;
8957 default:
8958 break;
8959 }
8960 CmdArgs.push_back(
8961 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008962
8963 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8964 std::string UniversalCRTLibPath;
8965 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8966 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8967 UniversalCRTLibPath.c_str()));
8968 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008969 }
8970
8971 std::string WindowsSdkLibPath;
8972 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8973 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8974 WindowsSdkLibPath.c_str()));
8975 }
8976
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008977 CmdArgs.push_back("-nologo");
8978
Reid Kleckner124955a2015-08-05 18:51:13 +00008979 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008980 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008982 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008983 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008984 if (DLL) {
8985 CmdArgs.push_back(Args.MakeArgString("-dll"));
8986
8987 SmallString<128> ImplibName(Output.getFilename());
8988 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008989 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008990 }
8991
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008992 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008993 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008994 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008995 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008996 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008997 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008998 };
8999 for (const auto &Component : CompilerRTComponents)
9000 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009001 // Make sure the dynamic runtime thunk is not optimized out at link time
9002 // to ensure proper SEH handling.
9003 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009004 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009005 CmdArgs.push_back(
9006 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009007 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009008 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009009 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00009010 };
9011 for (const auto &Component : CompilerRTComponents)
9012 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009013 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009014 }
9015
Hans Wennborg2e274592013-08-13 23:38:57 +00009016 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009017
Alexey Bataevc7e84352015-08-19 04:49:01 +00009018 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9019 options::OPT_fno_openmp, false)) {
9020 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9021 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9022 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9023 TC.getDriver().Dir + "/../lib"));
9024 switch (getOpenMPRuntime(getToolChain(), Args)) {
9025 case OMPRT_OMP:
9026 CmdArgs.push_back("-defaultlib:libomp.lib");
9027 break;
9028 case OMPRT_IOMP5:
9029 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9030 break;
9031 case OMPRT_GOMP:
9032 break;
9033 case OMPRT_Unknown:
9034 // Already diagnosed.
9035 break;
9036 }
9037 }
9038
Reid Kleckner337188f2014-09-16 19:22:00 +00009039 // Add filenames, libraries, and other linker inputs.
9040 for (const auto &Input : Inputs) {
9041 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009042 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009043 continue;
9044 }
9045
9046 const Arg &A = Input.getInputArg();
9047
9048 // Render -l options differently for the MSVC linker.
9049 if (A.getOption().matches(options::OPT_l)) {
9050 StringRef Lib = A.getValue();
9051 const char *LinkLibArg;
9052 if (Lib.endswith(".lib"))
9053 LinkLibArg = Args.MakeArgString(Lib);
9054 else
9055 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9056 CmdArgs.push_back(LinkLibArg);
9057 continue;
9058 }
9059
9060 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9061 // or -L. Render it, even if MSVC doesn't understand it.
9062 A.renderAsInput(Args, CmdArgs);
9063 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009064
Zachary Turner719f58c2014-12-01 23:06:47 +00009065 // We need to special case some linker paths. In the case of lld, we need to
9066 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9067 // linker, we need to use a special search algorithm.
9068 llvm::SmallString<128> linkPath;
9069 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9070 if (Linker.equals_lower("lld"))
9071 Linker = "lld-link";
9072
9073 if (Linker.equals_lower("link")) {
9074 // If we're using the MSVC linker, it's not sufficient to just use link
9075 // from the program PATH, because other environments like GnuWin32 install
9076 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009077 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009078 C.getDriver().getClangProgramPath());
9079 } else {
9080 linkPath = Linker;
9081 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009082 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009083 }
9084
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009085 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009086 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009087}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009088
Douglas Katzman95354292015-06-23 20:42:09 +00009089void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9090 const InputInfo &Output,
9091 const InputInfoList &Inputs,
9092 const ArgList &Args,
9093 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009094 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9095}
9096
Douglas Katzman95354292015-06-23 20:42:09 +00009097std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009098 Compilation &C, const JobAction &JA, const InputInfo &Output,
9099 const InputInfoList &Inputs, const ArgList &Args,
9100 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009101 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009102 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009103 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009104 CmdArgs.push_back("/W0"); // No warnings.
9105
9106 // The goal is to be able to invoke this tool correctly based on
9107 // any flag accepted by clang-cl.
9108
9109 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009110 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009111
9112 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009113 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9114 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9115 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009116 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9117 if (A->getOption().getID() == options::OPT_O0) {
9118 CmdArgs.push_back("/Od");
9119 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009120 CmdArgs.push_back("/Og");
9121
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009122 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009123 if (OptLevel == "s" || OptLevel == "z")
9124 CmdArgs.push_back("/Os");
9125 else
9126 CmdArgs.push_back("/Ot");
9127
9128 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009129 }
9130 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009131 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9132 options::OPT_fno_omit_frame_pointer))
9133 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9134 ? "/Oy"
9135 : "/Oy-");
9136 if (!Args.hasArg(options::OPT_fwritable_strings))
9137 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009138
Nico Weber3f8dafb2015-03-12 19:37:10 +00009139 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009140 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9141
David Majnemerf6072342014-07-01 22:24:56 +00009142 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9143 /*default=*/false))
9144 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009145 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9146 options::OPT_fno_function_sections))
9147 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9148 ? "/Gy"
9149 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009150 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9151 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009152 CmdArgs.push_back(
9153 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009154 if (Args.hasArg(options::OPT_fsyntax_only))
9155 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009156 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9157 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009158 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009159
Nico Weber3f8dafb2015-03-12 19:37:10 +00009160 std::vector<std::string> Includes =
9161 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009162 for (const auto &Include : Includes)
9163 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009164
Hans Wennborg87cfa712013-09-19 20:32:16 +00009165 // Flags that can simply be passed through.
9166 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9167 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009168 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009169 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009170
9171 // The order of these flags is relevant, so pick the last one.
9172 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9173 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9174 A->render(Args, CmdArgs);
9175
Hans Wennborg87cfa712013-09-19 20:32:16 +00009176 // Input filename.
9177 assert(Inputs.size() == 1);
9178 const InputInfo &II = Inputs[0];
9179 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9180 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9181 if (II.isFilename())
9182 CmdArgs.push_back(II.getFilename());
9183 else
9184 II.getInputArg().renderAsInput(Args, CmdArgs);
9185
9186 // Output filename.
9187 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009188 const char *Fo =
9189 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009190 CmdArgs.push_back(Fo);
9191
Hans Wennborg188382e2013-09-20 18:16:35 +00009192 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009193 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9194 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009195 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009196 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009197}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009198
Yaron Keren1c0070c2015-07-02 04:45:27 +00009199/// MinGW Tools
9200void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9201 const InputInfo &Output,
9202 const InputInfoList &Inputs,
9203 const ArgList &Args,
9204 const char *LinkingOutput) const {
9205 claimNoWarnArgs(Args);
9206 ArgStringList CmdArgs;
9207
9208 if (getToolChain().getArch() == llvm::Triple::x86) {
9209 CmdArgs.push_back("--32");
9210 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9211 CmdArgs.push_back("--64");
9212 }
9213
9214 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9215
9216 CmdArgs.push_back("-o");
9217 CmdArgs.push_back(Output.getFilename());
9218
9219 for (const auto &II : Inputs)
9220 CmdArgs.push_back(II.getFilename());
9221
9222 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009223 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009224
9225 if (Args.hasArg(options::OPT_gsplit_dwarf))
9226 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9227 SplitDebugName(Args, Inputs[0]));
9228}
9229
9230void MinGW::Linker::AddLibGCC(const ArgList &Args,
9231 ArgStringList &CmdArgs) const {
9232 if (Args.hasArg(options::OPT_mthreads))
9233 CmdArgs.push_back("-lmingwthrd");
9234 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009235
Yaron Kerenaa281332015-08-09 00:24:07 +00009236 // Make use of compiler-rt if --rtlib option is used
9237 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9238 if (RLT == ToolChain::RLT_Libgcc) {
9239 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9240 Args.hasArg(options::OPT_static);
9241 bool Shared = Args.hasArg(options::OPT_shared);
9242 bool CXX = getToolChain().getDriver().CCCIsCXX();
9243
9244 if (Static || (!CXX && !Shared)) {
9245 CmdArgs.push_back("-lgcc");
9246 CmdArgs.push_back("-lgcc_eh");
9247 } else {
9248 CmdArgs.push_back("-lgcc_s");
9249 CmdArgs.push_back("-lgcc");
9250 }
9251 } else {
9252 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9253 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009254
Yaron Keren1c0070c2015-07-02 04:45:27 +00009255 CmdArgs.push_back("-lmoldname");
9256 CmdArgs.push_back("-lmingwex");
9257 CmdArgs.push_back("-lmsvcrt");
9258}
9259
9260void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9261 const InputInfo &Output,
9262 const InputInfoList &Inputs,
9263 const ArgList &Args,
9264 const char *LinkingOutput) const {
9265 const ToolChain &TC = getToolChain();
9266 const Driver &D = TC.getDriver();
9267 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9268
9269 ArgStringList CmdArgs;
9270
9271 // Silence warning for "clang -g foo.o -o foo"
9272 Args.ClaimAllArgs(options::OPT_g_Group);
9273 // and "clang -emit-llvm foo.o -o foo"
9274 Args.ClaimAllArgs(options::OPT_emit_llvm);
9275 // and for "clang -w foo.o -o foo". Other warning options are already
9276 // handled somewhere else.
9277 Args.ClaimAllArgs(options::OPT_w);
9278
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009279 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9280 if (LinkerName.equals_lower("lld")) {
9281 CmdArgs.push_back("-flavor");
9282 CmdArgs.push_back("gnu");
9283 }
9284
Yaron Keren1c0070c2015-07-02 04:45:27 +00009285 if (!D.SysRoot.empty())
9286 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9287
9288 if (Args.hasArg(options::OPT_s))
9289 CmdArgs.push_back("-s");
9290
9291 CmdArgs.push_back("-m");
9292 if (TC.getArch() == llvm::Triple::x86)
9293 CmdArgs.push_back("i386pe");
9294 if (TC.getArch() == llvm::Triple::x86_64)
9295 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009296 if (TC.getArch() == llvm::Triple::arm)
9297 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009298
9299 if (Args.hasArg(options::OPT_mwindows)) {
9300 CmdArgs.push_back("--subsystem");
9301 CmdArgs.push_back("windows");
9302 } else if (Args.hasArg(options::OPT_mconsole)) {
9303 CmdArgs.push_back("--subsystem");
9304 CmdArgs.push_back("console");
9305 }
9306
9307 if (Args.hasArg(options::OPT_static))
9308 CmdArgs.push_back("-Bstatic");
9309 else {
9310 if (Args.hasArg(options::OPT_mdll))
9311 CmdArgs.push_back("--dll");
9312 else if (Args.hasArg(options::OPT_shared))
9313 CmdArgs.push_back("--shared");
9314 CmdArgs.push_back("-Bdynamic");
9315 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9316 CmdArgs.push_back("-e");
9317 if (TC.getArch() == llvm::Triple::x86)
9318 CmdArgs.push_back("_DllMainCRTStartup@12");
9319 else
9320 CmdArgs.push_back("DllMainCRTStartup");
9321 CmdArgs.push_back("--enable-auto-image-base");
9322 }
9323 }
9324
9325 CmdArgs.push_back("-o");
9326 CmdArgs.push_back(Output.getFilename());
9327
9328 Args.AddAllArgs(CmdArgs, options::OPT_e);
9329 // FIXME: add -N, -n flags
9330 Args.AddLastArg(CmdArgs, options::OPT_r);
9331 Args.AddLastArg(CmdArgs, options::OPT_s);
9332 Args.AddLastArg(CmdArgs, options::OPT_t);
9333 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9334 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9335
9336 if (!Args.hasArg(options::OPT_nostdlib) &&
9337 !Args.hasArg(options::OPT_nostartfiles)) {
9338 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9339 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9340 } else {
9341 if (Args.hasArg(options::OPT_municode))
9342 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9343 else
9344 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9345 }
9346 if (Args.hasArg(options::OPT_pg))
9347 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9348 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9349 }
9350
9351 Args.AddAllArgs(CmdArgs, options::OPT_L);
9352 const ToolChain::path_list Paths = TC.getFilePaths();
9353 for (const auto &Path : Paths)
9354 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9355
9356 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9357
9358 // TODO: Add ASan stuff here
9359
9360 // TODO: Add profile stuff here
9361
9362 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9363 !Args.hasArg(options::OPT_nodefaultlibs)) {
9364 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9365 !Args.hasArg(options::OPT_static);
9366 if (OnlyLibstdcxxStatic)
9367 CmdArgs.push_back("-Bstatic");
9368 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9369 if (OnlyLibstdcxxStatic)
9370 CmdArgs.push_back("-Bdynamic");
9371 }
9372
9373 if (!Args.hasArg(options::OPT_nostdlib)) {
9374 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9375 if (Args.hasArg(options::OPT_static))
9376 CmdArgs.push_back("--start-group");
9377
9378 if (Args.hasArg(options::OPT_fstack_protector) ||
9379 Args.hasArg(options::OPT_fstack_protector_strong) ||
9380 Args.hasArg(options::OPT_fstack_protector_all)) {
9381 CmdArgs.push_back("-lssp_nonshared");
9382 CmdArgs.push_back("-lssp");
9383 }
9384 if (Args.hasArg(options::OPT_fopenmp))
9385 CmdArgs.push_back("-lgomp");
9386
9387 AddLibGCC(Args, CmdArgs);
9388
9389 if (Args.hasArg(options::OPT_pg))
9390 CmdArgs.push_back("-lgmon");
9391
Yaron Kerenadce68e2015-07-06 18:52:19 +00009392 if (Args.hasArg(options::OPT_pthread))
9393 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009394
9395 // add system libraries
9396 if (Args.hasArg(options::OPT_mwindows)) {
9397 CmdArgs.push_back("-lgdi32");
9398 CmdArgs.push_back("-lcomdlg32");
9399 }
9400 CmdArgs.push_back("-ladvapi32");
9401 CmdArgs.push_back("-lshell32");
9402 CmdArgs.push_back("-luser32");
9403 CmdArgs.push_back("-lkernel32");
9404
9405 if (Args.hasArg(options::OPT_static))
9406 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009407 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009408 AddLibGCC(Args, CmdArgs);
9409 }
9410
9411 if (!Args.hasArg(options::OPT_nostartfiles)) {
9412 // Add crtfastmath.o if available and fast math is enabled.
9413 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9414
9415 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9416 }
9417 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009418 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009419 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009420}
9421
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009422/// XCore Tools
9423// We pass assemble and link construction to the xcc tool.
9424
Douglas Katzman95354292015-06-23 20:42:09 +00009425void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9426 const InputInfo &Output,
9427 const InputInfoList &Inputs,
9428 const ArgList &Args,
9429 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009430 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009431 ArgStringList CmdArgs;
9432
9433 CmdArgs.push_back("-o");
9434 CmdArgs.push_back(Output.getFilename());
9435
9436 CmdArgs.push_back("-c");
9437
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009438 if (Args.hasArg(options::OPT_v))
9439 CmdArgs.push_back("-v");
9440
Robert Lytton894d25c2014-05-02 09:33:25 +00009441 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9442 if (!A->getOption().matches(options::OPT_g0))
9443 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009444
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009445 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9446 false))
9447 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009449 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009450
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009451 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009452 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009453
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009454 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009455 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009456}
9457
Douglas Katzman95354292015-06-23 20:42:09 +00009458void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9459 const InputInfo &Output,
9460 const InputInfoList &Inputs,
9461 const ArgList &Args,
9462 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009463 ArgStringList CmdArgs;
9464
9465 if (Output.isFilename()) {
9466 CmdArgs.push_back("-o");
9467 CmdArgs.push_back(Output.getFilename());
9468 } else {
9469 assert(Output.isNothing() && "Invalid output.");
9470 }
9471
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009472 if (Args.hasArg(options::OPT_v))
9473 CmdArgs.push_back("-v");
9474
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009475 // Pass -fexceptions through to the linker if it was present.
9476 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9477 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009478 CmdArgs.push_back("-fexceptions");
9479
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009480 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9481
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009482 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009483 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009484}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009485
Douglas Katzman95354292015-06-23 20:42:09 +00009486void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9487 const InputInfo &Output,
9488 const InputInfoList &Inputs,
9489 const ArgList &Args,
9490 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009491 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009492 const auto &TC =
9493 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9494 ArgStringList CmdArgs;
9495 const char *Exec;
9496
9497 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009498 default:
9499 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009500 case llvm::Triple::arm:
9501 case llvm::Triple::thumb:
9502 break;
9503 case llvm::Triple::x86:
9504 CmdArgs.push_back("--32");
9505 break;
9506 case llvm::Triple::x86_64:
9507 CmdArgs.push_back("--64");
9508 break;
9509 }
9510
9511 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9512
9513 CmdArgs.push_back("-o");
9514 CmdArgs.push_back(Output.getFilename());
9515
9516 for (const auto &Input : Inputs)
9517 CmdArgs.push_back(Input.getFilename());
9518
9519 const std::string Assembler = TC.GetProgramPath("as");
9520 Exec = Args.MakeArgString(Assembler);
9521
Justin Bognerd3371d82015-07-17 03:35:54 +00009522 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009523}
9524
Douglas Katzman95354292015-06-23 20:42:09 +00009525void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9526 const InputInfo &Output,
9527 const InputInfoList &Inputs,
9528 const ArgList &Args,
9529 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009530 const auto &TC =
9531 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9532 const llvm::Triple &T = TC.getTriple();
9533 const Driver &D = TC.getDriver();
9534 SmallString<128> EntryPoint;
9535 ArgStringList CmdArgs;
9536 const char *Exec;
9537
9538 // Silence warning for "clang -g foo.o -o foo"
9539 Args.ClaimAllArgs(options::OPT_g_Group);
9540 // and "clang -emit-llvm foo.o -o foo"
9541 Args.ClaimAllArgs(options::OPT_emit_llvm);
9542 // and for "clang -w foo.o -o foo"
9543 Args.ClaimAllArgs(options::OPT_w);
9544 // Other warning options are already handled somewhere else.
9545
9546 if (!D.SysRoot.empty())
9547 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9548
9549 if (Args.hasArg(options::OPT_pie))
9550 CmdArgs.push_back("-pie");
9551 if (Args.hasArg(options::OPT_rdynamic))
9552 CmdArgs.push_back("-export-dynamic");
9553 if (Args.hasArg(options::OPT_s))
9554 CmdArgs.push_back("--strip-all");
9555
9556 CmdArgs.push_back("-m");
9557 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009558 default:
9559 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009560 case llvm::Triple::arm:
9561 case llvm::Triple::thumb:
9562 // FIXME: this is incorrect for WinCE
9563 CmdArgs.push_back("thumb2pe");
9564 break;
9565 case llvm::Triple::x86:
9566 CmdArgs.push_back("i386pe");
9567 EntryPoint.append("_");
9568 break;
9569 case llvm::Triple::x86_64:
9570 CmdArgs.push_back("i386pep");
9571 break;
9572 }
9573
9574 if (Args.hasArg(options::OPT_shared)) {
9575 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009576 default:
9577 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009578 case llvm::Triple::arm:
9579 case llvm::Triple::thumb:
9580 case llvm::Triple::x86_64:
9581 EntryPoint.append("_DllMainCRTStartup");
9582 break;
9583 case llvm::Triple::x86:
9584 EntryPoint.append("_DllMainCRTStartup@12");
9585 break;
9586 }
9587
9588 CmdArgs.push_back("-shared");
9589 CmdArgs.push_back("-Bdynamic");
9590
9591 CmdArgs.push_back("--enable-auto-image-base");
9592
9593 CmdArgs.push_back("--entry");
9594 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9595 } else {
9596 EntryPoint.append("mainCRTStartup");
9597
9598 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9599 : "-Bdynamic");
9600
9601 if (!Args.hasArg(options::OPT_nostdlib) &&
9602 !Args.hasArg(options::OPT_nostartfiles)) {
9603 CmdArgs.push_back("--entry");
9604 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9605 }
9606
9607 // FIXME: handle subsystem
9608 }
9609
9610 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009611 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009612
9613 CmdArgs.push_back("-o");
9614 CmdArgs.push_back(Output.getFilename());
9615
9616 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9617 SmallString<261> ImpLib(Output.getFilename());
9618 llvm::sys::path::replace_extension(ImpLib, ".lib");
9619
9620 CmdArgs.push_back("--out-implib");
9621 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9622 }
9623
9624 if (!Args.hasArg(options::OPT_nostdlib) &&
9625 !Args.hasArg(options::OPT_nostartfiles)) {
9626 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9627 const char *CRTBegin;
9628
9629 CRTBegin =
9630 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9631 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9632 }
9633
9634 Args.AddAllArgs(CmdArgs, options::OPT_L);
9635
9636 const auto &Paths = TC.getFilePaths();
9637 for (const auto &Path : Paths)
9638 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9639
9640 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9641
9642 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9643 !Args.hasArg(options::OPT_nodefaultlibs)) {
9644 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9645 !Args.hasArg(options::OPT_static);
9646 if (StaticCXX)
9647 CmdArgs.push_back("-Bstatic");
9648 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9649 if (StaticCXX)
9650 CmdArgs.push_back("-Bdynamic");
9651 }
9652
9653 if (!Args.hasArg(options::OPT_nostdlib)) {
9654 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9655 // TODO handle /MT[d] /MD[d]
9656 CmdArgs.push_back("-lmsvcrt");
9657 AddRunTimeLibs(TC, D, CmdArgs, Args);
9658 }
9659 }
9660
9661 const std::string Linker = TC.GetProgramPath("ld");
9662 Exec = Args.MakeArgString(Linker);
9663
Justin Bognerd3371d82015-07-17 03:35:54 +00009664 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009665}
Douglas Katzman84a75642015-06-19 14:55:19 +00009666
Douglas Katzman95354292015-06-23 20:42:09 +00009667void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9668 const InputInfo &Output,
9669 const InputInfoList &Inputs,
9670 const ArgList &Args,
9671 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009672
9673 ArgStringList CmdArgs;
9674
9675 assert(Inputs.size() == 1);
9676 const InputInfo &II = Inputs[0];
9677 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9678 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9679
Douglas Katzman84a75642015-06-19 14:55:19 +00009680 CmdArgs.push_back("-DMYRIAD2");
9681 CmdArgs.push_back("-mcpu=myriad2");
9682 CmdArgs.push_back("-S");
9683
Douglas Katzmanf6071112015-08-03 14:34:22 +00009684 // Append all -I, -iquote, -isystem paths, defines/undefines,
9685 // 'f' flags, optimize flags, and warning options.
9686 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009687 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9688 options::OPT_D, options::OPT_U,
9689 options::OPT_f_Group, options::OPT_f_clang_Group,
9690 options::OPT_g_Group, options::OPT_M_Group,
9691 options::OPT_O_Group, options::OPT_W_Group});
9692
9693 // If we're producing a dependency file, and assembly is the final action,
9694 // then the name of the target in the dependency file should be the '.o'
9695 // file, not the '.s' file produced by this step. For example, instead of
9696 // /tmp/mumble.s: mumble.c .../someheader.h
9697 // the filename on the lefthand side should be "mumble.o"
9698 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9699 C.getActions().size() == 1 &&
9700 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9701 Arg *A = Args.getLastArg(options::OPT_o);
9702 if (A) {
9703 CmdArgs.push_back("-MT");
9704 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9705 }
9706 }
9707
Douglas Katzman84a75642015-06-19 14:55:19 +00009708 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9709
9710 CmdArgs.push_back(II.getFilename());
9711 CmdArgs.push_back("-o");
9712 CmdArgs.push_back(Output.getFilename());
9713
9714 std::string Exec =
9715 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009716 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9717 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009718}
9719
Douglas Katzman95354292015-06-23 20:42:09 +00009720void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9721 const InputInfo &Output,
9722 const InputInfoList &Inputs,
9723 const ArgList &Args,
9724 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009725 ArgStringList CmdArgs;
9726
9727 assert(Inputs.size() == 1);
9728 const InputInfo &II = Inputs[0];
9729 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9730 assert(Output.getType() == types::TY_Object);
9731
9732 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009733 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009734 CmdArgs.push_back("-noSPrefixing");
9735 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009736 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9737 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9738 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009739 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009740 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009741 }
9742 CmdArgs.push_back("-elf"); // Output format.
9743 CmdArgs.push_back(II.getFilename());
9744 CmdArgs.push_back(
9745 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9746
9747 std::string Exec =
9748 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009749 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9750 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009751}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009752
9753void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9754 const InputInfo &Output,
9755 const InputInfoList &Inputs,
9756 const ArgList &Args,
9757 const char *LinkingOutput) const {
9758 const auto &TC =
9759 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9760 const llvm::Triple &T = TC.getTriple();
9761 ArgStringList CmdArgs;
9762 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
9763
9764 std::string StartFilesDir, BuiltinLibDir;
9765 TC.getCompilerSupportDir(StartFilesDir);
9766 TC.getBuiltinLibDir(BuiltinLibDir);
9767
9768 if (T.getArch() == llvm::Triple::sparc)
9769 CmdArgs.push_back("-EB");
9770 else // SHAVE assumes little-endian, and sparcel is expressly so.
9771 CmdArgs.push_back("-EL");
9772
9773 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9774 // but we never pass through a --sysroot option and various other bits.
9775 // For example, there are no sanitizers (yet) nor gold linker.
9776
9777 // Eat some arguments that may be present but have no effect.
9778 Args.ClaimAllArgs(options::OPT_g_Group);
9779 Args.ClaimAllArgs(options::OPT_w);
9780 Args.ClaimAllArgs(options::OPT_static_libgcc);
9781
9782 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9783 CmdArgs.push_back("-s");
9784
9785 CmdArgs.push_back("-o");
9786 CmdArgs.push_back(Output.getFilename());
9787
9788 if (UseStartfiles) {
9789 // If you want startfiles, it means you want the builtin crti and crtbegin,
9790 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9791 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9792 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9793 }
9794
9795 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9796 options::OPT_e, options::OPT_s, options::OPT_t,
9797 options::OPT_Z_Flag, options::OPT_r});
9798
9799 // The linker doesn't use these builtin paths unless directed to,
9800 // because it was not compiled for support with sysroots, nor does
9801 // it have a default of little-endian with FPU.
9802 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9803 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
9804
9805 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9806
9807 if (T.getOS() == llvm::Triple::RTEMS) {
9808 CmdArgs.push_back("--start-group");
9809 CmdArgs.push_back("-lc");
9810 // You must provide your own "-L" option to enable finding these.
9811 CmdArgs.push_back("-lrtemscpu");
9812 CmdArgs.push_back("-lrtemsbsp");
9813 CmdArgs.push_back("--end-group");
9814 } else {
9815 CmdArgs.push_back("-lc");
9816 }
9817 if (C.getDriver().CCCIsCXX())
9818 CmdArgs.push_back("-lstdc++");
9819 CmdArgs.push_back("-lgcc");
9820 if (UseStartfiles) {
9821 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9822 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9823 }
9824
9825 std::string Exec =
9826 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9827 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9828 CmdArgs, Inputs));
9829}