blob: f3d67b5111286461e78f58058510c963babdecdc [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
Benjamin Kramer72e64312015-09-24 14:48:49 +00001938 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00001939 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
Benjamin Kramer72e64312015-09-24 14:48:49 +00002347 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002348 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
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002405static const char *getCompilerRTArgString(const ToolChain &TC,
2406 const llvm::opt::ArgList &Args,
2407 StringRef Component,
2408 bool Shared = false) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002409 return Args.MakeArgString(TC.getCompilerRT(Args, Component, Shared));
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002410}
2411
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002412// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002413// FIXME: Make sure we can also emit shared objects if they're requested
2414// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002415static void addClangRT(const ToolChain &TC, const ArgList &Args,
2416 ArgStringList &CmdArgs) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002417 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "builtins"));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002418}
2419
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002420static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2421 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002422 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2423 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002424 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002425 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002426 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002427 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002428 Args.hasArg(options::OPT_fcreate_profile) ||
2429 Args.hasArg(options::OPT_coverage)))
2430 return;
2431
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002432 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "profile"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002433}
2434
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002435namespace {
2436enum OpenMPRuntimeKind {
2437 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2438 /// without knowing what runtime to target.
2439 OMPRT_Unknown,
2440
2441 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2442 /// the default for Clang.
2443 OMPRT_OMP,
2444
2445 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2446 /// this runtime but can swallow the pragmas, and find and link against the
2447 /// runtime library itself.
2448 OMPRT_GOMP,
2449
Chandler Carruthc6625c62015-05-28 21:10:31 +00002450 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002451 /// OpenMP runtime. We support this mode for users with existing dependencies
2452 /// on this runtime library name.
2453 OMPRT_IOMP5
2454};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002455}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002456
2457/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002458static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2459 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002460 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2461
2462 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2463 if (A)
2464 RuntimeName = A->getValue();
2465
2466 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002467 .Case("libomp", OMPRT_OMP)
2468 .Case("libgomp", OMPRT_GOMP)
2469 .Case("libiomp5", OMPRT_IOMP5)
2470 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002471
2472 if (RT == OMPRT_Unknown) {
2473 if (A)
2474 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002476 else
2477 // FIXME: We could use a nicer diagnostic here.
2478 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2479 }
2480
2481 return RT;
2482}
2483
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002484static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2485 const ArgList &Args) {
2486 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2487 options::OPT_fno_openmp, false))
2488 return;
2489
2490 switch (getOpenMPRuntime(TC, Args)) {
2491 case OMPRT_OMP:
2492 CmdArgs.push_back("-lomp");
2493 break;
2494 case OMPRT_GOMP:
2495 CmdArgs.push_back("-lgomp");
2496 break;
2497 case OMPRT_IOMP5:
2498 CmdArgs.push_back("-liomp5");
2499 break;
2500 case OMPRT_Unknown:
2501 // Already diagnosed.
2502 break;
2503 }
2504}
2505
Alexey Samsonov52550342014-09-15 19:58:40 +00002506static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2507 ArgStringList &CmdArgs, StringRef Sanitizer,
2508 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002509 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002510 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002511 if (!IsShared)
2512 CmdArgs.push_back("-whole-archive");
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00002513 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Sanitizer, IsShared));
Alexey Samsonov52550342014-09-15 19:58:40 +00002514 if (!IsShared)
2515 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002516}
2517
Alexey Samsonov52550342014-09-15 19:58:40 +00002518// Tries to use a file with the list of dynamic symbols that need to be exported
2519// from the runtime library. Returns true if the file was found.
2520static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2521 ArgStringList &CmdArgs,
2522 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002523 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002524 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2525 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002526 return true;
2527 }
2528 return false;
2529}
2530
2531static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2532 ArgStringList &CmdArgs) {
2533 // Force linking against the system libraries sanitizers depends on
2534 // (see PR15823 why this is necessary).
2535 CmdArgs.push_back("--no-as-needed");
2536 CmdArgs.push_back("-lpthread");
2537 CmdArgs.push_back("-lrt");
2538 CmdArgs.push_back("-lm");
2539 // There's no libdl on FreeBSD.
2540 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2541 CmdArgs.push_back("-ldl");
2542}
2543
2544static void
2545collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2546 SmallVectorImpl<StringRef> &SharedRuntimes,
2547 SmallVectorImpl<StringRef> &StaticRuntimes,
2548 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2549 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2550 // Collect shared runtimes.
2551 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2552 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002553 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002554
Alexey Samsonov52550342014-09-15 19:58:40 +00002555 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002556 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002557 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2558 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002559 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002560 }
2561 if (SanArgs.needsAsanRt()) {
2562 if (SanArgs.needsSharedAsanRt()) {
2563 HelperStaticRuntimes.push_back("asan-preinit");
2564 } else {
2565 StaticRuntimes.push_back("asan");
2566 if (SanArgs.linkCXXRuntimes())
2567 StaticRuntimes.push_back("asan_cxx");
2568 }
2569 }
2570 if (SanArgs.needsDfsanRt())
2571 StaticRuntimes.push_back("dfsan");
2572 if (SanArgs.needsLsanRt())
2573 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002574 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002575 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002576 if (SanArgs.linkCXXRuntimes())
2577 StaticRuntimes.push_back("msan_cxx");
2578 }
2579 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002580 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002581 if (SanArgs.linkCXXRuntimes())
2582 StaticRuntimes.push_back("tsan_cxx");
2583 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002584 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002585 StaticRuntimes.push_back("ubsan_standalone");
2586 if (SanArgs.linkCXXRuntimes())
2587 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002588 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002589 if (SanArgs.needsSafeStackRt())
2590 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002591}
2592
Alexey Samsonov52550342014-09-15 19:58:40 +00002593// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2594// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2595static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002596 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2598 HelperStaticRuntimes;
2599 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2600 HelperStaticRuntimes);
2601 for (auto RT : SharedRuntimes)
2602 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2603 for (auto RT : HelperStaticRuntimes)
2604 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2605 bool AddExportDynamic = false;
2606 for (auto RT : StaticRuntimes) {
2607 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2608 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2609 }
2610 // If there is a static runtime with no dynamic list, force all the symbols
2611 // to be dynamic to be sure we export sanitizer interface functions.
2612 if (AddExportDynamic)
2613 CmdArgs.push_back("-export-dynamic");
2614 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002615}
2616
Reid Kleckner86ea7702015-02-04 23:45:07 +00002617static bool areOptimizationsEnabled(const ArgList &Args) {
2618 // Find the last -O arg and see if it is non-zero.
2619 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2620 return !A->getOption().matches(options::OPT_O0);
2621 // Defaults to -O0.
2622 return false;
2623}
2624
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002625static bool shouldUseFramePointerForTarget(const ArgList &Args,
2626 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002627 switch (Triple.getArch()) {
2628 case llvm::Triple::xcore:
2629 case llvm::Triple::wasm32:
2630 case llvm::Triple::wasm64:
2631 // XCore never wants frame pointers, regardless of OS.
2632 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002633 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002634 default:
2635 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002636 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002637
2638 if (Triple.isOSLinux()) {
2639 switch (Triple.getArch()) {
2640 // Don't use a frame pointer on linux if optimizing for certain targets.
2641 case llvm::Triple::mips64:
2642 case llvm::Triple::mips64el:
2643 case llvm::Triple::mips:
2644 case llvm::Triple::mipsel:
2645 case llvm::Triple::systemz:
2646 case llvm::Triple::x86:
2647 case llvm::Triple::x86_64:
2648 return !areOptimizationsEnabled(Args);
2649 default:
2650 return true;
2651 }
2652 }
2653
2654 if (Triple.isOSWindows()) {
2655 switch (Triple.getArch()) {
2656 case llvm::Triple::x86:
2657 return !areOptimizationsEnabled(Args);
2658 default:
2659 // All other supported Windows ISAs use xdata unwind information, so frame
2660 // pointers are not generally useful.
2661 return false;
2662 }
2663 }
2664
2665 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002666}
2667
Rafael Espindola224dd632011-12-14 21:02:23 +00002668static bool shouldUseFramePointer(const ArgList &Args,
2669 const llvm::Triple &Triple) {
2670 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2671 options::OPT_fomit_frame_pointer))
2672 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2673
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002674 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002675}
2676
Eric Christopherb7d97e92013-04-03 01:58:53 +00002677static bool shouldUseLeafFramePointer(const ArgList &Args,
2678 const llvm::Triple &Triple) {
2679 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2680 options::OPT_momit_leaf_frame_pointer))
2681 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2682
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002683 if (Triple.isPS4CPU())
2684 return false;
2685
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002686 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002687}
2688
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002689/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002690static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002691 SmallString<128> cwd;
2692 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002693 CmdArgs.push_back("-fdebug-compilation-dir");
2694 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002695 }
2696}
2697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002698static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002699 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2700 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2701 SmallString<128> T(FinalOutput->getValue());
2702 llvm::sys::path::replace_extension(T, "dwo");
2703 return Args.MakeArgString(T);
2704 } else {
2705 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002706 SmallString<128> T(
2707 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002708 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002709 llvm::sys::path::replace_extension(F, "dwo");
2710 T += F;
2711 return Args.MakeArgString(F);
2712 }
2713}
2714
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002715static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2716 const JobAction &JA, const ArgList &Args,
2717 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002718 ArgStringList ExtractArgs;
2719 ExtractArgs.push_back("--extract-dwo");
2720
2721 ArgStringList StripArgs;
2722 StripArgs.push_back("--strip-dwo");
2723
2724 // Grabbing the output of the earlier compile step.
2725 StripArgs.push_back(Output.getFilename());
2726 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002727 ExtractArgs.push_back(OutFile);
2728
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002729 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002730 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002731
2732 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002733 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002734
2735 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002736 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002737}
2738
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002739/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002740/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2741static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002742 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002743 if (A->getOption().matches(options::OPT_O4) ||
2744 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002745 return true;
2746
2747 if (A->getOption().matches(options::OPT_O0))
2748 return false;
2749
2750 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2751
Rafael Espindola91780de2013-08-26 14:05:41 +00002752 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002753 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002754 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002755 return true;
2756
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002757 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002759 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002760
2761 unsigned OptLevel = 0;
2762 if (S.getAsInteger(10, OptLevel))
2763 return false;
2764
2765 return OptLevel > 1;
2766 }
2767
2768 return false;
2769}
2770
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002771/// Add -x lang to \p CmdArgs for \p Input.
2772static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2773 ArgStringList &CmdArgs) {
2774 // When using -verify-pch, we don't want to provide the type
2775 // 'precompiled-header' if it was inferred from the file extension
2776 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2777 return;
2778
2779 CmdArgs.push_back("-x");
2780 if (Args.hasArg(options::OPT_rewrite_objc))
2781 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2782 else
2783 CmdArgs.push_back(types::getTypeName(Input.getType()));
2784}
2785
David Majnemerc371ff02015-03-22 08:39:22 +00002786static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002787 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002788 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002789
2790 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002791 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002792
2793 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002794 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002795 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002796 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002797}
2798
Rafael Espindola577637a2015-01-03 00:06:04 +00002799// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002800// options that build systems might add but are unused when assembling or only
2801// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002802static void claimNoWarnArgs(const ArgList &Args) {
2803 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002804 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002805 Args.ClaimAllArgs(options::OPT_flto);
2806 Args.ClaimAllArgs(options::OPT_fno_lto);
2807}
2808
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002809static void appendUserToPath(SmallVectorImpl<char> &Result) {
2810#ifdef LLVM_ON_UNIX
2811 const char *Username = getenv("LOGNAME");
2812#else
2813 const char *Username = getenv("USERNAME");
2814#endif
2815 if (Username) {
2816 // Validate that LoginName can be used in a path, and get its length.
2817 size_t Len = 0;
2818 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002819 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002820 Username = nullptr;
2821 break;
2822 }
2823 }
2824
2825 if (Username && Len > 0) {
2826 Result.append(Username, Username + Len);
2827 return;
2828 }
2829 }
2830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002831// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002832#ifdef LLVM_ON_UNIX
2833 std::string UID = llvm::utostr(getuid());
2834#else
2835 // FIXME: Windows seems to have an 'SID' that might work.
2836 std::string UID = "9999";
2837#endif
2838 Result.append(UID.begin(), UID.end());
2839}
2840
David Majnemere11d3732015-06-08 00:22:46 +00002841VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2842 const llvm::Triple &Triple,
2843 const llvm::opt::ArgList &Args,
2844 bool IsWindowsMSVC) {
2845 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2846 IsWindowsMSVC) ||
2847 Args.hasArg(options::OPT_fmsc_version) ||
2848 Args.hasArg(options::OPT_fms_compatibility_version)) {
2849 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2850 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002851 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002852
2853 if (MSCVersion && MSCompatibilityVersion) {
2854 if (D)
2855 D->Diag(diag::err_drv_argument_not_allowed_with)
2856 << MSCVersion->getAsString(Args)
2857 << MSCompatibilityVersion->getAsString(Args);
2858 return VersionTuple();
2859 }
2860
2861 if (MSCompatibilityVersion) {
2862 VersionTuple MSVT;
2863 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2864 D->Diag(diag::err_drv_invalid_value)
2865 << MSCompatibilityVersion->getAsString(Args)
2866 << MSCompatibilityVersion->getValue();
2867 return MSVT;
2868 }
2869
2870 if (MSCVersion) {
2871 unsigned Version = 0;
2872 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2873 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2874 << MSCVersion->getValue();
2875 return getMSCompatibilityVersion(Version);
2876 }
2877
2878 unsigned Major, Minor, Micro;
2879 Triple.getEnvironmentVersion(Major, Minor, Micro);
2880 if (Major || Minor || Micro)
2881 return VersionTuple(Major, Minor, Micro);
2882
2883 return VersionTuple(18);
2884 }
2885 return VersionTuple();
2886}
2887
Diego Novilloa0545962015-07-10 18:00:07 +00002888static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2889 const InputInfo &Output, const ArgList &Args,
2890 ArgStringList &CmdArgs) {
2891 auto *ProfileGenerateArg = Args.getLastArg(
2892 options::OPT_fprofile_instr_generate,
2893 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002894 options::OPT_fprofile_generate_EQ,
2895 options::OPT_fno_profile_instr_generate);
2896 if (ProfileGenerateArg &&
2897 ProfileGenerateArg->getOption().matches(
2898 options::OPT_fno_profile_instr_generate))
2899 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002900
2901 auto *ProfileUseArg = Args.getLastArg(
2902 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002903 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2904 options::OPT_fno_profile_instr_use);
2905 if (ProfileUseArg &&
2906 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2907 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002908
2909 if (ProfileGenerateArg && ProfileUseArg)
2910 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002911 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002912
Diego Novillo758f3f52015-08-05 21:49:51 +00002913 if (ProfileGenerateArg) {
2914 if (ProfileGenerateArg->getOption().matches(
2915 options::OPT_fprofile_instr_generate_EQ))
2916 ProfileGenerateArg->render(Args, CmdArgs);
2917 else if (ProfileGenerateArg->getOption().matches(
2918 options::OPT_fprofile_generate_EQ)) {
2919 SmallString<128> Path(ProfileGenerateArg->getValue());
2920 llvm::sys::path::append(Path, "default.profraw");
2921 CmdArgs.push_back(
2922 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2923 } else
2924 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2925 }
Diego Novilloa0545962015-07-10 18:00:07 +00002926
Diego Novillo758f3f52015-08-05 21:49:51 +00002927 if (ProfileUseArg) {
2928 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2929 ProfileUseArg->render(Args, CmdArgs);
2930 else if ((ProfileUseArg->getOption().matches(
2931 options::OPT_fprofile_use_EQ) ||
2932 ProfileUseArg->getOption().matches(
2933 options::OPT_fprofile_instr_use))) {
2934 SmallString<128> Path(
2935 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2936 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2937 llvm::sys::path::append(Path, "default.profdata");
2938 CmdArgs.push_back(
2939 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2940 }
Diego Novilloa0545962015-07-10 18:00:07 +00002941 }
2942
2943 if (Args.hasArg(options::OPT_ftest_coverage) ||
2944 Args.hasArg(options::OPT_coverage))
2945 CmdArgs.push_back("-femit-coverage-notes");
2946 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2947 false) ||
2948 Args.hasArg(options::OPT_coverage))
2949 CmdArgs.push_back("-femit-coverage-data");
2950
Diego Novilloc4b94da2015-08-05 23:27:40 +00002951 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2952 options::OPT_fno_coverage_mapping, false) &&
2953 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002954 D.Diag(diag::err_drv_argument_only_allowed_with)
2955 << "-fcoverage-mapping"
2956 << "-fprofile-instr-generate";
2957
Diego Novilloc4b94da2015-08-05 23:27:40 +00002958 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2959 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002960 CmdArgs.push_back("-fcoverage-mapping");
2961
2962 if (C.getArgs().hasArg(options::OPT_c) ||
2963 C.getArgs().hasArg(options::OPT_S)) {
2964 if (Output.isFilename()) {
2965 CmdArgs.push_back("-coverage-file");
2966 SmallString<128> CoverageFilename;
2967 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2968 CoverageFilename = FinalOutput->getValue();
2969 } else {
2970 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2971 }
2972 if (llvm::sys::path::is_relative(CoverageFilename)) {
2973 SmallString<128> Pwd;
2974 if (!llvm::sys::fs::current_path(Pwd)) {
2975 llvm::sys::path::append(Pwd, CoverageFilename);
2976 CoverageFilename.swap(Pwd);
2977 }
2978 }
2979 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2980 }
2981 }
2982}
2983
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002984/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2985/// smooshes them together with platform defaults, to decide whether
2986/// this compile should be using PIC mode or not. Returns a tuple of
2987/// (RelocationModel, PICLevel, IsPIE).
2988static std::tuple<llvm::Reloc::Model, unsigned, bool>
2989ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
2990 const ArgList &Args) {
2991 // FIXME: why does this code...and so much everywhere else, use both
2992 // ToolChain.getTriple() and Triple?
2993 bool PIE = ToolChain.isPIEDefault();
2994 bool PIC = PIE || ToolChain.isPICDefault();
2995 bool IsPICLevelTwo = PIC;
2996
2997 bool KernelOrKext =
2998 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
2999
3000 // Android-specific defaults for PIC/PIE
3001 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3002 switch (ToolChain.getArch()) {
3003 case llvm::Triple::arm:
3004 case llvm::Triple::armeb:
3005 case llvm::Triple::thumb:
3006 case llvm::Triple::thumbeb:
3007 case llvm::Triple::aarch64:
3008 case llvm::Triple::mips:
3009 case llvm::Triple::mipsel:
3010 case llvm::Triple::mips64:
3011 case llvm::Triple::mips64el:
3012 PIC = true; // "-fpic"
3013 break;
3014
3015 case llvm::Triple::x86:
3016 case llvm::Triple::x86_64:
3017 PIC = true; // "-fPIC"
3018 IsPICLevelTwo = true;
3019 break;
3020
3021 default:
3022 break;
3023 }
3024 }
3025
3026 // OpenBSD-specific defaults for PIE
3027 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3028 switch (ToolChain.getArch()) {
3029 case llvm::Triple::mips64:
3030 case llvm::Triple::mips64el:
3031 case llvm::Triple::sparcel:
3032 case llvm::Triple::x86:
3033 case llvm::Triple::x86_64:
3034 IsPICLevelTwo = false; // "-fpie"
3035 break;
3036
3037 case llvm::Triple::ppc:
3038 case llvm::Triple::sparc:
3039 case llvm::Triple::sparcv9:
3040 IsPICLevelTwo = true; // "-fPIE"
3041 break;
3042
3043 default:
3044 break;
3045 }
3046 }
3047
3048 // The last argument relating to either PIC or PIE wins, and no
3049 // other argument is used. If the last argument is any flavor of the
3050 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3051 // option implicitly enables PIC at the same level.
3052 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3053 options::OPT_fpic, options::OPT_fno_pic,
3054 options::OPT_fPIE, options::OPT_fno_PIE,
3055 options::OPT_fpie, options::OPT_fno_pie);
3056 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3057 // is forced, then neither PIC nor PIE flags will have no effect.
3058 if (!ToolChain.isPICDefaultForced()) {
3059 if (LastPICArg) {
3060 Option O = LastPICArg->getOption();
3061 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3062 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3063 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3064 PIC =
3065 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3066 IsPICLevelTwo =
3067 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3068 } else {
3069 PIE = PIC = false;
3070 }
3071 }
3072 }
3073
Greg Bedwell80b325c2015-09-25 16:11:00 +00003074 // Introduce a Darwin-specific hack. If the default is PIC, but the
3075 // PIC level would've been set to level 1, force it back to level 2
3076 // PIC instead. This matches the behavior of Darwin GCC (based on
3077 // chandlerc's informal testing in 2012).
3078 if (PIC && ToolChain.getTriple().isOSDarwin())
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003079 IsPICLevelTwo |= ToolChain.isPICDefault();
3080
James Y Knightc4015d32015-08-21 04:14:55 +00003081 // This kernel flags are a trump-card: they will disable PIC/PIE
3082 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003083 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3084 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003085
3086 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3087 // This is a very special mode. It trumps the other modes, almost no one
3088 // uses it, and it isn't even valid on any OS but Darwin.
3089 if (!ToolChain.getTriple().isOSDarwin())
3090 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3091 << A->getSpelling() << ToolChain.getTriple().str();
3092
3093 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3094
3095 // Only a forced PIC mode can cause the actual compile to have PIC defines
3096 // etc., no flags are sufficient. This behavior was selected to closely
3097 // match that of llvm-gcc and Apple GCC before that.
3098 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3099
3100 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3101 }
3102
3103 if (PIC)
3104 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3105
3106 return std::make_tuple(llvm::Reloc::Static, 0, false);
3107}
3108
3109static const char *RelocationModelName(llvm::Reloc::Model Model) {
3110 switch (Model) {
3111 case llvm::Reloc::Default:
3112 return nullptr;
3113 case llvm::Reloc::Static:
3114 return "static";
3115 case llvm::Reloc::PIC_:
3116 return "pic";
3117 case llvm::Reloc::DynamicNoPIC:
3118 return "dynamic-no-pic";
3119 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003120 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003121}
3122
3123static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3124 ArgStringList &CmdArgs) {
3125 llvm::Reloc::Model RelocationModel;
3126 unsigned PICLevel;
3127 bool IsPIE;
3128 std::tie(RelocationModel, PICLevel, IsPIE) =
3129 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3130
3131 if (RelocationModel != llvm::Reloc::Static)
3132 CmdArgs.push_back("-KPIC");
3133}
3134
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003135void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003136 const InputInfo &Output, const InputInfoList &Inputs,
3137 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003138 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3139 const llvm::Triple Triple(TripleStr);
3140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141 bool KernelOrKext =
3142 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003143 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003144 ArgStringList CmdArgs;
3145
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003146 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003147 bool IsWindowsCygnus =
3148 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003149 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3150
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003151 // Check number of inputs for sanity. We need at least one input.
3152 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003153 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003154 // CUDA compilation may have multiple inputs (source file + results of
3155 // device-side compilations). All other jobs are expected to have exactly one
3156 // input.
3157 bool IsCuda = types::isCuda(Input.getType());
3158 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003159
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003160 // Invoke ourselves in -cc1 mode.
3161 //
3162 // FIXME: Implement custom jobs for internal actions.
3163 CmdArgs.push_back("-cc1");
3164
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003165 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003166 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003167 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003168
James Y Knight2db38f32015-08-15 03:45:25 +00003169 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3170 Triple.getArch() == llvm::Triple::thumb)) {
3171 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003172 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003173 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003174 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003175 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003176 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003177 }
3178
Tim Northover336f1892014-03-29 13:16:12 +00003179 // Push all default warning arguments that are specific to
3180 // the given target. These come before user provided warning options
3181 // are provided.
3182 getToolChain().addClangWarningOptions(CmdArgs);
3183
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003184 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003185 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003186
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003187 if (isa<AnalyzeJobAction>(JA)) {
3188 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3189 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003190 } else if (isa<MigrateJobAction>(JA)) {
3191 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003192 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003193 if (Output.getType() == types::TY_Dependencies)
3194 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003195 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003196 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003197 if (Args.hasArg(options::OPT_rewrite_objc) &&
3198 !Args.hasArg(options::OPT_g_Group))
3199 CmdArgs.push_back("-P");
3200 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003201 } else if (isa<AssembleJobAction>(JA)) {
3202 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003203
David Blaikie9260ed62013-07-25 21:19:01 +00003204 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003205
3206 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003207 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003208 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003209 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003210 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003211
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003212 if (JA.getType() == types::TY_Nothing)
3213 CmdArgs.push_back("-fsyntax-only");
3214 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003215 CmdArgs.push_back("-emit-pch");
3216 else
3217 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003218 } else if (isa<VerifyPCHJobAction>(JA)) {
3219 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003220 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003221 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3222 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003223
Renato Golin7c542b42015-07-27 23:44:45 +00003224 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003225 CmdArgs.push_back("-flto");
3226 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003227 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003228 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003229 } else if (JA.getType() == types::TY_LLVM_IR ||
3230 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003231 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003232 } else if (JA.getType() == types::TY_LLVM_BC ||
3233 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 CmdArgs.push_back("-emit-llvm-bc");
3235 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003236 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003237 } else if (JA.getType() == types::TY_AST) {
3238 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003239 } else if (JA.getType() == types::TY_ModuleFile) {
3240 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003241 } else if (JA.getType() == types::TY_RewrittenObjC) {
3242 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003243 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003244 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3245 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003246 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003247 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003248 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003249 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003250
3251 // Preserve use-list order by default when emitting bitcode, so that
3252 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3253 // same result as running passes here. For LTO, we don't need to preserve
3254 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003255 if (JA.getType() == types::TY_LLVM_BC)
3256 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003257 }
3258
Justin Bognera88f0122014-06-20 22:59:50 +00003259 // We normally speed up the clang process a bit by skipping destructors at
3260 // exit, but when we're generating diagnostics we can rely on some of the
3261 // cleanup.
3262 if (!C.isForDiagnostics())
3263 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003264
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003265// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003266#ifdef NDEBUG
3267 CmdArgs.push_back("-disable-llvm-verifier");
3268#endif
3269
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003270 // Set the main file name, so that debug info works even with
3271 // -save-temps.
3272 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003273 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003274
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003275 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003276 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003277 if (Args.hasArg(options::OPT_static))
3278 CmdArgs.push_back("-static-define");
3279
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003280 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003281 // Enable region store model by default.
3282 CmdArgs.push_back("-analyzer-store=region");
3283
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003284 // Treat blocks as analysis entry points.
3285 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3286
Ted Kremenek49c79792011-03-24 00:28:47 +00003287 CmdArgs.push_back("-analyzer-eagerly-assume");
3288
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003289 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003290 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003291 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003292
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003293 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003294 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003295
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003296 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003297 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003298
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003299 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003300
Artem Belevichba558952015-05-06 18:20:23 +00003301 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003302 CmdArgs.push_back("-analyzer-checker=cplusplus");
3303
Nico Webere8e53112014-05-11 01:04:02 +00003304 // Enable the following experimental checkers for testing.
3305 CmdArgs.push_back(
3306 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003307 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3308 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003309 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003310 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3311 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003312
3313 // Default nullability checks.
3314 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3315 CmdArgs.push_back(
3316 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003317 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003318
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003319 // Set the output format. The default is plist, for (lame) historical
3320 // reasons.
3321 CmdArgs.push_back("-analyzer-output");
3322 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003323 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003324 else
3325 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003326
Ted Kremenekfe449a22010-03-22 22:32:05 +00003327 // Disable the presentation of standard compiler warnings when
3328 // using --analyze. We only want to show static analyzer diagnostics
3329 // or frontend errors.
3330 CmdArgs.push_back("-w");
3331
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003332 // Add -Xanalyzer arguments when running as analyzer.
3333 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003334 }
3335
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003336 CheckCodeGenerationOptions(D, Args);
3337
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003338 llvm::Reloc::Model RelocationModel;
3339 unsigned PICLevel;
3340 bool IsPIE;
3341 std::tie(RelocationModel, PICLevel, IsPIE) =
3342 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003343
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003344 const char *RMName = RelocationModelName(RelocationModel);
3345 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003346 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003347 CmdArgs.push_back(RMName);
3348 }
3349 if (PICLevel > 0) {
3350 CmdArgs.push_back("-pic-level");
3351 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3352 if (IsPIE) {
3353 CmdArgs.push_back("-pie-level");
3354 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003355 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003356 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003357
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003358 CmdArgs.push_back("-mthread-model");
3359 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3360 CmdArgs.push_back(A->getValue());
3361 else
3362 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3363
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003364 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3365
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003366 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3367 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003368 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003369
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003370 // LLVM Code Generator Options.
3371
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003372 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3373 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003374 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3375 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003376 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003377 CmdArgs.push_back(A->getValue());
3378 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003379 }
3380 }
3381
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003382 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3383 StringRef v = A->getValue();
3384 CmdArgs.push_back("-mllvm");
3385 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3386 A->claim();
3387 }
3388
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003389 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3390 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003391 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003392 }
3393
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003394 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3395 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003396 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003397 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003398 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003399 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3400 CmdArgs.push_back("-fpcc-struct-return");
3401 } else {
3402 assert(A->getOption().matches(options::OPT_freg_struct_return));
3403 CmdArgs.push_back("-freg-struct-return");
3404 }
3405 }
3406
Roman Divacky65b88cd2011-03-01 17:40:53 +00003407 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3408 CmdArgs.push_back("-mrtd");
3409
Rafael Espindola224dd632011-12-14 21:02:23 +00003410 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003411 CmdArgs.push_back("-mdisable-fp-elim");
3412 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3413 options::OPT_fno_zero_initialized_in_bss))
3414 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003415
3416 bool OFastEnabled = isOptimizationLevelFast(Args);
3417 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3418 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003419 OptSpecifier StrictAliasingAliasOption =
3420 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003421 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3422 // doesn't do any TBAA.
3423 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003424 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003425 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003426 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003427 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3428 options::OPT_fno_struct_path_tbaa))
3429 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003430 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3431 false))
3432 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003433 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3434 options::OPT_fno_strict_vtable_pointers,
3435 false))
3436 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003437 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3438 options::OPT_fno_optimize_sibling_calls))
3439 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003440
Eric Christopher006208c2013-04-04 06:29:47 +00003441 // Handle segmented stacks.
3442 if (Args.hasArg(options::OPT_fsplit_stack))
3443 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003444
3445 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3446 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003447 OptSpecifier FastMathAliasOption =
3448 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3449
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003450 // Handle various floating point optimization flags, mapping them to the
3451 // appropriate LLVM code generation flags. The pattern for all of these is to
3452 // default off the codegen optimizations, and if any flag enables them and no
3453 // flag disables them after the flag enabling them, enable the codegen
3454 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003455 if (Arg *A = Args.getLastArg(
3456 options::OPT_ffast_math, FastMathAliasOption,
3457 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3458 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3459 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003460 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3461 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003462 A->getOption().getID() != options::OPT_fhonor_infinities)
3463 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003464 if (Arg *A = Args.getLastArg(
3465 options::OPT_ffast_math, FastMathAliasOption,
3466 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3467 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3468 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003469 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3470 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003471 A->getOption().getID() != options::OPT_fhonor_nans)
3472 CmdArgs.push_back("-menable-no-nans");
3473
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003474 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3475 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003476 if (Arg *A =
3477 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3478 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3479 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003480 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3481 // However, turning *off* -ffast_math merely restores the toolchain default
3482 // (which may be false).
3483 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3484 A->getOption().getID() == options::OPT_ffast_math ||
3485 A->getOption().getID() == options::OPT_Ofast)
3486 MathErrno = false;
3487 else if (A->getOption().getID() == options::OPT_fmath_errno)
3488 MathErrno = true;
3489 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003490 if (MathErrno)
3491 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003492
3493 // There are several flags which require disabling very specific
3494 // optimizations. Any of these being disabled forces us to turn off the
3495 // entire set of LLVM optimizations, so collect them through all the flag
3496 // madness.
3497 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003498 if (Arg *A = Args.getLastArg(
3499 options::OPT_ffast_math, FastMathAliasOption,
3500 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3501 options::OPT_fno_unsafe_math_optimizations,
3502 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003503 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3504 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003505 A->getOption().getID() != options::OPT_fno_associative_math)
3506 AssociativeMath = true;
3507 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003508 if (Arg *A = Args.getLastArg(
3509 options::OPT_ffast_math, FastMathAliasOption,
3510 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3511 options::OPT_fno_unsafe_math_optimizations,
3512 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003513 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3514 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003515 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3516 ReciprocalMath = true;
3517 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003518 if (Arg *A = Args.getLastArg(
3519 options::OPT_ffast_math, FastMathAliasOption,
3520 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3521 options::OPT_fno_unsafe_math_optimizations,
3522 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003523 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3524 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003525 A->getOption().getID() != options::OPT_fsigned_zeros)
3526 SignedZeros = false;
3527 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 if (Arg *A = Args.getLastArg(
3529 options::OPT_ffast_math, FastMathAliasOption,
3530 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3531 options::OPT_fno_unsafe_math_optimizations,
3532 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003533 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3534 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003535 A->getOption().getID() != options::OPT_ftrapping_math)
3536 TrappingMath = false;
3537 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3538 !TrappingMath)
3539 CmdArgs.push_back("-menable-unsafe-fp-math");
3540
Sanjay Patel76c9e092015-01-23 16:40:50 +00003541 if (!SignedZeros)
3542 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003543
Sanjay Patel359b1052015-04-09 15:03:23 +00003544 if (ReciprocalMath)
3545 CmdArgs.push_back("-freciprocal-math");
3546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003547 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003548 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003549 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003550 options::OPT_ffp_contract)) {
3551 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003552 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003553 if (Val == "fast" || Val == "on" || Val == "off") {
3554 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3555 } else {
3556 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003557 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003558 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003559 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3560 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003561 // If fast-math is set then set the fp-contract mode to fast.
3562 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3563 }
3564 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003565
Sanjay Patel2987c292015-06-11 14:53:41 +00003566 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003567
Bob Wilson6a039162012-07-19 03:52:53 +00003568 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3569 // and if we find them, tell the frontend to provide the appropriate
3570 // preprocessor macros. This is distinct from enabling any optimizations as
3571 // these options induce language changes which must survive serialization
3572 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003573 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3574 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003575 if (!A->getOption().matches(options::OPT_fno_fast_math))
3576 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003577 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3578 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003579 if (A->getOption().matches(options::OPT_ffinite_math_only))
3580 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003581
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003582 // Decide whether to use verbose asm. Verbose assembly is the default on
3583 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003584 bool IsIntegratedAssemblerDefault =
3585 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003586 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003587 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003588 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003589 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003590
Rafael Espindolab8a12932015-05-22 20:44:03 +00003591 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3592 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003593 CmdArgs.push_back("-no-integrated-as");
3594
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003595 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3596 CmdArgs.push_back("-mdebug-pass");
3597 CmdArgs.push_back("Structure");
3598 }
3599 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3600 CmdArgs.push_back("-mdebug-pass");
3601 CmdArgs.push_back("Arguments");
3602 }
3603
John McCall8517abc2010-02-19 02:45:38 +00003604 // Enable -mconstructor-aliases except on darwin, where we have to
3605 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003606 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003607 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003608
John McCall7ef5cb32011-03-18 02:56:14 +00003609 // Darwin's kernel doesn't support guard variables; just die if we
3610 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003611 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003612 CmdArgs.push_back("-fforbid-guard-variables");
3613
Douglas Gregordbe39272011-02-01 15:15:22 +00003614 if (Args.hasArg(options::OPT_mms_bitfields)) {
3615 CmdArgs.push_back("-mms-bitfields");
3616 }
John McCall8517abc2010-02-19 02:45:38 +00003617
Daniel Dunbar306945d2009-09-16 06:17:29 +00003618 // This is a coarse approximation of what llvm-gcc actually does, both
3619 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3620 // complicated ways.
3621 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003622 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3623 options::OPT_fno_asynchronous_unwind_tables,
3624 (getToolChain().IsUnwindTablesDefault() ||
3625 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3626 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003627 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3628 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003629 CmdArgs.push_back("-munwind-tables");
3630
Chandler Carruth05fb5852012-11-21 23:40:23 +00003631 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003632
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003633 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3634 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003635 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003636 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003637
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003638 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003639 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003640
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003641 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003642 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003643 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003644 }
3645
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003646 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003647 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003648 if (!CPU.empty()) {
3649 CmdArgs.push_back("-target-cpu");
3650 CmdArgs.push_back(Args.MakeArgString(CPU));
3651 }
3652
Rafael Espindolaeb265472013-08-21 21:59:03 +00003653 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3654 CmdArgs.push_back("-mfpmath");
3655 CmdArgs.push_back(A->getValue());
3656 }
3657
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003658 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003659 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003660
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003661 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003662 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003663 default:
3664 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003665
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003666 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003667 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003668 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003669 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003670 // Use the effective triple, which takes into account the deployment target.
3671 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003672 break;
3673
Tim Northover573cbee2014-05-24 12:52:07 +00003674 case llvm::Triple::aarch64:
3675 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003676 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003677 break;
3678
Eric Christopher0b26a612010-03-02 02:41:08 +00003679 case llvm::Triple::mips:
3680 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003681 case llvm::Triple::mips64:
3682 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003683 AddMIPSTargetArgs(Args, CmdArgs);
3684 break;
3685
Ulrich Weigand8afad612014-07-28 13:17:52 +00003686 case llvm::Triple::ppc:
3687 case llvm::Triple::ppc64:
3688 case llvm::Triple::ppc64le:
3689 AddPPCTargetArgs(Args, CmdArgs);
3690 break;
3691
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003692 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003693 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003694 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003695 AddSparcTargetArgs(Args, CmdArgs);
3696 break;
3697
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003698 case llvm::Triple::x86:
3699 case llvm::Triple::x86_64:
3700 AddX86TargetArgs(Args, CmdArgs);
3701 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003702
3703 case llvm::Triple::hexagon:
3704 AddHexagonTargetArgs(Args, CmdArgs);
3705 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003706 }
3707
Hans Wennborg75958c42013-08-08 00:17:41 +00003708 // Add clang-cl arguments.
3709 if (getToolChain().getDriver().IsCLMode())
3710 AddClangCLArgs(Args, CmdArgs);
3711
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003712 // Pass the linker version in use.
3713 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3714 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003715 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003716 }
3717
Eric Christopherb7d97e92013-04-03 01:58:53 +00003718 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003719 CmdArgs.push_back("-momit-leaf-frame-pointer");
3720
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003721 // Explicitly error on some things we know we don't support and can't just
3722 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003723 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003724 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3725 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003726 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003727 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003728 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3729 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003730 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003731 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003732 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003733 }
3734
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003736 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003737 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003738 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003739 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3740 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003741 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003742 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003743 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003744
Chad Rosierbe10f982011-08-02 17:58:04 +00003745 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003746 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003747 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3748 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003749 }
3750
Manman Ren17bdb0f2013-11-20 20:22:14 +00003751 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3752 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003753 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003754 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003755 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003756 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003757 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003758 // FIXME: we should support specifying dwarf version with
3759 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003760 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003761 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003762 const llvm::Triple &Triple = getToolChain().getTriple();
3763 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003764 Triple.getOS() == llvm::Triple::FreeBSD ||
3765 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003766 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003767 SplitDwarfArg = nullptr;
Douglas Katzman553927a2015-09-14 20:31:28 +00003768 } else if (A->getOption().matches(options::OPT_gdwarf_2) ||
3769 A->getOption().matches(options::OPT_gdwarf_3) ||
3770 A->getOption().matches(options::OPT_gdwarf_4)) {
3771 A->render(Args, CmdArgs);
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003772 } else if (!A->getOption().matches(options::OPT_g0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003773 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003774 const llvm::Triple &Triple = getToolChain().getTriple();
3775 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003776 Triple.getOS() == llvm::Triple::FreeBSD ||
3777 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003778 CmdArgs.push_back("-gdwarf-2");
3779 else
3780 CmdArgs.push_back("-g");
3781 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003782 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003783
Reid Kleckner124955a2015-08-05 18:51:13 +00003784 // Forward -gcodeview.
3785 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3786
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003787 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3788 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003789 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Greg Bedwell80b325c2015-09-25 16:11:00 +00003790 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003791 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003792
Eric Christopher138c32b2013-09-13 22:37:55 +00003793 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003794 if (Args.hasArg(options::OPT_gmodules)) {
3795 CmdArgs.push_back("-g");
3796 CmdArgs.push_back("-dwarf-ext-refs");
3797 CmdArgs.push_back("-fmodule-format=obj");
3798 }
3799
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003800 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3801 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003802 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003803 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003804 CmdArgs.push_back("-g");
3805 CmdArgs.push_back("-backend-option");
3806 CmdArgs.push_back("-split-dwarf=Enable");
3807 }
3808
Eric Christopher138c32b2013-09-13 22:37:55 +00003809 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3810 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3811 CmdArgs.push_back("-backend-option");
3812 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3813 }
Eric Christophereec89c22013-06-18 00:03:50 +00003814
Eric Christopher0d403d22014-02-14 01:27:03 +00003815 // -gdwarf-aranges turns on the emission of the aranges section in the
3816 // backend.
Greg Bedwell80b325c2015-09-25 16:11:00 +00003817 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
Eric Christopher0d403d22014-02-14 01:27:03 +00003818 CmdArgs.push_back("-backend-option");
3819 CmdArgs.push_back("-generate-arange-section");
3820 }
3821
David Blaikief36d9ba2014-01-27 18:52:43 +00003822 if (Args.hasFlag(options::OPT_fdebug_types_section,
3823 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003824 CmdArgs.push_back("-backend-option");
3825 CmdArgs.push_back("-generate-type-units");
3826 }
Eric Christophereec89c22013-06-18 00:03:50 +00003827
Ed Schouten6e576152015-03-26 17:50:28 +00003828 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3829 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3830
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003831 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003832 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003833 CmdArgs.push_back("-ffunction-sections");
3834 }
3835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003836 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3837 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 CmdArgs.push_back("-fdata-sections");
3839 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003840
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003841 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003842 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003843 CmdArgs.push_back("-fno-unique-section-names");
3844
Chris Lattner3c77a352010-06-22 00:03:40 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3846
Diego Novilloa0545962015-07-10 18:00:07 +00003847 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003848
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003849 // Pass options for controlling the default header search paths.
3850 if (Args.hasArg(options::OPT_nostdinc)) {
3851 CmdArgs.push_back("-nostdsysteminc");
3852 CmdArgs.push_back("-nobuiltininc");
3853 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003854 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003855 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003856 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3857 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3858 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003859
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003860 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003861 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003862 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003863
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003864 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3865
Ted Kremenekf7639e12012-03-06 20:06:33 +00003866 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003867 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003868 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003869 options::OPT_ccc_arcmt_modify,
3870 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003871 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003872 switch (A->getOption().getID()) {
3873 default:
3874 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003875 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003876 CmdArgs.push_back("-arcmt-check");
3877 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003878 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003879 CmdArgs.push_back("-arcmt-modify");
3880 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003881 case options::OPT_ccc_arcmt_migrate:
3882 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003883 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003884 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003885
3886 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3887 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003888 break;
John McCalld70fb982011-06-15 23:25:17 +00003889 }
3890 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003891 } else {
3892 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3893 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3894 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003895 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003896
Ted Kremenekf7639e12012-03-06 20:06:33 +00003897 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3898 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003899 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3900 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003901 }
3902 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003903 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003904
3905 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003906 options::OPT_objcmt_migrate_subscripting,
3907 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003908 // None specified, means enable them all.
3909 CmdArgs.push_back("-objcmt-migrate-literals");
3910 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003911 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003912 } else {
3913 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3914 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003915 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003916 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003917 } else {
3918 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3919 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3921 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3922 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3923 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003924 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003934 }
3935
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003936 // Add preprocessing options like -I, -D, etc. if we are using the
3937 // preprocessor.
3938 //
3939 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003940 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003941 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003942
Rafael Espindolaa7431922011-07-21 23:40:37 +00003943 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3944 // that "The compiler can only warn and ignore the option if not recognized".
3945 // When building with ccache, it will pass -D options to clang even on
3946 // preprocessed inputs and configure concludes that -fPIC is not supported.
3947 Args.ClaimAllArgs(options::OPT_D);
3948
Alp Toker7874bdc2013-11-15 20:40:58 +00003949 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003950 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3951 if (A->getOption().matches(options::OPT_O4)) {
3952 CmdArgs.push_back("-O3");
3953 D.Diag(diag::warn_O4_is_O3);
3954 } else {
3955 A->render(Args, CmdArgs);
3956 }
3957 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003958
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003959 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003960 for (const Arg *A :
3961 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3962 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003963 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003964 }
3965
Rafael Espindola577637a2015-01-03 00:06:04 +00003966 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003967
Richard Smith3be1cb22014-08-07 00:24:21 +00003968 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003969 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003970 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3971 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003972 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003973 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003974
3975 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003976 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003977 //
3978 // If a std is supplied, only add -trigraphs if it follows the
3979 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003980 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003981 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3982 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003983 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003984 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003985 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003986 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003987 else
3988 Std->render(Args, CmdArgs);
3989
Nico Weber00721502014-12-23 22:32:37 +00003990 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003991 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003992 options::OPT_ftrigraphs,
3993 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003994 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003995 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003996 } else {
3997 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003998 //
3999 // FIXME: Clang doesn't correctly handle -std= when the input language
4000 // doesn't match. For the time being just ignore this for C++ inputs;
4001 // eventually we want to do all the standard defaulting here instead of
4002 // splitting it between the driver and clang -cc1.
4003 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004004 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4005 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004006 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004007 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004008
Nico Weber00721502014-12-23 22:32:37 +00004009 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4010 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004011 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004012
Richard Smith282b4492013-09-04 22:50:31 +00004013 // GCC's behavior for -Wwrite-strings is a bit strange:
4014 // * In C, this "warning flag" changes the types of string literals from
4015 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4016 // for the discarded qualifier.
4017 // * In C++, this is just a normal warning flag.
4018 //
4019 // Implementing this warning correctly in C is hard, so we follow GCC's
4020 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4021 // a non-const char* in C, rather than using this crude hack.
4022 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004023 // FIXME: This should behave just like a warning flag, and thus should also
4024 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4025 Arg *WriteStrings =
4026 Args.getLastArg(options::OPT_Wwrite_strings,
4027 options::OPT_Wno_write_strings, options::OPT_w);
4028 if (WriteStrings &&
4029 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004030 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004031 }
4032
Chandler Carruth61fbf622011-04-23 09:27:53 +00004033 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004034 // during C++ compilation, which it is by default. GCC keeps this define even
4035 // in the presence of '-w', match this behavior bug-for-bug.
4036 if (types::isCXX(InputType) &&
4037 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4038 true)) {
4039 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004040 }
4041
Chandler Carruthe0391482010-05-22 02:21:53 +00004042 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4043 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4044 if (Asm->getOption().matches(options::OPT_fasm))
4045 CmdArgs.push_back("-fgnu-keywords");
4046 else
4047 CmdArgs.push_back("-fno-gnu-keywords");
4048 }
4049
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004050 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4051 CmdArgs.push_back("-fno-dwarf-directory-asm");
4052
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004053 if (ShouldDisableAutolink(Args, getToolChain()))
4054 CmdArgs.push_back("-fno-autolink");
4055
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004056 // Add in -fdebug-compilation-dir if necessary.
4057 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004058
Richard Smith9a568822011-11-21 19:36:32 +00004059 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4060 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004061 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004062 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004063 }
4064
Richard Smith79c927b2013-11-06 19:31:51 +00004065 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4066 CmdArgs.push_back("-foperator-arrow-depth");
4067 CmdArgs.push_back(A->getValue());
4068 }
4069
Richard Smith9a568822011-11-21 19:36:32 +00004070 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4071 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004072 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004073 }
4074
Richard Smitha3d3bd22013-05-08 02:12:03 +00004075 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4076 CmdArgs.push_back("-fconstexpr-steps");
4077 CmdArgs.push_back(A->getValue());
4078 }
4079
Richard Smithb3a14522013-02-22 01:59:51 +00004080 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4081 CmdArgs.push_back("-fbracket-depth");
4082 CmdArgs.push_back(A->getValue());
4083 }
4084
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004085 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4086 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004087 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004088 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004089 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4090 } else
4091 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004092 }
4093
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004094 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004095 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004096
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004097 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4098 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004099 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004100 }
David Chisnall5778fce2009-08-31 16:41:57 +00004101
Chris Lattnere23003d2010-01-09 21:54:33 +00004102 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4103 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004104 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004105 }
4106
Chris Lattnerb35583d2010-04-07 20:49:23 +00004107 CmdArgs.push_back("-ferror-limit");
4108 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004109 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004110 else
4111 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004112
Chandler Carrutha77a7272010-05-06 04:55:18 +00004113 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4114 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004115 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004116 }
4117
4118 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4119 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004120 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004121 }
4122
Richard Smithf6f003a2011-12-16 19:06:07 +00004123 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4124 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004125 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004126 }
4127
Nick Lewycky24653262014-12-16 21:39:02 +00004128 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4129 CmdArgs.push_back("-fspell-checking-limit");
4130 CmdArgs.push_back(A->getValue());
4131 }
4132
Daniel Dunbar2c978472009-11-04 06:24:47 +00004133 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004134 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004135 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004136 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004137 } else {
4138 // If -fmessage-length=N was not specified, determine whether this is a
4139 // terminal and, if so, implicitly define -fmessage-length appropriately.
4140 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 }
4143
John McCallb4a99d32013-02-19 01:57:35 +00004144 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4145 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4146 options::OPT_fvisibility_ms_compat)) {
4147 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4148 CmdArgs.push_back("-fvisibility");
4149 CmdArgs.push_back(A->getValue());
4150 } else {
4151 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4152 CmdArgs.push_back("-fvisibility");
4153 CmdArgs.push_back("hidden");
4154 CmdArgs.push_back("-ftype-visibility");
4155 CmdArgs.push_back("default");
4156 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004157 }
4158
Douglas Gregor08329632010-06-15 17:05:35 +00004159 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004160
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004161 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4162
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004163 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004164 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4165 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004166 CmdArgs.push_back("-ffreestanding");
4167
Daniel Dunbare357d562009-12-03 18:42:11 +00004168 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004169 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004170 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004171 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4172 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004173 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004174 // Emulated TLS is enabled by default on Android, and can be enabled manually
4175 // with -femulated-tls.
4176 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4177 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4178 EmulatedTLSDefault))
4179 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004180 // AltiVec-like language extensions aren't relevant for assembling.
4181 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004182 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004183 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4184 }
Richard Trieu91844232012-06-26 18:18:47 +00004185 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4186 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004187
Alexey Bataevdb390212015-05-20 04:24:19 +00004188 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004189 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4190 options::OPT_fno_openmp, false))
4191 switch (getOpenMPRuntime(getToolChain(), Args)) {
4192 case OMPRT_OMP:
4193 case OMPRT_IOMP5:
4194 // Clang can generate useful OpenMP code for these two runtime libraries.
4195 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004196
4197 // If no option regarding the use of TLS in OpenMP codegeneration is
4198 // given, decide a default based on the target. Otherwise rely on the
4199 // options and pass the right information to the frontend.
4200 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004201 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004202 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004203 break;
4204 default:
4205 // By default, if Clang doesn't know how to generate useful OpenMP code
4206 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4207 // down to the actual compilation.
4208 // FIXME: It would be better to have a mode which *only* omits IR
4209 // generation based on the OpenMP support so that we get consistent
4210 // semantic analysis, etc.
4211 break;
4212 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004213
Peter Collingbourne32701642013-11-01 18:16:25 +00004214 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004215 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004216
Eric Christopher459d2712013-02-19 06:16:53 +00004217 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004218 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4219 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4220 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4221 Arch == llvm::Triple::ppc64le))
4222 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4223 << "ppc/ppc64/ppc64le";
4224 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004225
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004226 // -fzvector is incompatible with -faltivec.
4227 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4228 if (Args.hasArg(options::OPT_faltivec))
4229 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4230 << "-faltivec";
4231
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004232 if (getToolChain().SupportsProfiling())
4233 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004234
4235 // -flax-vector-conversions is default.
4236 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4237 options::OPT_fno_lax_vector_conversions))
4238 CmdArgs.push_back("-fno-lax-vector-conversions");
4239
John Brawna7b4ec02015-08-10 11:11:28 +00004240 if (Args.getLastArg(options::OPT_fapple_kext) ||
4241 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004242 CmdArgs.push_back("-fapple-kext");
4243
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004244 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004245 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004246 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004247 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4248 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004249
4250 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4251 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004252 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004253 }
4254
Bob Wilson14adb362012-02-03 06:27:22 +00004255 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004256
Chandler Carruth6e501032011-03-27 00:04:55 +00004257 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4258 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004259 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004260 if (A->getOption().matches(options::OPT_fwrapv))
4261 CmdArgs.push_back("-fwrapv");
4262 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4263 options::OPT_fno_strict_overflow)) {
4264 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4265 CmdArgs.push_back("-fwrapv");
4266 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004267
4268 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4269 options::OPT_fno_reroll_loops))
4270 if (A->getOption().matches(options::OPT_freroll_loops))
4271 CmdArgs.push_back("-freroll-loops");
4272
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004273 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004274 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4275 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004276
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004277 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4278
Daniel Dunbar4930e332009-11-17 08:07:36 +00004279 // -stack-protector=0 is default.
4280 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004281 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4282 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4283 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4284 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4285 Args.ClaimAllArgs(options::OPT_fstack_protector);
4286 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 options::OPT_fstack_protector_all,
4288 options::OPT_fstack_protector_strong,
4289 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004290 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004291 StackProtectorLevel = std::max<unsigned>(
4292 LangOptions::SSPOn,
4293 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004294 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004295 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004296 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004297 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004298 } else {
4299 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004301 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004302 if (StackProtectorLevel) {
4303 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004304 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004305 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004306
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004307 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004308 for (const Arg *A : Args.filtered(options::OPT__param)) {
4309 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004310 if (Str.startswith("ssp-buffer-size=")) {
4311 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004312 CmdArgs.push_back("-stack-protector-buffer-size");
4313 // FIXME: Verify the argument is a valid integer.
4314 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004315 }
Sean Silva14facf32015-06-09 01:57:17 +00004316 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004317 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004318 }
4319
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004320 // Translate -mstackrealign
4321 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004322 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004323 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004324
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004325 if (Args.hasArg(options::OPT_mstack_alignment)) {
4326 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4327 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004328 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004329
Hans Wennborg77dc2362015-01-20 19:45:50 +00004330 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4331 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4332
4333 if (!Size.empty())
4334 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4335 else
4336 CmdArgs.push_back("-mstack-probe-size=0");
4337 }
4338
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004339 switch (getToolChain().getArch()) {
4340 case llvm::Triple::aarch64:
4341 case llvm::Triple::aarch64_be:
4342 case llvm::Triple::arm:
4343 case llvm::Triple::armeb:
4344 case llvm::Triple::thumb:
4345 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004346 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004347 break;
4348
4349 default:
4350 break;
4351 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004352
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004353 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4354 options::OPT_mno_restrict_it)) {
4355 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4356 CmdArgs.push_back("-backend-option");
4357 CmdArgs.push_back("-arm-restrict-it");
4358 } else {
4359 CmdArgs.push_back("-backend-option");
4360 CmdArgs.push_back("-arm-no-restrict-it");
4361 }
James Y Knight2db38f32015-08-15 03:45:25 +00004362 } else if (Triple.isOSWindows() &&
4363 (Triple.getArch() == llvm::Triple::arm ||
4364 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004365 // Windows on ARM expects restricted IT blocks
4366 CmdArgs.push_back("-backend-option");
4367 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004368 }
4369
Daniel Dunbard18049a2009-04-07 21:16:11 +00004370 // Forward -f options with positive and negative forms; we translate
4371 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004372 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4373 StringRef fname = A->getValue();
4374 if (!llvm::sys::fs::exists(fname))
4375 D.Diag(diag::err_drv_no_such_file) << fname;
4376 else
4377 A->render(Args, CmdArgs);
4378 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004379
John Brawna7b4ec02015-08-10 11:11:28 +00004380 // -fbuiltin is default unless -mkernel is used
4381 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4382 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004383 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004384
Nuno Lopes13c88c72009-12-16 16:59:22 +00004385 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4386 options::OPT_fno_assume_sane_operator_new))
4387 CmdArgs.push_back("-fno-assume-sane-operator-new");
4388
Daniel Dunbar4930e332009-11-17 08:07:36 +00004389 // -fblocks=0 is default.
4390 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004391 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004392 (Args.hasArg(options::OPT_fgnu_runtime) &&
4393 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4394 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004395 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004396
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004397 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004398 !getToolChain().hasBlocksRuntime())
4399 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004400 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004401
Richard Smith47972af2015-06-16 00:08:24 +00004402 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004403 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004404 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004405 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004406 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004407 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4408 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004409 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004410 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004411 HaveModules = true;
4412 }
4413 }
4414
Richard Smith47972af2015-06-16 00:08:24 +00004415 // -fmodule-maps enables implicit reading of module map files. By default,
4416 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004417 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4418 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004419 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004420 }
4421
Daniel Jasperac42b752013-10-21 06:34:34 +00004422 // -fmodules-decluse checks that modules used are declared so (off by
4423 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004424 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004425 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004426 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004427 }
4428
Daniel Jasper962b38e2014-04-11 11:47:45 +00004429 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4430 // all #included headers are part of modules.
4431 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004432 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004433 CmdArgs.push_back("-fmodules-strict-decluse");
4434 }
4435
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004436 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4437 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4438 options::OPT_fno_implicit_modules)) {
4439 CmdArgs.push_back("-fno-implicit-modules");
4440 }
4441
Daniel Jasperac42b752013-10-21 06:34:34 +00004442 // -fmodule-name specifies the module that is currently being built (or
4443 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004444 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004445
Richard Smith9887d792014-10-17 01:42:53 +00004446 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004447 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004448 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004449
Richard Smithe842a472014-10-22 02:05:46 +00004450 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004451 if (HaveModules)
4452 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4453 else
4454 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004455
4456 // -fmodule-cache-path specifies where our implicitly-built module files
4457 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004458 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004459 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004460 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004461 if (HaveModules) {
4462 if (C.isForDiagnostics()) {
4463 // When generating crash reports, we want to emit the modules along with
4464 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004465 Path = Output.getFilename();
4466 llvm::sys::path::replace_extension(Path, ".cache");
4467 llvm::sys::path::append(Path, "modules");
4468 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004469 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004470 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004471 llvm::sys::path::append(Path, "org.llvm.clang.");
4472 appendUserToPath(Path);
4473 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004474 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004475 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004476 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4477 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004478 }
4479
4480 // When building modules and generating crashdumps, we need to dump a module
4481 // dependency VFS alongside the output.
4482 if (HaveModules && C.isForDiagnostics()) {
4483 SmallString<128> VFSDir(Output.getFilename());
4484 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004485 // Add the cache directory as a temp so the crash diagnostics pick it up.
4486 C.addTempFile(Args.MakeArgString(VFSDir));
4487
Justin Bognera88f0122014-06-20 22:59:50 +00004488 llvm::sys::path::append(VFSDir, "vfs");
4489 CmdArgs.push_back("-module-dependency-dir");
4490 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004491 }
4492
Richard Smith9887d792014-10-17 01:42:53 +00004493 if (HaveModules)
4494 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004495
Douglas Gregor35b04d62013-02-07 19:01:24 +00004496 // Pass through all -fmodules-ignore-macro arguments.
4497 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004498 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4499 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004500
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004501 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4502
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004503 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4504 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4505 D.Diag(diag::err_drv_argument_not_allowed_with)
4506 << A->getAsString(Args) << "-fbuild-session-timestamp";
4507
4508 llvm::sys::fs::file_status Status;
4509 if (llvm::sys::fs::status(A->getValue(), Status))
4510 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004511 CmdArgs.push_back(Args.MakeArgString(
4512 "-fbuild-session-timestamp=" +
4513 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004514 }
4515
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004516 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004517 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4518 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004519 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4520
4521 Args.AddLastArg(CmdArgs,
4522 options::OPT_fmodules_validate_once_per_build_session);
4523 }
4524
Ben Langmuirdcf73862014-03-12 00:06:17 +00004525 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4526
John McCalldfea9982010-04-09 19:12:06 +00004527 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004528 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004529 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004530 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004531
Anders Carlssond470fef2010-11-21 00:09:52 +00004532 // -felide-constructors is the default.
4533 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004534 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004535 CmdArgs.push_back("-fno-elide-constructors");
4536
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004537 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004538
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004539 if (KernelOrKext || (types::isCXX(InputType) &&
4540 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4541 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004542 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004543
Tony Linthicum76329bf2011-12-12 21:14:55 +00004544 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004545 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4546 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004547 CmdArgs.push_back("-fshort-enums");
4548
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004549 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004550 if (Arg *A = Args.getLastArg(
4551 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4552 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4553 if (A->getOption().matches(options::OPT_funsigned_char) ||
4554 A->getOption().matches(options::OPT_fno_signed_char)) {
4555 CmdArgs.push_back("-fno-signed-char");
4556 }
4557 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004558 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004559 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004560
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004561 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004562 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4563 options::OPT_fno_use_cxa_atexit,
4564 !IsWindowsCygnus && !IsWindowsGNU &&
Rafael Espindolafe71f382015-09-14 23:21:31 +00004565 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4566 getToolChain().getArch() != llvm::Triple::hexagon &&
4567 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004568 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004569 CmdArgs.push_back("-fno-use-cxa-atexit");
4570
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004571 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004572 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004573 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004574 CmdArgs.push_back("-fms-extensions");
4575
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004576 // -fno-use-line-directives is default.
4577 if (Args.hasFlag(options::OPT_fuse_line_directives,
4578 options::OPT_fno_use_line_directives, false))
4579 CmdArgs.push_back("-fuse-line-directives");
4580
Francois Pichet1b4f1632011-09-17 04:32:15 +00004581 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004582 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004583 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004584 (IsWindowsMSVC &&
4585 Args.hasFlag(options::OPT_fms_extensions,
4586 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004587 CmdArgs.push_back("-fms-compatibility");
4588
David Majnemerc371ff02015-03-22 08:39:22 +00004589 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004590 VersionTuple MSVT = visualstudio::getMSVCVersion(
4591 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4592 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004593 CmdArgs.push_back(
4594 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004595
David Majnemer8db91762015-05-18 04:49:30 +00004596 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4597 if (ImplyVCPPCXXVer) {
4598 if (IsMSVC2015Compatible)
4599 CmdArgs.push_back("-std=c++14");
4600 else
4601 CmdArgs.push_back("-std=c++11");
4602 }
4603
Eric Christopher5ecce122013-02-18 00:38:31 +00004604 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004605 if (Args.hasFlag(options::OPT_fborland_extensions,
4606 options::OPT_fno_borland_extensions, false))
4607 CmdArgs.push_back("-fborland-extensions");
4608
David Majnemerc371ff02015-03-22 08:39:22 +00004609 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4610 // than 19.
4611 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4612 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004613 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004614 CmdArgs.push_back("-fno-threadsafe-statics");
4615
Francois Pichet02744872011-09-01 16:38:08 +00004616 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4617 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004618 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004619 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004620 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004621
Chandler Carruthe03aa552010-04-17 20:17:31 +00004622 // -fgnu-keywords default varies depending on language; only pass if
4623 // specified.
4624 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004625 options::OPT_fno_gnu_keywords))
4626 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004628 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004629 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004630 CmdArgs.push_back("-fgnu89-inline");
4631
Chad Rosier9c76d242012-03-15 22:31:42 +00004632 if (Args.hasArg(options::OPT_fno_inline))
4633 CmdArgs.push_back("-fno-inline");
4634
Chad Rosier64d6be92012-03-06 21:17:19 +00004635 if (Args.hasArg(options::OPT_fno_inline_functions))
4636 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004637
John McCall5fb5df92012-06-20 06:18:46 +00004638 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004639
John McCall5fb5df92012-06-20 06:18:46 +00004640 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004641 // legacy is the default. Except for deployment taget of 10.5,
4642 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4643 // gets ignored silently.
4644 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004645 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4646 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004647 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004648 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004649 if (getToolChain().UseObjCMixedDispatch())
4650 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4651 else
4652 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4653 }
4654 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004655
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004656 // When ObjectiveC legacy runtime is in effect on MacOSX,
4657 // turn on the option to do Array/Dictionary subscripting
4658 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004659 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004660 getToolChain().getTriple().isMacOSX() &&
4661 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4662 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004663 objcRuntime.isNeXTFamily())
4664 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004665
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004666 // -fencode-extended-block-signature=1 is default.
4667 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4668 CmdArgs.push_back("-fencode-extended-block-signature");
4669 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004670
John McCall24fc0de2011-07-06 00:26:06 +00004671 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4672 // NOTE: This logic is duplicated in ToolChains.cpp.
4673 bool ARC = isObjCAutoRefCount(Args);
4674 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004675 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004676
John McCall24fc0de2011-07-06 00:26:06 +00004677 CmdArgs.push_back("-fobjc-arc");
4678
Chandler Carruth491db322011-11-04 07:34:47 +00004679 // FIXME: It seems like this entire block, and several around it should be
4680 // wrapped in isObjC, but for now we just use it here as this is where it
4681 // was being used previously.
4682 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4683 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4684 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4685 else
4686 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4687 }
4688
John McCall24fc0de2011-07-06 00:26:06 +00004689 // Allow the user to enable full exceptions code emission.
4690 // We define off for Objective-CC, on for Objective-C++.
4691 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4692 options::OPT_fno_objc_arc_exceptions,
4693 /*default*/ types::isCXX(InputType)))
4694 CmdArgs.push_back("-fobjc-arc-exceptions");
4695 }
4696
4697 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4698 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004699 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004700 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004701
John McCall24fc0de2011-07-06 00:26:06 +00004702 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4703 // takes precedence.
4704 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4705 if (!GCArg)
4706 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4707 if (GCArg) {
4708 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004709 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004710 } else if (getToolChain().SupportsObjCGC()) {
4711 GCArg->render(Args, CmdArgs);
4712 } else {
4713 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004714 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004715 }
4716 }
4717
Bob Wilsonb111ec92015-03-02 19:01:14 +00004718 if (Args.hasFlag(options::OPT_fapplication_extension,
4719 options::OPT_fno_application_extension, false))
4720 CmdArgs.push_back("-fapplication-extension");
4721
Reid Klecknerc542d372014-06-27 17:02:02 +00004722 // Handle GCC-style exception args.
4723 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004724 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4725 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004726
4727 if (getToolChain().UseSjLjExceptions())
4728 CmdArgs.push_back("-fsjlj-exceptions");
4729
4730 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004731 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4732 options::OPT_fno_assume_sane_operator_new))
4733 CmdArgs.push_back("-fno-assume-sane-operator-new");
4734
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004735 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4736 // most platforms.
4737 if (Args.hasFlag(options::OPT_fsized_deallocation,
4738 options::OPT_fno_sized_deallocation, false))
4739 CmdArgs.push_back("-fsized-deallocation");
4740
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004741 // -fconstant-cfstrings is default, and may be subject to argument translation
4742 // on Darwin.
4743 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4744 options::OPT_fno_constant_cfstrings) ||
4745 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4746 options::OPT_mno_constant_cfstrings))
4747 CmdArgs.push_back("-fno-constant-cfstrings");
4748
John Thompsoned4e2952009-11-05 20:14:16 +00004749 // -fshort-wchar default varies depending on platform; only
4750 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004751 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4752 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004753 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004754
Hans Wennborg28c96312013-07-31 23:39:13 +00004755 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004756 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004757 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004758 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004759
Daniel Dunbar096ed292011-10-05 21:04:55 +00004760 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4761 // -fno-pack-struct doesn't apply to -fpack-struct=.
4762 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004763 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004764 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004765 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004766 } else if (Args.hasFlag(options::OPT_fpack_struct,
4767 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004768 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004769 }
4770
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004771 // Handle -fmax-type-align=N and -fno-type-align
4772 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4773 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4774 if (!SkipMaxTypeAlign) {
4775 std::string MaxTypeAlignStr = "-fmax-type-align=";
4776 MaxTypeAlignStr += A->getValue();
4777 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4778 }
4779 } else if (getToolChain().getTriple().isOSDarwin()) {
4780 if (!SkipMaxTypeAlign) {
4781 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4782 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4783 }
4784 }
4785
John Brawna7b4ec02015-08-10 11:11:28 +00004786 // -fcommon is the default unless compiling kernel code or the target says so
4787 bool NoCommonDefault =
4788 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4789 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4790 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004791 CmdArgs.push_back("-fno-common");
4792
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004793 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004794 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004795 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004796 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004797 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004798 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004799
Daniel Dunbar6358d682010-10-15 22:30:42 +00004800 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004801 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004802 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004803 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004804
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004805 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004806 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4807 StringRef value = inputCharset->getValue();
4808 if (value != "UTF-8")
4809 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4810 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004811 }
4812
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004813 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004814 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4815 StringRef value = execCharset->getValue();
4816 if (value != "UTF-8")
4817 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4818 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004819 }
4820
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004821 // -fcaret-diagnostics is default.
4822 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4823 options::OPT_fno_caret_diagnostics, true))
4824 CmdArgs.push_back("-fno-caret-diagnostics");
4825
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004826 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004827 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004828 options::OPT_fno_diagnostics_fixit_info))
4829 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004830
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004831 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004832 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004833 options::OPT_fno_diagnostics_show_option))
4834 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004835
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004836 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004837 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004838 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004839 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004840 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004841
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004843 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004844 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004845 }
4846
Chandler Carruthb6766f02011-03-27 01:50:55 +00004847 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004848 options::OPT_fdiagnostics_show_note_include_stack,
4849 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004850 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004852 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4853 else
4854 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4855 }
4856
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004857 // Color diagnostics are the default, unless the terminal doesn't support
4858 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004859 // Support both clang's -f[no-]color-diagnostics and gcc's
4860 // -f[no-]diagnostics-colors[=never|always|auto].
4861 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004862 for (const auto &Arg : Args) {
4863 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004864 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4865 !O.matches(options::OPT_fdiagnostics_color) &&
4866 !O.matches(options::OPT_fno_color_diagnostics) &&
4867 !O.matches(options::OPT_fno_diagnostics_color) &&
4868 !O.matches(options::OPT_fdiagnostics_color_EQ))
4869 continue;
4870
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004871 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004872 if (O.matches(options::OPT_fcolor_diagnostics) ||
4873 O.matches(options::OPT_fdiagnostics_color)) {
4874 ShowColors = Colors_On;
4875 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4876 O.matches(options::OPT_fno_diagnostics_color)) {
4877 ShowColors = Colors_Off;
4878 } else {
4879 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004880 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004881 if (value == "always")
4882 ShowColors = Colors_On;
4883 else if (value == "never")
4884 ShowColors = Colors_Off;
4885 else if (value == "auto")
4886 ShowColors = Colors_Auto;
4887 else
4888 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004889 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004890 }
4891 }
4892 if (ShowColors == Colors_On ||
4893 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004894 CmdArgs.push_back("-fcolor-diagnostics");
4895
Nico Rieck7857d462013-09-11 00:38:02 +00004896 if (Args.hasArg(options::OPT_fansi_escape_codes))
4897 CmdArgs.push_back("-fansi-escape-codes");
4898
Daniel Dunbardb097022009-06-08 21:13:54 +00004899 if (!Args.hasFlag(options::OPT_fshow_source_location,
4900 options::OPT_fno_show_source_location))
4901 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004903 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004904 true))
4905 CmdArgs.push_back("-fno-show-column");
4906
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004907 if (!Args.hasFlag(options::OPT_fspell_checking,
4908 options::OPT_fno_spell_checking))
4909 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004910
Chad Rosierc8e56e82012-12-05 21:08:21 +00004911 // -fno-asm-blocks is default.
4912 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4913 false))
4914 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004915
Steven Wucb0d13f2015-01-16 23:05:28 +00004916 // -fgnu-inline-asm is default.
4917 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4918 options::OPT_fno_gnu_inline_asm, true))
4919 CmdArgs.push_back("-fno-gnu-inline-asm");
4920
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004921 // Enable vectorization per default according to the optimization level
4922 // selected. For optimization levels that want vectorization we use the alias
4923 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004924 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004925 OptSpecifier VectorizeAliasOption =
4926 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004927 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004928 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004929 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004930
Chad Rosier136d67d2014-04-28 19:30:57 +00004931 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004932 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004933 OptSpecifier SLPVectAliasOption =
4934 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004935 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004936 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004937 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004938
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004939 // -fno-slp-vectorize-aggressive is default.
4940 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004941 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004942 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004943
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004944 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4945 A->render(Args, CmdArgs);
4946
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004947 // -fdollars-in-identifiers default varies depending on platform and
4948 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004949 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004950 options::OPT_fno_dollars_in_identifiers)) {
4951 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004952 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004953 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004954 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004955 }
4956
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004957 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4958 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004959 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004960 options::OPT_fno_unit_at_a_time)) {
4961 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004962 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004963 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004964
Eli Friedman055c9702011-11-02 01:53:16 +00004965 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4966 options::OPT_fno_apple_pragma_pack, false))
4967 CmdArgs.push_back("-fapple-pragma-pack");
4968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004969 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004970 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4971 // by default.
4972 if (getToolChain().getArch() == llvm::Triple::le32) {
4973 CmdArgs.push_back("-fno-math-builtin");
4974 }
4975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4977//
4978// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004979#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004980 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004981 (getToolChain().getArch() == llvm::Triple::arm ||
4982 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004983 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4984 CmdArgs.push_back("-fno-builtin-strcat");
4985 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4986 CmdArgs.push_back("-fno-builtin-strcpy");
4987 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004988#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004989
Justin Bognera88f0122014-06-20 22:59:50 +00004990 // Enable rewrite includes if the user's asked for it or if we're generating
4991 // diagnostics.
4992 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4993 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004994 if (Args.hasFlag(options::OPT_frewrite_includes,
4995 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004996 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004997 CmdArgs.push_back("-frewrite-includes");
4998
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004999 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005000 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005001 options::OPT_traditional_cpp)) {
5002 if (isa<PreprocessJobAction>(JA))
5003 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005004 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005005 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005006 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005007
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005008 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005009 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005010
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005011 // Handle serialized diagnostics.
5012 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5013 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005014 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005015 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005016
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005017 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5018 CmdArgs.push_back("-fretain-comments-from-system-headers");
5019
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005020 // Forward -fcomment-block-commands to -cc1.
5021 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005022 // Forward -fparse-all-comments to -cc1.
5023 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005024
John Brawnad31ace2015-09-23 13:55:40 +00005025 // Turn -fplugin=name.so into -load name.so
5026 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5027 CmdArgs.push_back("-load");
5028 CmdArgs.push_back(A->getValue());
5029 A->claim();
5030 }
5031
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005032 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5033 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005034 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005035 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5036 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005037
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005038 // We translate this by hand to the -cc1 argument, since nightly test uses
5039 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005040 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005041 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005042 } else
Sean Silva14facf32015-06-09 01:57:17 +00005043 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005044 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005045
Bob Wilson23a55f12014-12-21 07:00:00 +00005046 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005047 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5048 // by the frontend.
5049 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5050 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005051
Daniel Dunbard67a3222009-03-30 06:36:42 +00005052 if (Output.getType() == types::TY_Dependencies) {
5053 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005054 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005055 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005056 CmdArgs.push_back(Output.getFilename());
5057 } else {
5058 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005059 }
5060
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005061 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005062
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005063 if (Input.isFilename())
5064 CmdArgs.push_back(Input.getFilename());
5065 else
5066 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005067
Chris Lattnere9d7d782009-11-03 19:50:27 +00005068 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5069
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005070 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005071
5072 // Optionally embed the -cc1 level arguments into the debug info, for build
5073 // analysis.
5074 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005075 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005076 for (const auto &Arg : Args)
5077 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005078
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005079 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005080 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005081 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005082 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005083 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005084 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005085 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005086 }
5087 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005088 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005089 }
5090
Eric Christopherd3804002013-02-22 20:12:52 +00005091 // Add the split debug info name to the command lines here so we
5092 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005093 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005094 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5095 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005096 const char *SplitDwarfOut;
5097 if (SplitDwarf) {
5098 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005099 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005100 CmdArgs.push_back(SplitDwarfOut);
5101 }
5102
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005103 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5104 // Include them with -fcuda-include-gpubinary.
5105 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005106 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005107 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005108 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005109 }
5110
Eric Christopherd3804002013-02-22 20:12:52 +00005111 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005112 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005113 Output.getType() == types::TY_Object &&
5114 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005115 auto CLCommand =
5116 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005117 C.addCommand(llvm::make_unique<FallbackCommand>(
5118 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005119 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005120 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005121 }
5122
Eric Christopherf1545832013-02-22 23:50:16 +00005123 // Handle the debug info splitting at object creation time if we're
5124 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005125 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005126 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005127 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005128
Roman Divacky178e01602011-02-10 16:52:03 +00005129 if (Arg *A = Args.getLastArg(options::OPT_pg))
5130 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005131 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5132 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005133
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005134 // Claim some arguments which clang supports automatically.
5135
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005136 // -fpch-preprocess is used with gcc to add a special marker in the output to
5137 // include the PCH file. Clang's PTH solution is completely transparent, so we
5138 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005139 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005140
Daniel Dunbar17731772009-03-23 19:03:36 +00005141 // Claim some arguments which clang doesn't support, but we don't
5142 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005143 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5144 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005145
Rafael Espindolab0092d72013-09-04 19:37:35 +00005146 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005147 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005148}
5149
John McCall5fb5df92012-06-20 06:18:46 +00005150/// Add options related to the Objective-C runtime/ABI.
5151///
5152/// Returns true if the runtime is non-fragile.
5153ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5154 ArgStringList &cmdArgs,
5155 RewriteKind rewriteKind) const {
5156 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005157 Arg *runtimeArg =
5158 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5159 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005160
5161 // Just forward -fobjc-runtime= to the frontend. This supercedes
5162 // options about fragility.
5163 if (runtimeArg &&
5164 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5165 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005166 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005167 if (runtime.tryParse(value)) {
5168 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005170 }
5171
5172 runtimeArg->render(args, cmdArgs);
5173 return runtime;
5174 }
5175
5176 // Otherwise, we'll need the ABI "version". Version numbers are
5177 // slightly confusing for historical reasons:
5178 // 1 - Traditional "fragile" ABI
5179 // 2 - Non-fragile ABI, version 1
5180 // 3 - Non-fragile ABI, version 2
5181 unsigned objcABIVersion = 1;
5182 // If -fobjc-abi-version= is present, use that to set the version.
5183 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005184 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005185 if (value == "1")
5186 objcABIVersion = 1;
5187 else if (value == "2")
5188 objcABIVersion = 2;
5189 else if (value == "3")
5190 objcABIVersion = 3;
5191 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005193 } else {
5194 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005195 bool nonFragileABIIsDefault =
5196 (rewriteKind == RK_NonFragile ||
5197 (rewriteKind == RK_None &&
5198 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005199 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5200 options::OPT_fno_objc_nonfragile_abi,
5201 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005202// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005203#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5204 unsigned nonFragileABIVersion = 1;
5205#else
5206 unsigned nonFragileABIVersion = 2;
5207#endif
5208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005209 if (Arg *abiArg =
5210 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005211 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005212 if (value == "1")
5213 nonFragileABIVersion = 1;
5214 else if (value == "2")
5215 nonFragileABIVersion = 2;
5216 else
5217 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005218 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005219 }
5220
5221 objcABIVersion = 1 + nonFragileABIVersion;
5222 } else {
5223 objcABIVersion = 1;
5224 }
5225 }
5226
5227 // We don't actually care about the ABI version other than whether
5228 // it's non-fragile.
5229 bool isNonFragile = objcABIVersion != 1;
5230
5231 // If we have no runtime argument, ask the toolchain for its default runtime.
5232 // However, the rewriter only really supports the Mac runtime, so assume that.
5233 ObjCRuntime runtime;
5234 if (!runtimeArg) {
5235 switch (rewriteKind) {
5236 case RK_None:
5237 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5238 break;
5239 case RK_Fragile:
5240 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5241 break;
5242 case RK_NonFragile:
5243 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5244 break;
5245 }
5246
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005247 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005248 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5249 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005250 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005251 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005253 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005254 } else {
5255 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5256 }
5257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005258 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005259 } else {
5260 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005261 // Legacy behaviour is to target the gnustep runtime if we are i
5262 // non-fragile mode or the GCC runtime in fragile mode.
5263 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005264 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005265 else
5266 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005267 }
5268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005269 cmdArgs.push_back(
5270 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005271 return runtime;
5272}
5273
Reid Klecknerc542d372014-06-27 17:02:02 +00005274static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5275 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5276 I += HaveDash;
5277 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005278}
Reid Klecknerc542d372014-06-27 17:02:02 +00005279
5280struct EHFlags {
5281 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5282 bool Synch;
5283 bool Asynch;
5284 bool NoExceptC;
5285};
5286
5287/// /EH controls whether to run destructor cleanups when exceptions are
5288/// thrown. There are three modifiers:
5289/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5290/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5291/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5292/// - c: Assume that extern "C" functions are implicitly noexcept. This
5293/// modifier is an optimization, so we ignore it for now.
5294/// The default is /EHs-c-, meaning cleanups are disabled.
5295static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5296 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005297
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 std::vector<std::string> EHArgs =
5299 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005300 for (auto EHVal : EHArgs) {
5301 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5302 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303 case 'a':
5304 EH.Asynch = maybeConsumeDash(EHVal, I);
5305 continue;
5306 case 'c':
5307 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5308 continue;
5309 case 's':
5310 EH.Synch = maybeConsumeDash(EHVal, I);
5311 continue;
5312 default:
5313 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005314 }
5315 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5316 break;
5317 }
5318 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005319
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005320 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5321 // can use -Xclang to manually enable C++ EH until then.
5322 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005323
Reid Klecknerc542d372014-06-27 17:02:02 +00005324 return EH;
5325}
5326
Hans Wennborg75958c42013-08-08 00:17:41 +00005327void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5328 unsigned RTOptionID = options::OPT__SLASH_MT;
5329
Hans Wennborgf1a74252013-09-10 20:18:04 +00005330 if (Args.hasArg(options::OPT__SLASH_LDd))
5331 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5332 // but defining _DEBUG is sticky.
5333 RTOptionID = options::OPT__SLASH_MTd;
5334
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005335 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005336 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005337
David Majnemere2afb472015-07-24 06:49:13 +00005338 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005339 switch (RTOptionID) {
5340 case options::OPT__SLASH_MD:
5341 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005342 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005343 CmdArgs.push_back("-D_MT");
5344 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005345 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005346 break;
5347 case options::OPT__SLASH_MDd:
5348 CmdArgs.push_back("-D_DEBUG");
5349 CmdArgs.push_back("-D_MT");
5350 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005351 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005352 break;
5353 case options::OPT__SLASH_MT:
5354 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005355 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005356 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005357 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 break;
5359 case options::OPT__SLASH_MTd:
5360 CmdArgs.push_back("-D_DEBUG");
5361 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005362 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005363 break;
5364 default:
5365 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005366 }
5367
David Majnemere2afb472015-07-24 06:49:13 +00005368 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5369 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5370 } else {
5371 CmdArgs.push_back(FlagForCRT.data());
5372
5373 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5374 // users want. The /Za flag to cl.exe turns this off, but it's not
5375 // implemented in clang.
5376 CmdArgs.push_back("--dependent-lib=oldnames");
5377 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005378
Hans Wennborg8858a032014-07-21 23:42:07 +00005379 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5380 // would produce interleaved output, so ignore /showIncludes in such cases.
5381 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5382 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5383 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005384
David Majnemerf6072342014-07-01 22:24:56 +00005385 // This controls whether or not we emit RTTI data for polymorphic types.
5386 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5387 /*default=*/false))
5388 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005389
Reid Kleckner124955a2015-08-05 18:51:13 +00005390 // Emit CodeView if -Z7 is present.
5391 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5392 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5393 // If we are emitting CV but not DWARF, don't build information that LLVM
5394 // can't yet process.
5395 if (EmitCodeView && !EmitDwarf)
5396 CmdArgs.push_back("-gline-tables-only");
5397 if (EmitCodeView)
5398 CmdArgs.push_back("-gcodeview");
5399
Reid Klecknerc542d372014-06-27 17:02:02 +00005400 const Driver &D = getToolChain().getDriver();
5401 EHFlags EH = parseClangCLEHFlags(D, Args);
5402 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005403 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005404 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005405 CmdArgs.push_back("-fexceptions");
5406 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005407
Hans Wennborge50cec32014-06-13 20:59:54 +00005408 // /EP should expand to -E -P.
5409 if (Args.hasArg(options::OPT__SLASH_EP)) {
5410 CmdArgs.push_back("-E");
5411 CmdArgs.push_back("-P");
5412 }
5413
David Majnemera5b195a2015-02-14 01:35:12 +00005414 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005415 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5416 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005417 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5418 else
5419 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5420
5421 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5422 VolatileOptionID = A->getOption().getID();
5423
5424 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5425 CmdArgs.push_back("-fms-volatile");
5426
David Majnemer86c318f2014-02-11 21:05:00 +00005427 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5428 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5429 if (MostGeneralArg && BestCaseArg)
5430 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5431 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5432
5433 if (MostGeneralArg) {
5434 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5435 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5436 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5437
5438 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5439 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5440 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5441 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5442 << FirstConflict->getAsString(Args)
5443 << SecondConflict->getAsString(Args);
5444
5445 if (SingleArg)
5446 CmdArgs.push_back("-fms-memptr-rep=single");
5447 else if (MultipleArg)
5448 CmdArgs.push_back("-fms-memptr-rep=multiple");
5449 else
5450 CmdArgs.push_back("-fms-memptr-rep=virtual");
5451 }
5452
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005453 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5454 A->render(Args, CmdArgs);
5455
Hans Wennborg81f74482013-09-10 01:07:07 +00005456 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5457 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005458 if (Args.hasArg(options::OPT__SLASH_fallback))
5459 CmdArgs.push_back("msvc-fallback");
5460 else
5461 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005462 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005463}
5464
Douglas Katzman95354292015-06-23 20:42:09 +00005465visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005466 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005467 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005468 return CLFallback.get();
5469}
5470
Daniel Sanders7f933f42015-01-30 17:35:23 +00005471void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5472 ArgStringList &CmdArgs) const {
5473 StringRef CPUName;
5474 StringRef ABIName;
5475 const llvm::Triple &Triple = getToolChain().getTriple();
5476 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5477
5478 CmdArgs.push_back("-target-abi");
5479 CmdArgs.push_back(ABIName.data());
5480}
5481
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005482void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005483 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005484 const ArgList &Args,
5485 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005486 ArgStringList CmdArgs;
5487
5488 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5489 const InputInfo &Input = Inputs[0];
5490
James Y Knight2db38f32015-08-15 03:45:25 +00005491 std::string TripleStr =
5492 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5493 const llvm::Triple Triple(TripleStr);
5494
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005495 // Don't warn about "clang -w -c foo.s"
5496 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005497 // and "clang -emit-llvm -c foo.s"
5498 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005499
Rafael Espindola577637a2015-01-03 00:06:04 +00005500 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005501
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005502 // Invoke ourselves in -cc1as mode.
5503 //
5504 // FIXME: Implement custom jobs for internal actions.
5505 CmdArgs.push_back("-cc1as");
5506
5507 // Add the "effective" target triple.
5508 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005509 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5510
5511 // Set the output mode, we currently only expect to be used as a real
5512 // assembler.
5513 CmdArgs.push_back("-filetype");
5514 CmdArgs.push_back("obj");
5515
Eric Christopher45f2e712012-12-18 00:31:10 +00005516 // Set the main file name, so that debug info works even with
5517 // -save-temps or preprocessed assembly.
5518 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005519 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005520
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005521 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005522 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005523 if (!CPU.empty()) {
5524 CmdArgs.push_back("-target-cpu");
5525 CmdArgs.push_back(Args.MakeArgString(CPU));
5526 }
5527
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005528 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005529 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005530
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005531 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005533
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005534 // Pass along any -I options so we get proper .include search paths.
5535 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5536
Eric Christopherfc3ee562012-01-10 00:38:01 +00005537 // Determine the original source input.
5538 const Action *SourceAction = &JA;
5539 while (SourceAction->getKind() != Action::InputClass) {
5540 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5541 SourceAction = SourceAction->getInputs()[0];
5542 }
5543
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005544 // Forward -g and handle debug info related flags, assuming we are dealing
5545 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005546 if (SourceAction->getType() == types::TY_Asm ||
5547 SourceAction->getType() == types::TY_PP_Asm) {
5548 Args.ClaimAllArgs(options::OPT_g_Group);
5549 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5550 if (!A->getOption().matches(options::OPT_g0))
5551 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005552
Douglas Katzman553927a2015-09-14 20:31:28 +00005553 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
5554 options::OPT_gdwarf_4))
5555 A->render(Args, CmdArgs);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005556
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005557 // Add the -fdebug-compilation-dir flag if needed.
5558 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005559
5560 // Set the AT_producer to the clang version when using the integrated
5561 // assembler on assembly source files.
5562 CmdArgs.push_back("-dwarf-debug-producer");
5563 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005564
5565 // And pass along -I options
5566 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005567 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005568
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005569 // Handle -fPIC et al -- the relocation-model affects the assembler
5570 // for some targets.
5571 llvm::Reloc::Model RelocationModel;
5572 unsigned PICLevel;
5573 bool IsPIE;
5574 std::tie(RelocationModel, PICLevel, IsPIE) =
5575 ParsePICArgs(getToolChain(), Triple, Args);
5576
5577 const char *RMName = RelocationModelName(RelocationModel);
5578 if (RMName) {
5579 CmdArgs.push_back("-mrelocation-model");
5580 CmdArgs.push_back(RMName);
5581 }
5582
Kevin Enderby292dc082011-12-22 19:31:58 +00005583 // Optionally embed the -cc1as level arguments into the debug info, for build
5584 // analysis.
5585 if (getToolChain().UseDwarfDebugFlags()) {
5586 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005587 for (const auto &Arg : Args)
5588 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005589
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005590 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005591 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5592 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005593 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005594 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005595 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005596 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005597 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005598 }
5599 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005600 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005601 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005602
5603 // FIXME: Add -static support, once we have it.
5604
Daniel Sanders7f933f42015-01-30 17:35:23 +00005605 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005606 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005607 default:
5608 break;
5609
5610 case llvm::Triple::mips:
5611 case llvm::Triple::mipsel:
5612 case llvm::Triple::mips64:
5613 case llvm::Triple::mips64el:
5614 AddMIPSTargetArgs(Args, CmdArgs);
5615 break;
5616 }
5617
David Blaikie372d9502014-01-17 03:17:40 +00005618 // Consume all the warning flags. Usually this would be handled more
5619 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5620 // doesn't handle that so rather than warning about unused flags that are
5621 // actually used, we'll lie by omission instead.
5622 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005623 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5624 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005625
David Blaikie9260ed62013-07-25 21:19:01 +00005626 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5627 getToolChain().getDriver());
5628
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005629 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005630
5631 assert(Output.isFilename() && "Unexpected lipo output.");
5632 CmdArgs.push_back("-o");
5633 CmdArgs.push_back(Output.getFilename());
5634
Daniel Dunbarb440f562010-08-02 02:38:21 +00005635 assert(Input.isFilename() && "Invalid input.");
5636 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005637
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005638 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005639 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005640
5641 // Handle the debug info splitting at object creation time if we're
5642 // creating an object.
5643 // TODO: Currently only works on linux with newer objcopy.
5644 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005645 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005646 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005647 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005648}
5649
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005650void GnuTool::anchor() {}
5651
Daniel Dunbara3246a02009-03-18 08:07:30 +00005652void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005653 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005654 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005655 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005656 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005657 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005658
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005659 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005660 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005661 // Don't forward any -g arguments to assembly steps.
5662 if (isa<AssembleJobAction>(JA) &&
5663 A->getOption().matches(options::OPT_g_Group))
5664 continue;
5665
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005666 // Don't forward any -W arguments to assembly and link steps.
5667 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5668 A->getOption().matches(options::OPT_W_Group))
5669 continue;
5670
Daniel Dunbar2da02722009-03-19 07:55:12 +00005671 // It is unfortunate that we have to claim here, as this means
5672 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005673 // platforms using a generic gcc, even if we are just using gcc
5674 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005675 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005676 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005677 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005678 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005679
Daniel Dunbar4e295052010-01-25 22:35:08 +00005680 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005681
5682 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005683 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005684 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005685 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005686 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005687 }
5688
Daniel Dunbar5716d872009-05-02 21:41:52 +00005689 // Try to force gcc to match the tool chain we want, if we recognize
5690 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005691 //
5692 // FIXME: The triple class should directly provide the information we want
5693 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005694 switch (getToolChain().getArch()) {
5695 default:
5696 break;
5697 case llvm::Triple::x86:
5698 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005699 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005700 break;
5701 case llvm::Triple::x86_64:
5702 case llvm::Triple::ppc64:
5703 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005704 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005705 break;
5706 case llvm::Triple::sparcel:
5707 CmdArgs.push_back("-EL");
5708 break;
5709 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005710
Daniel Dunbarb440f562010-08-02 02:38:21 +00005711 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005712 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005713 CmdArgs.push_back(Output.getFilename());
5714 } else {
5715 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005716 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005717 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005720
5721 // Only pass -x if gcc will understand it; otherwise hope gcc
5722 // understands the suffix correctly. The main use case this would go
5723 // wrong in is for linker inputs if they happened to have an odd
5724 // suffix; really the only way to get this to happen is a command
5725 // like '-x foobar a.c' which will treat a.c like a linker input.
5726 //
5727 // FIXME: For the linker case specifically, can we safely convert
5728 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005729 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005730 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005731 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5732 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005733 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005734 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005735 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005737 else if (II.getType() == types::TY_ModuleFile)
5738 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005739 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005740
Daniel Dunbara3246a02009-03-18 08:07:30 +00005741 if (types::canTypeBeUserSpecified(II.getType())) {
5742 CmdArgs.push_back("-x");
5743 CmdArgs.push_back(types::getTypeName(II.getType()));
5744 }
5745
Daniel Dunbarb440f562010-08-02 02:38:21 +00005746 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005747 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005748 else {
5749 const Arg &A = II.getInputArg();
5750
5751 // Reverse translate some rewritten options.
5752 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5753 CmdArgs.push_back("-lstdc++");
5754 continue;
5755 }
5756
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005757 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005758 A.render(Args, CmdArgs);
5759 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005760 }
5761
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005762 const std::string customGCCName = D.getCCCGenericGCCName();
5763 const char *GCCName;
5764 if (!customGCCName.empty())
5765 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005766 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005767 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005768 } else
5769 GCCName = "gcc";
5770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005771 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005772 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005773}
5774
Douglas Katzman95354292015-06-23 20:42:09 +00005775void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5776 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005777 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005778}
5779
Douglas Katzman95354292015-06-23 20:42:09 +00005780void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5781 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005782 const Driver &D = getToolChain().getDriver();
5783
Eric Christophercc7ff502015-01-29 00:56:17 +00005784 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005785 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005786 case types::TY_LLVM_IR:
5787 case types::TY_LTO_IR:
5788 case types::TY_LLVM_BC:
5789 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005790 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005791 break;
5792 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005793 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005794 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005795 case types::TY_Nothing:
5796 CmdArgs.push_back("-fsyntax-only");
5797 break;
5798 default:
5799 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005800 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005801}
5802
Douglas Katzman95354292015-06-23 20:42:09 +00005803void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5804 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005805 // The types are (hopefully) good enough.
5806}
5807
Tony Linthicum76329bf2011-12-12 21:14:55 +00005808// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005809void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5810 ArgStringList &CmdArgs) const {}
5811void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5812 const InputInfo &Output,
5813 const InputInfoList &Inputs,
5814 const ArgList &Args,
5815 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005816 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005817
5818 const Driver &D = getToolChain().getDriver();
5819 ArgStringList CmdArgs;
5820
5821 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005822 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005823 CmdArgs.push_back(Args.MakeArgString(MarchString));
5824
5825 RenderExtraToolArgs(JA, CmdArgs);
5826
5827 if (Output.isFilename()) {
5828 CmdArgs.push_back("-o");
5829 CmdArgs.push_back(Output.getFilename());
5830 } else {
5831 assert(Output.isNothing() && "Unexpected output");
5832 CmdArgs.push_back("-fsyntax-only");
5833 }
5834
Douglas Katzman54366072015-07-27 16:53:08 +00005835 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005836 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005837
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005838 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005839
Tony Linthicum76329bf2011-12-12 21:14:55 +00005840 // Only pass -x if gcc will understand it; otherwise hope gcc
5841 // understands the suffix correctly. The main use case this would go
5842 // wrong in is for linker inputs if they happened to have an odd
5843 // suffix; really the only way to get this to happen is a command
5844 // like '-x foobar a.c' which will treat a.c like a linker input.
5845 //
5846 // FIXME: For the linker case specifically, can we safely convert
5847 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005848 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849 // Don't try to pass LLVM or AST inputs to a generic gcc.
5850 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5851 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5852 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005853 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005854 else if (II.getType() == types::TY_AST)
5855 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005856 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005857 else if (II.getType() == types::TY_ModuleFile)
5858 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860
5861 if (II.isFilename())
5862 CmdArgs.push_back(II.getFilename());
5863 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 // Don't render as input, we need gcc to do the translations.
5865 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005866 II.getInputArg().render(Args, CmdArgs);
5867 }
5868
5869 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005870 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005872}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005873
Douglas Katzman95354292015-06-23 20:42:09 +00005874void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5875 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005876 // The types are (hopefully) good enough.
5877}
5878
Douglas Katzman54366072015-07-27 16:53:08 +00005879static void
5880constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5881 const toolchains::HexagonToolChain &ToolChain,
5882 const InputInfo &Output, const InputInfoList &Inputs,
5883 const ArgList &Args, ArgStringList &CmdArgs,
5884 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005885
Matthew Curtise689b052012-12-06 15:46:07 +00005886 const Driver &D = ToolChain.getDriver();
5887
Matthew Curtise689b052012-12-06 15:46:07 +00005888 //----------------------------------------------------------------------------
5889 //
5890 //----------------------------------------------------------------------------
5891 bool hasStaticArg = Args.hasArg(options::OPT_static);
5892 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005893 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005894 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5895 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5896 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005897 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005898 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005899
Matthew Curtise689b052012-12-06 15:46:07 +00005900 //----------------------------------------------------------------------------
5901 // Silence warnings for various options
5902 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005903
Matthew Curtise689b052012-12-06 15:46:07 +00005904 Args.ClaimAllArgs(options::OPT_g_Group);
5905 Args.ClaimAllArgs(options::OPT_emit_llvm);
5906 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5907 // handled somewhere else.
5908 Args.ClaimAllArgs(options::OPT_static_libgcc);
5909
5910 //----------------------------------------------------------------------------
5911 //
5912 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005913 for (const auto &Opt : ToolChain.ExtraOpts)
5914 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005915
Douglas Katzman54366072015-07-27 16:53:08 +00005916 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005917 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005918
Matthew Curtise689b052012-12-06 15:46:07 +00005919 if (buildingLib) {
5920 CmdArgs.push_back("-shared");
5921 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5922 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005923 }
5924
Matthew Curtise689b052012-12-06 15:46:07 +00005925 if (hasStaticArg)
5926 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005927
Matthew Curtise8f80a12012-12-06 17:49:03 +00005928 if (buildPIE && !buildingLib)
5929 CmdArgs.push_back("-pie");
5930
Douglas Katzman54366072015-07-27 16:53:08 +00005931 if (const char *v =
5932 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005933 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005934 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005935 }
5936
Matthew Curtise689b052012-12-06 15:46:07 +00005937 //----------------------------------------------------------------------------
5938 //
5939 //----------------------------------------------------------------------------
5940 CmdArgs.push_back("-o");
5941 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005942
Matthew Curtise689b052012-12-06 15:46:07 +00005943 const std::string MarchSuffix = "/" + MarchString;
5944 const std::string G0Suffix = "/G0";
5945 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005946 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005947 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005948 const std::string StartFilesDir =
5949 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005950
5951 //----------------------------------------------------------------------------
5952 // moslib
5953 //----------------------------------------------------------------------------
5954 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005955 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005956
Sean Silva14facf32015-06-09 01:57:17 +00005957 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5958 A->claim();
5959 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005960 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005961 }
Matthew Curtise689b052012-12-06 15:46:07 +00005962 if (oslibs.empty()) {
5963 oslibs.push_back("standalone");
5964 hasStandalone = true;
5965 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005966
Matthew Curtise689b052012-12-06 15:46:07 +00005967 //----------------------------------------------------------------------------
5968 // Start Files
5969 //----------------------------------------------------------------------------
5970 if (incStdLib && incStartFiles) {
5971
5972 if (!buildingLib) {
5973 if (hasStandalone) {
5974 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005975 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005976 }
5977 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5978 }
5979 std::string initObj = useShared ? "/initS.o" : "/init.o";
5980 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5981 }
5982
5983 //----------------------------------------------------------------------------
5984 // Library Search Paths
5985 //----------------------------------------------------------------------------
5986 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005987 for (const auto &LibPath : LibPaths)
5988 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005989
5990 //----------------------------------------------------------------------------
5991 //
5992 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005993 Args.AddAllArgs(CmdArgs,
5994 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
5995 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00005996
5997 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5998
5999 //----------------------------------------------------------------------------
6000 // Libraries
6001 //----------------------------------------------------------------------------
6002 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006003 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006004 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6005 CmdArgs.push_back("-lm");
6006 }
6007
6008 CmdArgs.push_back("--start-group");
6009
6010 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006011 for (const std::string &Lib : oslibs)
6012 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006013 CmdArgs.push_back("-lc");
6014 }
6015 CmdArgs.push_back("-lgcc");
6016
6017 CmdArgs.push_back("--end-group");
6018 }
6019
6020 //----------------------------------------------------------------------------
6021 // End files
6022 //----------------------------------------------------------------------------
6023 if (incStdLib && incStartFiles) {
6024 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6025 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6026 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006027}
6028
Douglas Katzman95354292015-06-23 20:42:09 +00006029void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6030 const InputInfo &Output,
6031 const InputInfoList &Inputs,
6032 const ArgList &Args,
6033 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006034
Douglas Katzman54366072015-07-27 16:53:08 +00006035 const toolchains::HexagonToolChain &ToolChain =
6036 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006037
6038 ArgStringList CmdArgs;
6039 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6040 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006041
6042 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006043 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006044 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006045}
6046// Hexagon tools end.
6047
Tom Stellard8fa33092015-07-18 01:49:05 +00006048void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6049 const InputInfo &Output,
6050 const InputInfoList &Inputs,
6051 const ArgList &Args,
6052 const char *LinkingOutput) const {
6053
6054 std::string Linker = getToolChain().GetProgramPath(getShortName());
6055 ArgStringList CmdArgs;
6056 CmdArgs.push_back("-flavor");
6057 CmdArgs.push_back("gnu");
6058 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006059 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006060 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6061 CmdArgs.push_back("-o");
6062 CmdArgs.push_back(Output.getFilename());
6063 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6064 CmdArgs, Inputs));
6065}
6066// AMDGPU tools end.
6067
Renato Golin7c542b42015-07-27 23:44:45 +00006068const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006069 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006070 if (!Arch.empty())
6071 MArch = Arch;
6072 else
Bernard Ogden31561762013-12-12 13:27:11 +00006073 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006074 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006075
6076 // Handle -march=native.
6077 if (MArch == "native") {
6078 std::string CPU = llvm::sys::getHostCPUName();
6079 if (CPU != "generic") {
6080 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006081 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006082 // If there is no valid architecture suffix for this CPU we don't know how
6083 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006084 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006085 MArch = "";
6086 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006087 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006088 }
6089 }
6090
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006091 return MArch;
6092}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006093
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006094/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006095StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006096 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006097 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6098 // here means an -march=native that we can't handle, so instead return no CPU.
6099 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006100 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006101
John Brawna95c1a82015-05-08 12:52:18 +00006102 // We need to return an empty string here on invalid MArch values as the
6103 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006104 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006105}
6106
6107/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006108std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006109 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006110 // FIXME: Warn on inconsistent use of -mcpu and -march.
6111 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006112 if (!CPU.empty()) {
6113 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006114 // Handle -mcpu=native.
6115 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006116 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006117 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006118 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006119 }
6120
Renato Goline17c5802015-07-27 23:44:42 +00006121 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006122}
6123
6124/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006125/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006126// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006127StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6128 const llvm::Triple &Triple) {
6129 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006130 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006131 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006132 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006133 if (ArchKind == llvm::ARM::AK_INVALID)
6134 // In case of generic Arch, i.e. "arm",
6135 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006136 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006137 } else {
6138 ArchKind = llvm::ARM::parseCPUArch(CPU);
6139 }
Renato Golin3c007252015-05-28 15:05:53 +00006140 if (ArchKind == llvm::ARM::AK_INVALID)
6141 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006142 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006143}
6144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006145void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006146 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006147 if (Args.hasArg(options::OPT_r))
6148 return;
6149
John Brawn94fd9632015-05-21 12:19:49 +00006150 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6151 // to generate BE-8 executables.
6152 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6153 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006154}
6155
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006156mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006157 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6158 // was first introduced in Release 3. However, other compilers have
6159 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006160 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6161 .Case("mips1", NanLegacy)
6162 .Case("mips2", NanLegacy)
6163 .Case("mips3", NanLegacy)
6164 .Case("mips4", NanLegacy)
6165 .Case("mips5", NanLegacy)
6166 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006167 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006168 .Case("mips32r3", NanLegacy | Nan2008)
6169 .Case("mips32r5", NanLegacy | Nan2008)
6170 .Case("mips32r6", Nan2008)
6171 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006172 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006173 .Case("mips64r3", NanLegacy | Nan2008)
6174 .Case("mips64r5", NanLegacy | Nan2008)
6175 .Case("mips64r6", Nan2008)
6176 .Default(NanLegacy);
6177}
6178
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006179bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6180 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6181 return A && (A->getValue() == StringRef(Value));
6182}
6183
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006184bool mips::isUCLibc(const ArgList &Args) {
6185 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006186 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006187}
6188
Daniel Sanders2bf13662014-07-10 14:40:57 +00006189bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006190 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6191 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006192 .Case("2008", true)
6193 .Case("legacy", false)
6194 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006195
6196 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006197 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006198 .Cases("mips32r6", "mips64r6", true)
6199 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006200
6201 return false;
6202}
6203
Daniel Sanders379d44b2014-07-16 11:52:23 +00006204bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006205 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006206 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006207 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006208 return false;
6209
6210 if (ABIName != "32")
6211 return false;
6212
Toma Tabacu94ea6862015-06-16 13:54:13 +00006213 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6214 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006215 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006216 return false;
6217
Daniel Sanders379d44b2014-07-16 11:52:23 +00006218 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006219 .Cases("mips2", "mips3", "mips4", "mips5", true)
6220 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6221 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6222 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006223}
6224
Toma Tabacu94ea6862015-06-16 13:54:13 +00006225bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6226 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006227 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006228 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6229
6230 // FPXX shouldn't be used if -msingle-float is present.
6231 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6232 options::OPT_mdouble_float))
6233 if (A->getOption().matches(options::OPT_msingle_float))
6234 UseFPXX = false;
6235
6236 return UseFPXX;
6237}
6238
Tim Northover157d9112014-01-16 08:48:16 +00006239llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006240 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6241 // archs which Darwin doesn't use.
6242
6243 // The matching this routine does is fairly pointless, since it is neither the
6244 // complete architecture list, nor a reasonable subset. The problem is that
6245 // historically the driver driver accepts this and also ties its -march=
6246 // handling to the architecture name, so we need to be careful before removing
6247 // support for it.
6248
6249 // This code must be kept in sync with Clang's Darwin specific argument
6250 // translation.
6251
6252 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006253 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6254 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6255 .Case("ppc64", llvm::Triple::ppc64)
6256 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6257 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6258 llvm::Triple::x86)
6259 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6260 // This is derived from the driver driver.
6261 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6262 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6263 .Cases("armv7s", "xscale", llvm::Triple::arm)
6264 .Case("arm64", llvm::Triple::aarch64)
6265 .Case("r600", llvm::Triple::r600)
6266 .Case("amdgcn", llvm::Triple::amdgcn)
6267 .Case("nvptx", llvm::Triple::nvptx)
6268 .Case("nvptx64", llvm::Triple::nvptx64)
6269 .Case("amdil", llvm::Triple::amdil)
6270 .Case("spir", llvm::Triple::spir)
6271 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006272}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006273
Tim Northover157d9112014-01-16 08:48:16 +00006274void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006275 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006276 T.setArch(Arch);
6277
6278 if (Str == "x86_64h")
6279 T.setArchName(Str);
6280 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6281 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006282 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006283 }
6284}
6285
Bob Wilsondecc03e2012-11-23 06:14:39 +00006286const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006287 const InputInfo &Input) {
6288 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006289}
6290
Bob Wilsondecc03e2012-11-23 06:14:39 +00006291const char *Clang::getBaseInputStem(const ArgList &Args,
6292 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006293 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006294
Chris Lattner906bb902011-01-16 08:14:11 +00006295 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006296 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006297
6298 return Str;
6299}
6300
Bob Wilsondecc03e2012-11-23 06:14:39 +00006301const char *Clang::getDependencyFileName(const ArgList &Args,
6302 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006303 // FIXME: Think about this more.
6304 std::string Res;
6305
6306 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006307 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006308 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006309 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006310 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006311 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006312 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006313}
6314
Douglas Katzman95354292015-06-23 20:42:09 +00006315void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6316 const InputInfo &Output,
6317 const InputInfoList &Inputs,
6318 const ArgList &Args,
6319 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006320 const ToolChain &ToolChain = getToolChain();
6321 const Driver &D = ToolChain.getDriver();
6322 ArgStringList CmdArgs;
6323
6324 // Silence warning for "clang -g foo.o -o foo"
6325 Args.ClaimAllArgs(options::OPT_g_Group);
6326 // and "clang -emit-llvm foo.o -o foo"
6327 Args.ClaimAllArgs(options::OPT_emit_llvm);
6328 // and for "clang -w foo.o -o foo". Other warning options are already
6329 // handled somewhere else.
6330 Args.ClaimAllArgs(options::OPT_w);
6331
6332 if (!D.SysRoot.empty())
6333 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6334
6335 // CloudABI only supports static linkage.
6336 CmdArgs.push_back("-Bstatic");
6337 CmdArgs.push_back("--eh-frame-hdr");
6338 CmdArgs.push_back("--gc-sections");
6339
6340 if (Output.isFilename()) {
6341 CmdArgs.push_back("-o");
6342 CmdArgs.push_back(Output.getFilename());
6343 } else {
6344 assert(Output.isNothing() && "Invalid output.");
6345 }
6346
6347 if (!Args.hasArg(options::OPT_nostdlib) &&
6348 !Args.hasArg(options::OPT_nostartfiles)) {
6349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6350 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6351 }
6352
6353 Args.AddAllArgs(CmdArgs, options::OPT_L);
6354 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6355 for (const auto &Path : Paths)
6356 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006357 Args.AddAllArgs(CmdArgs,
6358 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6359 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006360
Alexey Samsonov907880e2015-06-19 19:57:46 +00006361 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006362 AddGoldPlugin(ToolChain, Args, CmdArgs);
6363
6364 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6365
6366 if (!Args.hasArg(options::OPT_nostdlib) &&
6367 !Args.hasArg(options::OPT_nodefaultlibs)) {
6368 if (D.CCCIsCXX())
6369 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6370 CmdArgs.push_back("-lc");
6371 CmdArgs.push_back("-lcompiler_rt");
6372 }
6373
6374 if (!Args.hasArg(options::OPT_nostdlib) &&
6375 !Args.hasArg(options::OPT_nostartfiles))
6376 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6377
6378 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006380}
6381
Douglas Katzman95354292015-06-23 20:42:09 +00006382void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6383 const InputInfo &Output,
6384 const InputInfoList &Inputs,
6385 const ArgList &Args,
6386 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006387 ArgStringList CmdArgs;
6388
6389 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6390 const InputInfo &Input = Inputs[0];
6391
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006392 // Determine the original source input.
6393 const Action *SourceAction = &JA;
6394 while (SourceAction->getKind() != Action::InputClass) {
6395 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6396 SourceAction = SourceAction->getInputs()[0];
6397 }
6398
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006399 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006400 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006401 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6402 // FIXME: at run-time detect assembler capabilities or rely on version
6403 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006404 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006405 const llvm::Triple &T(getToolChain().getTriple());
6406 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006407 CmdArgs.push_back("-Q");
6408 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006409
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006410 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006411 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006412 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006413 if (Args.hasArg(options::OPT_gstabs))
6414 CmdArgs.push_back("--gstabs");
6415 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006416 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006417 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006418
Daniel Dunbarbe220842009-03-20 16:06:39 +00006419 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006420 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006421
Daniel Dunbar6d484762010-07-22 01:47:22 +00006422 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006423 if (getToolChain().getArch() == llvm::Triple::x86 ||
6424 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006425 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6426 CmdArgs.push_back("-force_cpusubtype_ALL");
6427
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006428 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006429 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006430 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006431 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006432 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006433 CmdArgs.push_back("-static");
6434
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006435 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006436
6437 assert(Output.isFilename() && "Unexpected lipo output.");
6438 CmdArgs.push_back("-o");
6439 CmdArgs.push_back(Output.getFilename());
6440
Daniel Dunbarb440f562010-08-02 02:38:21 +00006441 assert(Input.isFilename() && "Invalid input.");
6442 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006443
6444 // asm_final spec is empty.
6445
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006446 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006447 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006448}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006449
Tim Northover157d9112014-01-16 08:48:16 +00006450void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006451
Tim Northover157d9112014-01-16 08:48:16 +00006452void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6453 ArgStringList &CmdArgs) const {
6454 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006455
Daniel Dunbarc1964212009-03-26 16:23:12 +00006456 // Derived from darwin_arch spec.
6457 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006458 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006459
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006460 // FIXME: Is this needed anymore?
6461 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006462 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006463}
6464
Douglas Katzman95354292015-06-23 20:42:09 +00006465bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006466 // We only need to generate a temp path for LTO if we aren't compiling object
6467 // files. When compiling source files, we run 'dsymutil' after linking. We
6468 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006469 for (const auto &Input : Inputs)
6470 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006471 return true;
6472
6473 return false;
6474}
6475
Douglas Katzman95354292015-06-23 20:42:09 +00006476void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6477 ArgStringList &CmdArgs,
6478 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006479 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006480 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006482 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006483 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6484 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006485 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6486 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006487 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006488 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006489 }
6490
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006491 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006492 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006493 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6494 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006495
Bob Wilson3d27dad2013-08-02 22:25:34 +00006496 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6497 CmdArgs.push_back("-export_dynamic");
6498
Bob Wilsonb111ec92015-03-02 19:01:14 +00006499 // If we are using App Extension restrictions, pass a flag to the linker
6500 // telling it that the compiled code has been audited.
6501 if (Args.hasFlag(options::OPT_fapplication_extension,
6502 options::OPT_fno_application_extension, false))
6503 CmdArgs.push_back("-application_extension");
6504
Bruno Cardoso Lopesf3742a72015-09-30 20:11:02 +00006505 // If we are using LTO, then automatically create a temporary file path for
6506 // the linker to use, so that it's lifetime will extend past a possible
6507 // dsymutil step.
6508 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
6509 const char *TmpPath = C.getArgs().MakeArgString(
6510 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6511 C.addTempFile(TmpPath);
6512 CmdArgs.push_back("-object_path_lto");
6513 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006514 }
6515
Daniel Dunbarc1964212009-03-26 16:23:12 +00006516 // Derived from the "link" spec.
6517 Args.AddAllArgs(CmdArgs, options::OPT_static);
6518 if (!Args.hasArg(options::OPT_static))
6519 CmdArgs.push_back("-dynamic");
6520 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6521 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6522 // here. How do we wish to handle such things?
6523 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006524
Daniel Dunbarc1964212009-03-26 16:23:12 +00006525 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006526 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006527 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006528 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006529
6530 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6531 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6532 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6533
6534 Arg *A;
6535 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6536 (A = Args.getLastArg(options::OPT_current__version)) ||
6537 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006538 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6539 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006540
6541 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6542 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6543 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6544 } else {
6545 CmdArgs.push_back("-dylib");
6546
6547 Arg *A;
6548 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6549 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6550 (A = Args.getLastArg(options::OPT_client__name)) ||
6551 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6552 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6553 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006554 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6555 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006556
Daniel Dunbarc1964212009-03-26 16:23:12 +00006557 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6558 "-dylib_compatibility_version");
6559 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6560 "-dylib_current_version");
6561
Tim Northover157d9112014-01-16 08:48:16 +00006562 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006563
6564 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6565 "-dylib_install_name");
6566 }
6567
6568 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6569 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6570 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006571 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006572 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006573 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6574 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6575 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6576 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6577 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6578 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006579 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006580 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6581 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6582 Args.AddAllArgs(CmdArgs, options::OPT_init);
6583
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006584 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006585 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006586
Daniel Dunbarc1964212009-03-26 16:23:12 +00006587 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6588 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6589 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6590 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6591 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006593 if (const Arg *A =
6594 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6595 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006596 if (A->getOption().matches(options::OPT_fpie) ||
6597 A->getOption().matches(options::OPT_fPIE))
6598 CmdArgs.push_back("-pie");
6599 else
6600 CmdArgs.push_back("-no_pie");
6601 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006602
6603 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6604 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6605 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6606 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6607 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6608 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6609 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6610 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6611 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6612 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6613 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6614 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6615 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6616 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6617 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6618 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006619
Daniel Dunbar84384642011-05-02 21:03:47 +00006620 // Give --sysroot= preference, over the Apple specific behavior to also use
6621 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006622 StringRef sysroot = C.getSysRoot();
6623 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006624 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006625 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006626 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6627 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006628 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006629 }
6630
Daniel Dunbarc1964212009-03-26 16:23:12 +00006631 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6632 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6633 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6634 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6635 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006636 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006637 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6638 Args.AddAllArgs(CmdArgs, options::OPT_y);
6639 Args.AddLastArg(CmdArgs, options::OPT_w);
6640 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6641 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6642 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6643 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6644 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6645 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6646 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6647 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6648 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6649 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6650 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6651 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6652}
6653
Douglas Katzman95354292015-06-23 20:42:09 +00006654void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6655 const InputInfo &Output,
6656 const InputInfoList &Inputs,
6657 const ArgList &Args,
6658 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006659 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006660
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006661 // If the number of arguments surpasses the system limits, we will encode the
6662 // input files in a separate file, shortening the command line. To this end,
6663 // build a list of input file names that can be passed via a file with the
6664 // -filelist linker option.
6665 llvm::opt::ArgStringList InputFileList;
6666
Daniel Dunbarc1964212009-03-26 16:23:12 +00006667 // The logic here is derived from gcc's behavior; most of which
6668 // comes from specs (starting with link_command). Consult gcc for
6669 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006670 ArgStringList CmdArgs;
6671
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006672 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6673 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6674 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006675 for (const auto &Arg : Args)
6676 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006677 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006678 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006679 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006680 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006681 return;
6682 }
6683
Daniel Dunbarc1964212009-03-26 16:23:12 +00006684 // I'm not sure why this particular decomposition exists in gcc, but
6685 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006686 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006687
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006688 // It seems that the 'e' option is completely ignored for dynamic executables
6689 // (the default), and with static executables, the last one wins, as expected.
6690 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6691 options::OPT_Z_Flag, options::OPT_u_Group,
6692 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006693
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006694 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6695 // members of static archive libraries which implement Objective-C classes or
6696 // categories.
6697 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6698 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006699
Daniel Dunbarc1964212009-03-26 16:23:12 +00006700 CmdArgs.push_back("-o");
6701 CmdArgs.push_back(Output.getFilename());
6702
Chad Rosier06fd3c62012-05-16 23:45:12 +00006703 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006704 !Args.hasArg(options::OPT_nostartfiles))
6705 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006706
Peter Collingbournec4122c12015-06-15 21:08:13 +00006707 // SafeStack requires its own runtime libraries
6708 // These libraries should be linked first, to make sure the
6709 // __safestack_init constructor executes before everything else
6710 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6711 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6712 "libclang_rt.safestack_osx.a",
6713 /*AlwaysLink=*/true);
6714 }
6715
Daniel Dunbarc1964212009-03-26 16:23:12 +00006716 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006717
Douglas Gregor9295df02012-05-15 21:00:27 +00006718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006719 // Build the input file for -filelist (list of linker input files) in case we
6720 // need it later
6721 for (const auto &II : Inputs) {
6722 if (!II.isFilename()) {
6723 // This is a linker input argument.
6724 // We cannot mix input arguments and file names in a -filelist input, thus
6725 // we prematurely stop our list (remaining files shall be passed as
6726 // arguments).
6727 if (InputFileList.size() > 0)
6728 break;
6729
6730 continue;
6731 }
6732
6733 InputFileList.push_back(II.getFilename());
6734 }
6735
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006736 if (!Args.hasArg(options::OPT_nostdlib) &&
6737 !Args.hasArg(options::OPT_nodefaultlibs))
6738 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6739
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006740 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006741 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006742 // We use arclite library for both ARC and subscripting support.
6743 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6744
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006745 CmdArgs.push_back("-framework");
6746 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006747 // Link libobj.
6748 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006749 }
John McCall31168b02011-06-15 23:02:42 +00006750
Daniel Dunbarc1964212009-03-26 16:23:12 +00006751 if (LinkingOutput) {
6752 CmdArgs.push_back("-arch_multiple");
6753 CmdArgs.push_back("-final_output");
6754 CmdArgs.push_back(LinkingOutput);
6755 }
6756
Daniel Dunbarc1964212009-03-26 16:23:12 +00006757 if (Args.hasArg(options::OPT_fnested_functions))
6758 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006759
Justin Bognerc7701242015-05-12 05:44:36 +00006760 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6761 // paths are different enough from other toolchains that this needs a fair
6762 // amount of refactoring done first.
6763 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6764
Daniel Dunbarc1964212009-03-26 16:23:12 +00006765 if (!Args.hasArg(options::OPT_nostdlib) &&
6766 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006767 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006768 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006769
Daniel Dunbarc1964212009-03-26 16:23:12 +00006770 // link_ssp spec is empty.
6771
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006772 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006773 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006774 }
6775
Chad Rosier06fd3c62012-05-16 23:45:12 +00006776 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006777 !Args.hasArg(options::OPT_nostartfiles)) {
6778 // endfile_spec is empty.
6779 }
6780
6781 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6782 Args.AddAllArgs(CmdArgs, options::OPT_F);
6783
Steven Wu3ffb61b2015-02-06 18:08:29 +00006784 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006785 for (const Arg *A : Args.filtered(options::OPT_iframework))
6786 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006787
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006788 if (!Args.hasArg(options::OPT_nostdlib) &&
6789 !Args.hasArg(options::OPT_nodefaultlibs)) {
6790 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6791 if (A->getValue() == StringRef("Accelerate")) {
6792 CmdArgs.push_back("-framework");
6793 CmdArgs.push_back("Accelerate");
6794 }
6795 }
6796 }
6797
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006798 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006799 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006800 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006801 Cmd->setInputFileList(std::move(InputFileList));
6802 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006803}
6804
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006805void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006806 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006807 const InputInfoList &Inputs,
6808 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006809 const char *LinkingOutput) const {
6810 ArgStringList CmdArgs;
6811
6812 CmdArgs.push_back("-create");
6813 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006814
6815 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006816 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006817
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006818 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006819 assert(II.isFilename() && "Unexpected lipo input.");
6820 CmdArgs.push_back(II.getFilename());
6821 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006822
6823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006825}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006826
Daniel Dunbar88299622010-06-04 18:28:36 +00006827void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006828 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006829 const InputInfoList &Inputs,
6830 const ArgList &Args,
6831 const char *LinkingOutput) const {
6832 ArgStringList CmdArgs;
6833
Daniel Dunbareb86b042011-05-09 17:23:16 +00006834 CmdArgs.push_back("-o");
6835 CmdArgs.push_back(Output.getFilename());
6836
Daniel Dunbar88299622010-06-04 18:28:36 +00006837 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6838 const InputInfo &Input = Inputs[0];
6839 assert(Input.isFilename() && "Unexpected dsymutil input.");
6840 CmdArgs.push_back(Input.getFilename());
6841
Daniel Dunbar88299622010-06-04 18:28:36 +00006842 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006843 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006844 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006845}
6846
Eric Christopher551ef452011-08-23 17:56:55 +00006847void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006848 const InputInfo &Output,
6849 const InputInfoList &Inputs,
6850 const ArgList &Args,
6851 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006852 ArgStringList CmdArgs;
6853 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006854 CmdArgs.push_back("--debug-info");
6855 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006856 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006857
6858 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6859 const InputInfo &Input = Inputs[0];
6860 assert(Input.isFilename() && "Unexpected verify input");
6861
6862 // Grabbing the output of the earlier dsymutil run.
6863 CmdArgs.push_back(Input.getFilename());
6864
6865 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006866 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006867 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006868}
6869
Douglas Katzman95354292015-06-23 20:42:09 +00006870void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006871 const InputInfo &Output,
6872 const InputInfoList &Inputs,
6873 const ArgList &Args,
6874 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006875 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006876 ArgStringList CmdArgs;
6877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006878 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006879
6880 CmdArgs.push_back("-o");
6881 CmdArgs.push_back(Output.getFilename());
6882
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006883 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006884 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006886 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006887 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006888}
6889
Douglas Katzman95354292015-06-23 20:42:09 +00006890void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6891 const InputInfo &Output,
6892 const InputInfoList &Inputs,
6893 const ArgList &Args,
6894 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006895 ArgStringList CmdArgs;
6896
David Chisnall272a0712012-02-29 15:06:12 +00006897 // Demangle C++ names in errors
6898 CmdArgs.push_back("-C");
6899
David Chisnallf571cde2012-02-15 13:39:01 +00006900 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6901 (!Args.hasArg(options::OPT_shared))) {
6902 CmdArgs.push_back("-e");
6903 CmdArgs.push_back("_start");
6904 }
6905
6906 if (Args.hasArg(options::OPT_static)) {
6907 CmdArgs.push_back("-Bstatic");
6908 CmdArgs.push_back("-dn");
6909 } else {
6910 CmdArgs.push_back("-Bdynamic");
6911 if (Args.hasArg(options::OPT_shared)) {
6912 CmdArgs.push_back("-shared");
6913 } else {
6914 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006915 CmdArgs.push_back(
6916 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006917 }
6918 }
6919
6920 if (Output.isFilename()) {
6921 CmdArgs.push_back("-o");
6922 CmdArgs.push_back(Output.getFilename());
6923 } else {
6924 assert(Output.isNothing() && "Invalid output.");
6925 }
6926
6927 if (!Args.hasArg(options::OPT_nostdlib) &&
6928 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006929 if (!Args.hasArg(options::OPT_shared))
6930 CmdArgs.push_back(
6931 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6932
6933 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6934 CmdArgs.push_back(
6935 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6936 CmdArgs.push_back(
6937 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006938 }
6939
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006940 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6941 for (const auto &Path : Paths)
6942 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006943
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006944 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6945 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006946
6947 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6948
6949 if (!Args.hasArg(options::OPT_nostdlib) &&
6950 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006951 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006952 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006953 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00006954 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006955 if (!Args.hasArg(options::OPT_shared)) {
6956 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00006957 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006958 }
David Chisnallf571cde2012-02-15 13:39:01 +00006959 }
6960
6961 if (!Args.hasArg(options::OPT_nostdlib) &&
6962 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006963 CmdArgs.push_back(
6964 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006965 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006966 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006967
Alexey Samsonov7811d192014-02-20 13:57:37 +00006968 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006970 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006971 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006972}
6973
Douglas Katzman95354292015-06-23 20:42:09 +00006974void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6975 const InputInfo &Output,
6976 const InputInfoList &Inputs,
6977 const ArgList &Args,
6978 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006979 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006980 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006981 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006982
Rafael Espindolacc126272014-02-28 01:55:21 +00006983 switch (getToolChain().getArch()) {
6984 case llvm::Triple::x86:
6985 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
6986 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006987 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00006988 break;
6989
6990 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006991 CmdArgs.push_back("-mppc");
6992 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00006993 break;
6994
6995 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006996 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00006997 CmdArgs.push_back("-32");
6998 NeedsKPIC = true;
6999 break;
7000
7001 case llvm::Triple::sparcv9:
7002 CmdArgs.push_back("-64");
7003 CmdArgs.push_back("-Av9a");
7004 NeedsKPIC = true;
7005 break;
7006
7007 case llvm::Triple::mips64:
7008 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007009 StringRef CPUName;
7010 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007011 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007012
7013 CmdArgs.push_back("-mabi");
7014 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7015
7016 if (getToolChain().getArch() == llvm::Triple::mips64)
7017 CmdArgs.push_back("-EB");
7018 else
7019 CmdArgs.push_back("-EL");
7020
Rafael Espindolacc126272014-02-28 01:55:21 +00007021 NeedsKPIC = true;
7022 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007023 }
7024
Rafael Espindolacc126272014-02-28 01:55:21 +00007025 default:
7026 break;
7027 }
7028
7029 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007030 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007032 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007033
7034 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007035 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007036
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007037 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007038 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007039
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007040 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007041 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007042}
7043
Douglas Katzman95354292015-06-23 20:42:09 +00007044void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7045 const InputInfo &Output,
7046 const InputInfoList &Inputs,
7047 const ArgList &Args,
7048 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007049 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007050 ArgStringList CmdArgs;
7051
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007052 // Silence warning for "clang -g foo.o -o foo"
7053 Args.ClaimAllArgs(options::OPT_g_Group);
7054 // and "clang -emit-llvm foo.o -o foo"
7055 Args.ClaimAllArgs(options::OPT_emit_llvm);
7056 // and for "clang -w foo.o -o foo". Other warning options are already
7057 // handled somewhere else.
7058 Args.ClaimAllArgs(options::OPT_w);
7059
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007060 if (getToolChain().getArch() == llvm::Triple::mips64)
7061 CmdArgs.push_back("-EB");
7062 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7063 CmdArgs.push_back("-EL");
7064
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007065 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007066 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007067 CmdArgs.push_back("-e");
7068 CmdArgs.push_back("__start");
7069 }
7070
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007071 if (Args.hasArg(options::OPT_static)) {
7072 CmdArgs.push_back("-Bstatic");
7073 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007074 if (Args.hasArg(options::OPT_rdynamic))
7075 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007076 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007077 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007078 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007079 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007080 } else {
7081 CmdArgs.push_back("-dynamic-linker");
7082 CmdArgs.push_back("/usr/libexec/ld.so");
7083 }
7084 }
7085
Rafael Espindola044f7832013-06-05 04:28:55 +00007086 if (Args.hasArg(options::OPT_nopie))
7087 CmdArgs.push_back("-nopie");
7088
Daniel Dunbarb440f562010-08-02 02:38:21 +00007089 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007090 CmdArgs.push_back("-o");
7091 CmdArgs.push_back(Output.getFilename());
7092 } else {
7093 assert(Output.isNothing() && "Invalid output.");
7094 }
7095
7096 if (!Args.hasArg(options::OPT_nostdlib) &&
7097 !Args.hasArg(options::OPT_nostartfiles)) {
7098 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007099 if (Args.hasArg(options::OPT_pg))
7100 CmdArgs.push_back(
7101 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007102 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007103 CmdArgs.push_back(
7104 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7105 CmdArgs.push_back(
7106 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007107 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007108 CmdArgs.push_back(
7109 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007110 }
7111 }
7112
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007113 std::string Triple = getToolChain().getTripleString();
7114 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007115 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007116 CmdArgs.push_back(
7117 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007118
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007119 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7120 options::OPT_e, options::OPT_s, options::OPT_t,
7121 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007122
Daniel Dunbar54423b22010-09-17 00:24:54 +00007123 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007124
7125 if (!Args.hasArg(options::OPT_nostdlib) &&
7126 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007127 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007128 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007129 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007130 CmdArgs.push_back("-lm_p");
7131 else
7132 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007133 }
7134
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007135 // FIXME: For some reason GCC passes -lgcc before adding
7136 // the default system libraries. Just mimic this for now.
7137 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007138
Eric Christopher17674ec2012-09-13 06:32:34 +00007139 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007140 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7141 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007142 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007143 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007144 }
7145
Chandler Carruth45661652011-12-17 22:32:42 +00007146 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007147 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007148 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007149 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007150 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007151 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007152
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007153 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007154 }
7155
7156 if (!Args.hasArg(options::OPT_nostdlib) &&
7157 !Args.hasArg(options::OPT_nostartfiles)) {
7158 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007159 CmdArgs.push_back(
7160 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007161 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007162 CmdArgs.push_back(
7163 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007164 }
7165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007166 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007167 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007168}
Ed Schoutene33194b2009-04-02 19:13:12 +00007169
Douglas Katzman95354292015-06-23 20:42:09 +00007170void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7171 const InputInfo &Output,
7172 const InputInfoList &Inputs,
7173 const ArgList &Args,
7174 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007175 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007176 ArgStringList CmdArgs;
7177
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007178 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007179
7180 CmdArgs.push_back("-o");
7181 CmdArgs.push_back(Output.getFilename());
7182
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007183 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007184 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007185
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007186 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007187 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007188}
7189
Douglas Katzman95354292015-06-23 20:42:09 +00007190void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7191 const InputInfo &Output,
7192 const InputInfoList &Inputs,
7193 const ArgList &Args,
7194 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007195 const Driver &D = getToolChain().getDriver();
7196 ArgStringList CmdArgs;
7197
7198 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7199 (!Args.hasArg(options::OPT_shared))) {
7200 CmdArgs.push_back("-e");
7201 CmdArgs.push_back("__start");
7202 }
7203
7204 if (Args.hasArg(options::OPT_static)) {
7205 CmdArgs.push_back("-Bstatic");
7206 } else {
7207 if (Args.hasArg(options::OPT_rdynamic))
7208 CmdArgs.push_back("-export-dynamic");
7209 CmdArgs.push_back("--eh-frame-hdr");
7210 CmdArgs.push_back("-Bdynamic");
7211 if (Args.hasArg(options::OPT_shared)) {
7212 CmdArgs.push_back("-shared");
7213 } else {
7214 CmdArgs.push_back("-dynamic-linker");
7215 CmdArgs.push_back("/usr/libexec/ld.so");
7216 }
7217 }
7218
7219 if (Output.isFilename()) {
7220 CmdArgs.push_back("-o");
7221 CmdArgs.push_back(Output.getFilename());
7222 } else {
7223 assert(Output.isNothing() && "Invalid output.");
7224 }
7225
7226 if (!Args.hasArg(options::OPT_nostdlib) &&
7227 !Args.hasArg(options::OPT_nostartfiles)) {
7228 if (!Args.hasArg(options::OPT_shared)) {
7229 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007230 CmdArgs.push_back(
7231 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007232 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007233 CmdArgs.push_back(
7234 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7235 CmdArgs.push_back(
7236 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007237 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007238 CmdArgs.push_back(
7239 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007240 }
7241 }
7242
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007243 Args.AddAllArgs(CmdArgs,
7244 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007245
7246 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7247
7248 if (!Args.hasArg(options::OPT_nostdlib) &&
7249 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007250 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007251 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7252 if (Args.hasArg(options::OPT_pg))
7253 CmdArgs.push_back("-lm_p");
7254 else
7255 CmdArgs.push_back("-lm");
7256 }
7257
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007258 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007259 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007260 CmdArgs.push_back("-lpthread_p");
7261 else
7262 CmdArgs.push_back("-lpthread");
7263 }
7264
Eli Friedman9fa28852012-08-08 23:57:20 +00007265 if (!Args.hasArg(options::OPT_shared)) {
7266 if (Args.hasArg(options::OPT_pg))
7267 CmdArgs.push_back("-lc_p");
7268 else
7269 CmdArgs.push_back("-lc");
7270 }
7271
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007272 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007273 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007274 case llvm::Triple::arm:
7275 MyArch = "arm";
7276 break;
7277 case llvm::Triple::x86:
7278 MyArch = "i386";
7279 break;
7280 case llvm::Triple::x86_64:
7281 MyArch = "amd64";
7282 break;
7283 default:
7284 llvm_unreachable("Unsupported architecture");
7285 }
7286 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007287 }
7288
7289 if (!Args.hasArg(options::OPT_nostdlib) &&
7290 !Args.hasArg(options::OPT_nostartfiles)) {
7291 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007292 CmdArgs.push_back(
7293 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007294 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007295 CmdArgs.push_back(
7296 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007297 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007299 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007300 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007301}
7302
Douglas Katzman95354292015-06-23 20:42:09 +00007303void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7304 const InputInfo &Output,
7305 const InputInfoList &Inputs,
7306 const ArgList &Args,
7307 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007308 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007309 ArgStringList CmdArgs;
7310
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007311 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7312 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007313 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007314 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007315 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007316 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007317 else if (getToolChain().getArch() == llvm::Triple::mips ||
7318 getToolChain().getArch() == llvm::Triple::mipsel ||
7319 getToolChain().getArch() == llvm::Triple::mips64 ||
7320 getToolChain().getArch() == llvm::Triple::mips64el) {
7321 StringRef CPUName;
7322 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007323 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007324
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007325 CmdArgs.push_back("-march");
7326 CmdArgs.push_back(CPUName.data());
7327
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007328 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007329 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007330
7331 if (getToolChain().getArch() == llvm::Triple::mips ||
7332 getToolChain().getArch() == llvm::Triple::mips64)
7333 CmdArgs.push_back("-EB");
7334 else
7335 CmdArgs.push_back("-EL");
7336
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007337 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007338 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007339 getToolChain().getArch() == llvm::Triple::armeb ||
7340 getToolChain().getArch() == llvm::Triple::thumb ||
7341 getToolChain().getArch() == llvm::Triple::thumbeb) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007342 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007343
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007344 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007345 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007346 else
Renato Golinf4421f72014-02-19 10:44:07 +00007347 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007348
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007349 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007350 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007351 case llvm::Triple::GNUEABI:
7352 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007353 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007354 break;
7355
7356 default:
7357 CmdArgs.push_back("-matpcs");
7358 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007359 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007360 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007361 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007362 if (getToolChain().getArch() == llvm::Triple::sparc)
7363 CmdArgs.push_back("-Av8plusa");
7364 else
7365 CmdArgs.push_back("-Av9a");
7366
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007367 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007368 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007370 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007371
7372 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007373 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007374
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007375 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007376 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007377
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007378 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007380}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007381
Douglas Katzman95354292015-06-23 20:42:09 +00007382void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7383 const InputInfo &Output,
7384 const InputInfoList &Inputs,
7385 const ArgList &Args,
7386 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007387 const toolchains::FreeBSD &ToolChain =
7388 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007389 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007390 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007391 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007392 !Args.hasArg(options::OPT_shared) &&
7393 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007394 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007395
7396 // Silence warning for "clang -g foo.o -o foo"
7397 Args.ClaimAllArgs(options::OPT_g_Group);
7398 // and "clang -emit-llvm foo.o -o foo"
7399 Args.ClaimAllArgs(options::OPT_emit_llvm);
7400 // and for "clang -w foo.o -o foo". Other warning options are already
7401 // handled somewhere else.
7402 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007403
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007404 if (!D.SysRoot.empty())
7405 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7406
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007407 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007408 CmdArgs.push_back("-pie");
7409
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007410 if (Args.hasArg(options::OPT_static)) {
7411 CmdArgs.push_back("-Bstatic");
7412 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007413 if (Args.hasArg(options::OPT_rdynamic))
7414 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007415 CmdArgs.push_back("--eh-frame-hdr");
7416 if (Args.hasArg(options::OPT_shared)) {
7417 CmdArgs.push_back("-Bshareable");
7418 } else {
7419 CmdArgs.push_back("-dynamic-linker");
7420 CmdArgs.push_back("/libexec/ld-elf.so.1");
7421 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007422 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007423 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7424 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7425 CmdArgs.push_back("--hash-style=both");
7426 }
7427 }
7428 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007429 }
7430
7431 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7432 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007433 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007434 CmdArgs.push_back("-m");
7435 CmdArgs.push_back("elf_i386_fbsd");
7436 }
7437
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007438 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007439 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007440 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007441 }
7442
Daniel Dunbarb440f562010-08-02 02:38:21 +00007443 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007444 CmdArgs.push_back("-o");
7445 CmdArgs.push_back(Output.getFilename());
7446 } else {
7447 assert(Output.isNothing() && "Invalid output.");
7448 }
7449
7450 if (!Args.hasArg(options::OPT_nostdlib) &&
7451 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007452 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007453 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007454 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007455 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007456 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007457 crt1 = "Scrt1.o";
7458 else
7459 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007460 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007461 if (crt1)
7462 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7463
7464 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7465
Craig Topper92fc2df2014-05-17 16:56:41 +00007466 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007467 if (Args.hasArg(options::OPT_static))
7468 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007469 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007470 crtbegin = "crtbeginS.o";
7471 else
7472 crtbegin = "crtbegin.o";
7473
7474 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007475 }
7476
7477 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007478 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007479 for (const auto &Path : Paths)
7480 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007481 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7482 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007483 Args.AddAllArgs(CmdArgs, options::OPT_s);
7484 Args.AddAllArgs(CmdArgs, options::OPT_t);
7485 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7486 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007487
Alexey Samsonov907880e2015-06-19 19:57:46 +00007488 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007489 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007490
Alexey Samsonov52550342014-09-15 19:58:40 +00007491 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007492 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007493
7494 if (!Args.hasArg(options::OPT_nostdlib) &&
7495 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007496 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007497 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007498 if (Args.hasArg(options::OPT_pg))
7499 CmdArgs.push_back("-lm_p");
7500 else
7501 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007502 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007503 if (NeedsSanitizerDeps)
7504 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007505 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7506 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007507 if (Args.hasArg(options::OPT_pg))
7508 CmdArgs.push_back("-lgcc_p");
7509 else
7510 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007511 if (Args.hasArg(options::OPT_static)) {
7512 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007513 } else if (Args.hasArg(options::OPT_pg)) {
7514 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007515 } else {
7516 CmdArgs.push_back("--as-needed");
7517 CmdArgs.push_back("-lgcc_s");
7518 CmdArgs.push_back("--no-as-needed");
7519 }
7520
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007521 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007522 if (Args.hasArg(options::OPT_pg))
7523 CmdArgs.push_back("-lpthread_p");
7524 else
7525 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007526 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007527
Roman Divacky66f22762011-02-10 16:59:40 +00007528 if (Args.hasArg(options::OPT_pg)) {
7529 if (Args.hasArg(options::OPT_shared))
7530 CmdArgs.push_back("-lc");
7531 else
7532 CmdArgs.push_back("-lc_p");
7533 CmdArgs.push_back("-lgcc_p");
7534 } else {
7535 CmdArgs.push_back("-lc");
7536 CmdArgs.push_back("-lgcc");
7537 }
7538
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007539 if (Args.hasArg(options::OPT_static)) {
7540 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007541 } else if (Args.hasArg(options::OPT_pg)) {
7542 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007543 } else {
7544 CmdArgs.push_back("--as-needed");
7545 CmdArgs.push_back("-lgcc_s");
7546 CmdArgs.push_back("--no-as-needed");
7547 }
7548 }
7549
7550 if (!Args.hasArg(options::OPT_nostdlib) &&
7551 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007552 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007554 else
7555 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007556 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007557 }
7558
Alexey Samsonov7811d192014-02-20 13:57:37 +00007559 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007560
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007561 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007562 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007563}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007564
Douglas Katzman95354292015-06-23 20:42:09 +00007565void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007566 const InputInfo &Output,
7567 const InputInfoList &Inputs,
7568 const ArgList &Args,
7569 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007570 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007571 ArgStringList CmdArgs;
7572
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007573 // GNU as needs different flags for creating the correct output format
7574 // on architectures with different ABIs or optional feature sets.
7575 switch (getToolChain().getArch()) {
7576 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007577 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007578 break;
7579 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007580 case llvm::Triple::armeb:
7581 case llvm::Triple::thumb:
7582 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007583 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007584 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7585 std::string Arch =
7586 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007587 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007588 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007589 }
7590
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007591 case llvm::Triple::mips:
7592 case llvm::Triple::mipsel:
7593 case llvm::Triple::mips64:
7594 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007595 StringRef CPUName;
7596 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007597 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007598
7599 CmdArgs.push_back("-march");
7600 CmdArgs.push_back(CPUName.data());
7601
7602 CmdArgs.push_back("-mabi");
7603 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7604
7605 if (getToolChain().getArch() == llvm::Triple::mips ||
7606 getToolChain().getArch() == llvm::Triple::mips64)
7607 CmdArgs.push_back("-EB");
7608 else
7609 CmdArgs.push_back("-EL");
7610
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007611 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007612 break;
7613 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007614
7615 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007616 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007617 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007618 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007619 break;
7620
7621 case llvm::Triple::sparcv9:
7622 CmdArgs.push_back("-64");
7623 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007624 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007625 break;
7626
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007627 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007628 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007629 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007630
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007632
7633 CmdArgs.push_back("-o");
7634 CmdArgs.push_back(Output.getFilename());
7635
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007636 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007637 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007638
David Chisnallddbd68f2011-09-27 22:03:18 +00007639 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007640 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007641}
7642
Douglas Katzman95354292015-06-23 20:42:09 +00007643void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7644 const InputInfo &Output,
7645 const InputInfoList &Inputs,
7646 const ArgList &Args,
7647 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007648 const Driver &D = getToolChain().getDriver();
7649 ArgStringList CmdArgs;
7650
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007651 if (!D.SysRoot.empty())
7652 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7653
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007654 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007655 if (Args.hasArg(options::OPT_static)) {
7656 CmdArgs.push_back("-Bstatic");
7657 } else {
7658 if (Args.hasArg(options::OPT_rdynamic))
7659 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007660 if (Args.hasArg(options::OPT_shared)) {
7661 CmdArgs.push_back("-Bshareable");
7662 } else {
7663 CmdArgs.push_back("-dynamic-linker");
7664 CmdArgs.push_back("/libexec/ld.elf_so");
7665 }
7666 }
7667
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007668 // Many NetBSD architectures support more than one ABI.
7669 // Determine the correct emulation for ld.
7670 switch (getToolChain().getArch()) {
7671 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007672 CmdArgs.push_back("-m");
7673 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007674 break;
7675 case llvm::Triple::arm:
7676 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007677 CmdArgs.push_back("-m");
7678 switch (getToolChain().getTriple().getEnvironment()) {
7679 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007680 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007681 CmdArgs.push_back("armelf_nbsd_eabi");
7682 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007683 case llvm::Triple::EABIHF:
7684 case llvm::Triple::GNUEABIHF:
7685 CmdArgs.push_back("armelf_nbsd_eabihf");
7686 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007687 default:
7688 CmdArgs.push_back("armelf_nbsd");
7689 break;
7690 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007691 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007692 case llvm::Triple::armeb:
7693 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007694 arm::appendEBLinkFlags(
7695 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007696 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007697 CmdArgs.push_back("-m");
7698 switch (getToolChain().getTriple().getEnvironment()) {
7699 case llvm::Triple::EABI:
7700 case llvm::Triple::GNUEABI:
7701 CmdArgs.push_back("armelfb_nbsd_eabi");
7702 break;
7703 case llvm::Triple::EABIHF:
7704 case llvm::Triple::GNUEABIHF:
7705 CmdArgs.push_back("armelfb_nbsd_eabihf");
7706 break;
7707 default:
7708 CmdArgs.push_back("armelfb_nbsd");
7709 break;
7710 }
7711 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007712 case llvm::Triple::mips64:
7713 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007714 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007715 CmdArgs.push_back("-m");
7716 if (getToolChain().getArch() == llvm::Triple::mips64)
7717 CmdArgs.push_back("elf32btsmip");
7718 else
7719 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007720 } else if (mips::hasMipsAbiArg(Args, "64")) {
7721 CmdArgs.push_back("-m");
7722 if (getToolChain().getArch() == llvm::Triple::mips64)
7723 CmdArgs.push_back("elf64btsmip");
7724 else
7725 CmdArgs.push_back("elf64ltsmip");
7726 }
7727 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007728 case llvm::Triple::ppc:
7729 CmdArgs.push_back("-m");
7730 CmdArgs.push_back("elf32ppc_nbsd");
7731 break;
7732
7733 case llvm::Triple::ppc64:
7734 case llvm::Triple::ppc64le:
7735 CmdArgs.push_back("-m");
7736 CmdArgs.push_back("elf64ppc");
7737 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007738
7739 case llvm::Triple::sparc:
7740 CmdArgs.push_back("-m");
7741 CmdArgs.push_back("elf32_sparc");
7742 break;
7743
7744 case llvm::Triple::sparcv9:
7745 CmdArgs.push_back("-m");
7746 CmdArgs.push_back("elf64_sparc");
7747 break;
7748
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007749 default:
7750 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007751 }
7752
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007753 if (Output.isFilename()) {
7754 CmdArgs.push_back("-o");
7755 CmdArgs.push_back(Output.getFilename());
7756 } else {
7757 assert(Output.isNothing() && "Invalid output.");
7758 }
7759
7760 if (!Args.hasArg(options::OPT_nostdlib) &&
7761 !Args.hasArg(options::OPT_nostartfiles)) {
7762 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007763 CmdArgs.push_back(
7764 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7765 CmdArgs.push_back(
7766 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7767 CmdArgs.push_back(
7768 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007769 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007770 CmdArgs.push_back(
7771 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7772 CmdArgs.push_back(
7773 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007774 }
7775 }
7776
7777 Args.AddAllArgs(CmdArgs, options::OPT_L);
7778 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7779 Args.AddAllArgs(CmdArgs, options::OPT_e);
7780 Args.AddAllArgs(CmdArgs, options::OPT_s);
7781 Args.AddAllArgs(CmdArgs, options::OPT_t);
7782 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7783 Args.AddAllArgs(CmdArgs, options::OPT_r);
7784
7785 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7786
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007787 unsigned Major, Minor, Micro;
7788 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7789 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007790 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007791 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007792 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007793 case llvm::Triple::arm:
7794 case llvm::Triple::armeb:
7795 case llvm::Triple::thumb:
7796 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007797 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007798 case llvm::Triple::ppc64:
7799 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007800 case llvm::Triple::x86:
7801 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007802 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007803 break;
7804 default:
7805 break;
7806 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007807 }
7808
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007809 if (!Args.hasArg(options::OPT_nostdlib) &&
7810 !Args.hasArg(options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00007811 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007812 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007813 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7814 CmdArgs.push_back("-lm");
7815 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007816 if (Args.hasArg(options::OPT_pthread))
7817 CmdArgs.push_back("-lpthread");
7818 CmdArgs.push_back("-lc");
7819
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007820 if (useLibgcc) {
7821 if (Args.hasArg(options::OPT_static)) {
7822 // libgcc_eh depends on libc, so resolve as much as possible,
7823 // pull in any new requirements from libc and then get the rest
7824 // of libgcc.
7825 CmdArgs.push_back("-lgcc_eh");
7826 CmdArgs.push_back("-lc");
7827 CmdArgs.push_back("-lgcc");
7828 } else {
7829 CmdArgs.push_back("-lgcc");
7830 CmdArgs.push_back("--as-needed");
7831 CmdArgs.push_back("-lgcc_s");
7832 CmdArgs.push_back("--no-as-needed");
7833 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007834 }
7835 }
7836
7837 if (!Args.hasArg(options::OPT_nostdlib) &&
7838 !Args.hasArg(options::OPT_nostartfiles)) {
7839 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 CmdArgs.push_back(
7841 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007842 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007843 CmdArgs.push_back(
7844 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7845 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007846 }
7847
Alexey Samsonov7811d192014-02-20 13:57:37 +00007848 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007849
Logan Chieneb9162f2014-06-26 14:23:45 +00007850 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007851 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007852}
7853
Douglas Katzman95354292015-06-23 20:42:09 +00007854void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7855 const InputInfo &Output,
7856 const InputInfoList &Inputs,
7857 const ArgList &Args,
7858 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007859 claimNoWarnArgs(Args);
7860
James Y Knight2db38f32015-08-15 03:45:25 +00007861 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7862 llvm::Triple Triple = llvm::Triple(TripleStr);
7863
Rafael Espindola92b00932010-08-10 00:25:48 +00007864 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007865 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007866
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007867 llvm::Reloc::Model RelocationModel;
7868 unsigned PICLevel;
7869 bool IsPIE;
7870 std::tie(RelocationModel, PICLevel, IsPIE) =
7871 ParsePICArgs(getToolChain(), Triple, Args);
7872
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007873 switch (getToolChain().getArch()) {
7874 default:
7875 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007876 // Add --32/--64 to make sure we get the format we want.
7877 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007878 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007879 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007880 break;
7881 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007882 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7883 CmdArgs.push_back("--x32");
7884 else
7885 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007886 break;
7887 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007888 CmdArgs.push_back("-a32");
7889 CmdArgs.push_back("-mppc");
7890 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007891 break;
7892 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007893 CmdArgs.push_back("-a64");
7894 CmdArgs.push_back("-mppc64");
7895 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007896 break;
7897 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007898 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007899 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007900 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007901 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007902 break;
7903 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007904 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007905 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007906 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007907 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007908 break;
7909 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007910 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007911 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007912 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007913 break;
7914 case llvm::Triple::arm:
7915 case llvm::Triple::armeb:
7916 case llvm::Triple::thumb:
7917 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007918 const llvm::Triple &Triple2 = getToolChain().getTriple();
7919 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007920 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007921 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007922 break;
7923 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007924 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007925 break;
7926 default:
7927 break;
7928 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007929
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007930 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007931 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
7932 case arm::FloatABI::Soft:
7933 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
7934 break;
7935 case arm::FloatABI::SoftFP:
7936 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
7937 break;
7938 case arm::FloatABI::Hard:
7939 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
7940 break;
7941 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007942
7943 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007944
7945 // FIXME: remove krait check when GNU tools support krait cpu
7946 // for now replace it with -march=armv7-a to avoid a lower
7947 // march from being picked in the absence of a cpu flag.
7948 Arg *A;
7949 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007950 StringRef(A->getValue()).lower() == "krait")
7951 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007952 else
7953 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007954 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007955 break;
7956 }
7957 case llvm::Triple::mips:
7958 case llvm::Triple::mipsel:
7959 case llvm::Triple::mips64:
7960 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007961 StringRef CPUName;
7962 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007963 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007964 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007965
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007966 CmdArgs.push_back("-march");
7967 CmdArgs.push_back(CPUName.data());
7968
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007969 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007970 CmdArgs.push_back(ABIName.data());
7971
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007972 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7973 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007974 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007975 CmdArgs.push_back("-mno-shared");
7976
Daniel Sanders379d44b2014-07-16 11:52:23 +00007977 // LLVM doesn't support -mplt yet and acts as if it is always given.
7978 // However, -mplt has no effect with the N64 ABI.
7979 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007980
7981 if (getToolChain().getArch() == llvm::Triple::mips ||
7982 getToolChain().getArch() == llvm::Triple::mips64)
7983 CmdArgs.push_back("-EB");
7984 else
7985 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007986
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007987 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7988 if (StringRef(A->getValue()) == "2008")
7989 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7990 }
7991
Daniel Sanders379d44b2014-07-16 11:52:23 +00007992 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
7993 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
7994 options::OPT_mfp64)) {
7995 A->claim();
7996 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007997 } else if (mips::shouldUseFPXX(
7998 Args, getToolChain().getTriple(), CPUName, ABIName,
7999 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008000 CmdArgs.push_back("-mfpxx");
8001
8002 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8003 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008004 if (Arg *A =
8005 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008006 if (A->getOption().matches(options::OPT_mips16)) {
8007 A->claim();
8008 A->render(Args, CmdArgs);
8009 } else {
8010 A->claim();
8011 CmdArgs.push_back("-no-mips16");
8012 }
8013 }
8014
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008015 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8016 options::OPT_mno_micromips);
8017 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8018 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8019
Simon Atanasyanbd986632013-11-26 11:58:04 +00008020 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8021 // Do not use AddLastArg because not all versions of MIPS assembler
8022 // support -mmsa / -mno-msa options.
8023 if (A->getOption().matches(options::OPT_mmsa))
8024 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8025 }
8026
Daniel Sanders379d44b2014-07-16 11:52:23 +00008027 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8028 options::OPT_msoft_float);
8029
Toma Tabacub36d6102015-06-11 12:13:18 +00008030 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8031 options::OPT_msingle_float);
8032
Daniel Sanders379d44b2014-07-16 11:52:23 +00008033 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8034 options::OPT_mno_odd_spreg);
8035
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008036 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008037 break;
8038 }
8039 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008040 // Always pass an -march option, since our default of z10 is later
8041 // than the GNU assembler's default.
8042 StringRef CPUName = getSystemZTargetCPU(Args);
8043 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008044 break;
8045 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008046 }
8047
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008048 if (NeedsKPIC) {
8049 if (RelocationModel != llvm::Reloc::Static)
8050 CmdArgs.push_back("-KPIC");
8051 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008052
Renato Golina74bbc72015-07-22 15:32:36 +00008053 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008054 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008055
8056 CmdArgs.push_back("-o");
8057 CmdArgs.push_back(Output.getFilename());
8058
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008059 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008060 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008061
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008062 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008063 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008064
8065 // Handle the debug info splitting at object creation time if we're
8066 // creating an object.
8067 // TODO: Currently only works on linux with newer objcopy.
8068 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008069 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008070 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008071 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008072}
8073
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008074static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008075 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008076 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008077 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008078 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8079 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008080 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008081 CmdArgs.push_back("-lgcc");
8082
Logan Chien3d3373c2012-11-19 12:04:11 +00008083 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008084 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008085 CmdArgs.push_back("-lgcc");
8086 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008087 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008088 CmdArgs.push_back("--as-needed");
8089 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008090 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008091 CmdArgs.push_back("--no-as-needed");
8092 }
8093
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008094 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008095 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008096 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008097 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008098
8099 // According to Android ABI, we have to link with libdl if we are
8100 // linking with non-static libgcc.
8101 //
8102 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8103 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8104 if (isAndroid && !StaticLibgcc)
8105 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008106}
8107
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008108static std::string getLinuxDynamicLinker(const ArgList &Args,
8109 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008110 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8111
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008112 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8113 if (ToolChain.getTriple().isArch64Bit())
8114 return "/system/bin/linker64";
8115 else
8116 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008117 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8118 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008119 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008120 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008121 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008122 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008123 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008124 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008125 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008126 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008127 return "/lib/ld-linux-armhf.so.3";
8128 else
8129 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008130 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8131 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008132 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008133 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008134 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008135 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008136 return "/lib/ld-linux.so.3";
8137 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8138 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008139 StringRef CPUName;
8140 StringRef ABIName;
8141 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8142 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8143
8144 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8145 .Case("o32", "/lib")
8146 .Case("n32", "/lib32")
8147 .Case("n64", "/lib64")
8148 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008149 StringRef LibName;
8150 if (mips::isUCLibc(Args))
8151 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8152 else
8153 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008154
8155 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008156 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008157 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008158 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008159 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8160 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008161 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008162 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008163 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8164 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008165 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008166 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008167 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008168 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008169 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008170 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008171 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8172 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008173 else
8174 return "/lib64/ld-linux-x86-64.so.2";
8175}
8176
Renato Golinc4b49242014-02-13 10:01:16 +00008177static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008178 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008179 // Make use of compiler-rt if --rtlib option is used
8180 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8181
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008182 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008183 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008184 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008185 default:
8186 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008187 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008188 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008189 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008190 break;
8191 }
Renato Golinc4b49242014-02-13 10:01:16 +00008192 break;
8193 case ToolChain::RLT_Libgcc:
8194 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8195 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008196 }
8197}
8198
Rafael Espindola1e085772014-08-15 17:14:35 +00008199static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8200 switch (T.getArch()) {
8201 case llvm::Triple::x86:
8202 return "elf_i386";
8203 case llvm::Triple::aarch64:
8204 return "aarch64linux";
8205 case llvm::Triple::aarch64_be:
8206 return "aarch64_be_linux";
8207 case llvm::Triple::arm:
8208 case llvm::Triple::thumb:
8209 return "armelf_linux_eabi";
8210 case llvm::Triple::armeb:
8211 case llvm::Triple::thumbeb:
8212 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8213 case llvm::Triple::ppc:
8214 return "elf32ppclinux";
8215 case llvm::Triple::ppc64:
8216 return "elf64ppc";
8217 case llvm::Triple::ppc64le:
8218 return "elf64lppc";
8219 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008220 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008221 return "elf32_sparc";
8222 case llvm::Triple::sparcv9:
8223 return "elf64_sparc";
8224 case llvm::Triple::mips:
8225 return "elf32btsmip";
8226 case llvm::Triple::mipsel:
8227 return "elf32ltsmip";
8228 case llvm::Triple::mips64:
8229 if (mips::hasMipsAbiArg(Args, "n32"))
8230 return "elf32btsmipn32";
8231 return "elf64btsmip";
8232 case llvm::Triple::mips64el:
8233 if (mips::hasMipsAbiArg(Args, "n32"))
8234 return "elf32ltsmipn32";
8235 return "elf64ltsmip";
8236 case llvm::Triple::systemz:
8237 return "elf64_s390";
8238 case llvm::Triple::x86_64:
8239 if (T.getEnvironment() == llvm::Triple::GNUX32)
8240 return "elf32_x86_64";
8241 return "elf_x86_64";
8242 default:
8243 llvm_unreachable("Unexpected arch");
8244 }
8245}
8246
Douglas Katzman95354292015-06-23 20:42:09 +00008247void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8248 const InputInfo &Output,
8249 const InputInfoList &Inputs,
8250 const ArgList &Args,
8251 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008252 const toolchains::Linux &ToolChain =
8253 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008254 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008255
8256 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8257 llvm::Triple Triple = llvm::Triple(TripleStr);
8258
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008259 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008260 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008261 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008262 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8264 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008265
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008266 ArgStringList CmdArgs;
8267
Rafael Espindolad1002f62010-11-15 18:28:16 +00008268 // Silence warning for "clang -g foo.o -o foo"
8269 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008270 // and "clang -emit-llvm foo.o -o foo"
8271 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008272 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008273 // handled somewhere else.
8274 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008275
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008276 if (!D.SysRoot.empty())
8277 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008278
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008279 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008280 CmdArgs.push_back("-pie");
8281
Rafael Espindola1c76c592010-11-07 22:57:16 +00008282 if (Args.hasArg(options::OPT_rdynamic))
8283 CmdArgs.push_back("-export-dynamic");
8284
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008285 if (Args.hasArg(options::OPT_s))
8286 CmdArgs.push_back("-s");
8287
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008288 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008289 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008290
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008291 for (const auto &Opt : ToolChain.ExtraOpts)
8292 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008293
8294 if (!Args.hasArg(options::OPT_static)) {
8295 CmdArgs.push_back("--eh-frame-hdr");
8296 }
8297
8298 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008299 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008300
8301 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008302 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8303 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008304 CmdArgs.push_back("-Bstatic");
8305 else
8306 CmdArgs.push_back("-static");
8307 } else if (Args.hasArg(options::OPT_shared)) {
8308 CmdArgs.push_back("-shared");
8309 }
8310
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008311 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8312 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008313 (!Args.hasArg(options::OPT_static) &&
8314 !Args.hasArg(options::OPT_shared))) {
8315 CmdArgs.push_back("-dynamic-linker");
8316 CmdArgs.push_back(Args.MakeArgString(
8317 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8318 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008319
8320 CmdArgs.push_back("-o");
8321 CmdArgs.push_back(Output.getFilename());
8322
Rafael Espindola81937ec2010-12-01 01:52:43 +00008323 if (!Args.hasArg(options::OPT_nostdlib) &&
8324 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008325 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008326 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008327 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008328 if (Args.hasArg(options::OPT_pg))
8329 crt1 = "gcrt1.o";
8330 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008331 crt1 = "Scrt1.o";
8332 else
8333 crt1 = "crt1.o";
8334 }
8335 if (crt1)
8336 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008337
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008338 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8339 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008340
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008341 const char *crtbegin;
8342 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008343 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008344 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008345 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008346 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008347 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008348 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008349 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008350 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008351
8352 // Add crtfastmath.o if available and fast math is enabled.
8353 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008354 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008355
8356 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008357 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008358
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008359 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008360
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008361 for (const auto &Path : Paths)
8362 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008363
Alexey Samsonov907880e2015-06-19 19:57:46 +00008364 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008365 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008366
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008367 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8368 CmdArgs.push_back("--no-demangle");
8369
Alexey Samsonov52550342014-09-15 19:58:40 +00008370 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008371 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008372 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008373 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008374
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008375 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008376 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008377 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008378 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008379 if (OnlyLibstdcxxStatic)
8380 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008381 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008382 if (OnlyLibstdcxxStatic)
8383 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008384 CmdArgs.push_back("-lm");
8385 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008386 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8387 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008388
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008389 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008390 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8391 if (Args.hasArg(options::OPT_static))
8392 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008393
Alexey Samsonov52550342014-09-15 19:58:40 +00008394 if (NeedsSanitizerDeps)
8395 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8396
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008397 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8398 Args.hasArg(options::OPT_pthreads);
8399
8400 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8401 options::OPT_fno_openmp, false)) {
8402 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8403 // FIXME: Does this really make sense for all GNU toolchains?
8404 WantPthread = true;
8405
8406 // Also link the particular OpenMP runtimes.
8407 switch (getOpenMPRuntime(ToolChain, Args)) {
8408 case OMPRT_OMP:
8409 CmdArgs.push_back("-lomp");
8410 break;
8411 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008412 CmdArgs.push_back("-lgomp");
8413
8414 // FIXME: Exclude this for platforms with libgomp that don't require
8415 // librt. Most modern Linux platforms require it, but some may not.
8416 CmdArgs.push_back("-lrt");
8417 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008418 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008419 CmdArgs.push_back("-liomp5");
8420 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008421 case OMPRT_Unknown:
8422 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008423 break;
8424 }
Chandler Carruth01538002013-01-17 13:19:29 +00008425 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008426
Renato Golinc4b49242014-02-13 10:01:16 +00008427 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008428
Richard Smith31d1de22015-05-20 22:48:44 +00008429 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008430 CmdArgs.push_back("-lpthread");
8431
8432 CmdArgs.push_back("-lc");
8433
8434 if (Args.hasArg(options::OPT_static))
8435 CmdArgs.push_back("--end-group");
8436 else
Renato Golinc4b49242014-02-13 10:01:16 +00008437 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008438 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008439
Rafael Espindola81937ec2010-12-01 01:52:43 +00008440 if (!Args.hasArg(options::OPT_nostartfiles)) {
8441 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008442 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008443 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008444 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008445 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008446 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008447 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008448
Rafael Espindola81937ec2010-12-01 01:52:43 +00008449 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008450 if (!isAndroid)
8451 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008452 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008453 }
8454
Justin Bognerd3371d82015-07-17 03:35:54 +00008455 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8456 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008457}
8458
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008459// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8460// for the various SFI requirements like register masking. The assembly tool
8461// inserts the file containing the macros as an input into all the assembly
8462// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008463void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8464 const InputInfo &Output,
8465 const InputInfoList &Inputs,
8466 const ArgList &Args,
8467 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008468 const toolchains::NaClToolChain &ToolChain =
8469 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008470 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8471 "nacl-arm-macros.s");
8472 InputInfoList NewInputs;
8473 NewInputs.push_back(NaClMacros);
8474 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008475 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8476 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008477}
8478
Douglas Katzman750cfc52015-06-29 18:42:16 +00008479// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008480// we use static by default, do not yet support sanitizers or LTO, and a few
8481// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008482// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008483void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8484 const InputInfo &Output,
8485 const InputInfoList &Inputs,
8486 const ArgList &Args,
8487 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008488
Douglas Katzman54366072015-07-27 16:53:08 +00008489 const toolchains::NaClToolChain &ToolChain =
8490 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008491 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008492 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008493 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008494 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008495
8496 ArgStringList CmdArgs;
8497
8498 // Silence warning for "clang -g foo.o -o foo"
8499 Args.ClaimAllArgs(options::OPT_g_Group);
8500 // and "clang -emit-llvm foo.o -o foo"
8501 Args.ClaimAllArgs(options::OPT_emit_llvm);
8502 // and for "clang -w foo.o -o foo". Other warning options are already
8503 // handled somewhere else.
8504 Args.ClaimAllArgs(options::OPT_w);
8505
8506 if (!D.SysRoot.empty())
8507 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8508
8509 if (Args.hasArg(options::OPT_rdynamic))
8510 CmdArgs.push_back("-export-dynamic");
8511
8512 if (Args.hasArg(options::OPT_s))
8513 CmdArgs.push_back("-s");
8514
Douglas Katzman54366072015-07-27 16:53:08 +00008515 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8516 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008517 CmdArgs.push_back("--build-id");
8518
8519 if (!IsStatic)
8520 CmdArgs.push_back("--eh-frame-hdr");
8521
8522 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008523 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008524 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008525 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008526 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008527 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008528 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008529 else if (Arch == llvm::Triple::mipsel)
8530 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008531 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008532 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8533 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008534
8535 if (IsStatic)
8536 CmdArgs.push_back("-static");
8537 else if (Args.hasArg(options::OPT_shared))
8538 CmdArgs.push_back("-shared");
8539
8540 CmdArgs.push_back("-o");
8541 CmdArgs.push_back(Output.getFilename());
8542 if (!Args.hasArg(options::OPT_nostdlib) &&
8543 !Args.hasArg(options::OPT_nostartfiles)) {
8544 if (!Args.hasArg(options::OPT_shared))
8545 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8546 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8547
8548 const char *crtbegin;
8549 if (IsStatic)
8550 crtbegin = "crtbeginT.o";
8551 else if (Args.hasArg(options::OPT_shared))
8552 crtbegin = "crtbeginS.o";
8553 else
8554 crtbegin = "crtbegin.o";
8555 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8556 }
8557
8558 Args.AddAllArgs(CmdArgs, options::OPT_L);
8559 Args.AddAllArgs(CmdArgs, options::OPT_u);
8560
8561 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8562
8563 for (const auto &Path : Paths)
8564 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8565
8566 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8567 CmdArgs.push_back("--no-demangle");
8568
8569 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008571 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008572 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008573 bool OnlyLibstdcxxStatic =
8574 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008575 if (OnlyLibstdcxxStatic)
8576 CmdArgs.push_back("-Bstatic");
8577 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8578 if (OnlyLibstdcxxStatic)
8579 CmdArgs.push_back("-Bdynamic");
8580 CmdArgs.push_back("-lm");
8581 }
8582
8583 if (!Args.hasArg(options::OPT_nostdlib)) {
8584 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8585 // Always use groups, since it has no effect on dynamic libraries.
8586 CmdArgs.push_back("--start-group");
8587 CmdArgs.push_back("-lc");
8588 // NaCl's libc++ currently requires libpthread, so just always include it
8589 // in the group for C++.
8590 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008591 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008592 // Gold, used by Mips, handles nested groups differently than ld, and
8593 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8594 // which is not a desired behaviour here.
8595 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8596 if (getToolChain().getArch() == llvm::Triple::mipsel)
8597 CmdArgs.push_back("-lnacl");
8598
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008599 CmdArgs.push_back("-lpthread");
8600 }
8601
8602 CmdArgs.push_back("-lgcc");
8603 CmdArgs.push_back("--as-needed");
8604 if (IsStatic)
8605 CmdArgs.push_back("-lgcc_eh");
8606 else
8607 CmdArgs.push_back("-lgcc_s");
8608 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008609
8610 // Mips needs to create and use pnacl_legacy library that contains
8611 // definitions from bitcode/pnaclmm.c and definitions for
8612 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8613 if (getToolChain().getArch() == llvm::Triple::mipsel)
8614 CmdArgs.push_back("-lpnacl_legacy");
8615
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008616 CmdArgs.push_back("--end-group");
8617 }
8618
8619 if (!Args.hasArg(options::OPT_nostartfiles)) {
8620 const char *crtend;
8621 if (Args.hasArg(options::OPT_shared))
8622 crtend = "crtendS.o";
8623 else
8624 crtend = "crtend.o";
8625
8626 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8627 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8628 }
8629 }
8630
Justin Bognerd3371d82015-07-17 03:35:54 +00008631 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8632 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008633}
8634
Douglas Katzman95354292015-06-23 20:42:09 +00008635void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8636 const InputInfo &Output,
8637 const InputInfoList &Inputs,
8638 const ArgList &Args,
8639 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008640 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008641 ArgStringList CmdArgs;
8642
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008643 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008644
8645 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008646 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008647
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008648 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008649 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008650
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008651 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008652 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008653}
8654
Douglas Katzman95354292015-06-23 20:42:09 +00008655void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8656 const InputInfo &Output,
8657 const InputInfoList &Inputs,
8658 const ArgList &Args,
8659 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008660 const Driver &D = getToolChain().getDriver();
8661 ArgStringList CmdArgs;
8662
Daniel Dunbarb440f562010-08-02 02:38:21 +00008663 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008664 CmdArgs.push_back("-o");
8665 CmdArgs.push_back(Output.getFilename());
8666 } else {
8667 assert(Output.isNothing() && "Invalid output.");
8668 }
8669
8670 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008671 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008672 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8673 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8674 CmdArgs.push_back(
8675 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8676 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008677 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008678
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008679 Args.AddAllArgs(CmdArgs,
8680 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008681
Daniel Dunbar54423b22010-09-17 00:24:54 +00008682 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008683
Alexey Samsonov7811d192014-02-20 13:57:37 +00008684 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008685
Chris Lattner3e2ee142010-07-07 16:01:42 +00008686 if (!Args.hasArg(options::OPT_nostdlib) &&
8687 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008688 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008689 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008690 CmdArgs.push_back("-lm");
8691 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008692 }
8693
8694 if (!Args.hasArg(options::OPT_nostdlib) &&
8695 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008696 if (Args.hasArg(options::OPT_pthread))
8697 CmdArgs.push_back("-lpthread");
8698 CmdArgs.push_back("-lc");
8699 CmdArgs.push_back("-lCompilerRT-Generic");
8700 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8701 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008702 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008703 }
8704
Logan Chieneb9162f2014-06-26 14:23:45 +00008705 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008706 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008707}
8708
Daniel Dunbarcc912342009-05-02 18:28:39 +00008709/// DragonFly Tools
8710
8711// For now, DragonFly Assemble does just about the same as for
8712// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008713void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8714 const InputInfo &Output,
8715 const InputInfoList &Inputs,
8716 const ArgList &Args,
8717 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008718 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008719 ArgStringList CmdArgs;
8720
8721 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8722 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008723 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008724 CmdArgs.push_back("--32");
8725
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008726 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008727
8728 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008729 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008730
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008731 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008732 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008733
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008734 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008735 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008736}
8737
Douglas Katzman95354292015-06-23 20:42:09 +00008738void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8739 const InputInfo &Output,
8740 const InputInfoList &Inputs,
8741 const ArgList &Args,
8742 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008743 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008744 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008745 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008746
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008747 if (!D.SysRoot.empty())
8748 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8749
John McCall65b8da02013-04-11 22:55:55 +00008750 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008751 if (Args.hasArg(options::OPT_static)) {
8752 CmdArgs.push_back("-Bstatic");
8753 } else {
John McCall65b8da02013-04-11 22:55:55 +00008754 if (Args.hasArg(options::OPT_rdynamic))
8755 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008756 if (Args.hasArg(options::OPT_shared))
8757 CmdArgs.push_back("-Bshareable");
8758 else {
8759 CmdArgs.push_back("-dynamic-linker");
8760 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8761 }
John McCall65b8da02013-04-11 22:55:55 +00008762 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008763 }
8764
8765 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8766 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008767 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008768 CmdArgs.push_back("-m");
8769 CmdArgs.push_back("elf_i386");
8770 }
8771
Daniel Dunbarb440f562010-08-02 02:38:21 +00008772 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008773 CmdArgs.push_back("-o");
8774 CmdArgs.push_back(Output.getFilename());
8775 } else {
8776 assert(Output.isNothing() && "Invalid output.");
8777 }
8778
8779 if (!Args.hasArg(options::OPT_nostdlib) &&
8780 !Args.hasArg(options::OPT_nostartfiles)) {
8781 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008782 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008783 CmdArgs.push_back(
8784 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008785 else {
8786 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008787 CmdArgs.push_back(
8788 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008789 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008790 CmdArgs.push_back(
8791 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008792 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008793 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008794 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008795 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008796 CmdArgs.push_back(
8797 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008798 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008799 CmdArgs.push_back(
8800 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008801 }
8802
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008803 Args.AddAllArgs(CmdArgs,
8804 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008805
Daniel Dunbar54423b22010-09-17 00:24:54 +00008806 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008807
8808 if (!Args.hasArg(options::OPT_nostdlib) &&
8809 !Args.hasArg(options::OPT_nodefaultlibs)) {
8810 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8811 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008812 if (UseGCC47)
8813 CmdArgs.push_back("-L/usr/lib/gcc47");
8814 else
8815 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008816
8817 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008818 if (UseGCC47) {
8819 CmdArgs.push_back("-rpath");
8820 CmdArgs.push_back("/usr/lib/gcc47");
8821 } else {
8822 CmdArgs.push_back("-rpath");
8823 CmdArgs.push_back("/usr/lib/gcc44");
8824 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008825 }
8826
Hans Wennborg70850d82013-07-18 20:29:38 +00008827 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008828 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008829 CmdArgs.push_back("-lm");
8830 }
8831
Daniel Dunbarcc912342009-05-02 18:28:39 +00008832 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008833 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008834
8835 if (!Args.hasArg(options::OPT_nolibc)) {
8836 CmdArgs.push_back("-lc");
8837 }
8838
John McCall65b8da02013-04-11 22:55:55 +00008839 if (UseGCC47) {
8840 if (Args.hasArg(options::OPT_static) ||
8841 Args.hasArg(options::OPT_static_libgcc)) {
8842 CmdArgs.push_back("-lgcc");
8843 CmdArgs.push_back("-lgcc_eh");
8844 } else {
8845 if (Args.hasArg(options::OPT_shared_libgcc)) {
8846 CmdArgs.push_back("-lgcc_pic");
8847 if (!Args.hasArg(options::OPT_shared))
8848 CmdArgs.push_back("-lgcc");
8849 } else {
8850 CmdArgs.push_back("-lgcc");
8851 CmdArgs.push_back("--as-needed");
8852 CmdArgs.push_back("-lgcc_pic");
8853 CmdArgs.push_back("--no-as-needed");
8854 }
8855 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008856 } else {
John McCall65b8da02013-04-11 22:55:55 +00008857 if (Args.hasArg(options::OPT_shared)) {
8858 CmdArgs.push_back("-lgcc_pic");
8859 } else {
8860 CmdArgs.push_back("-lgcc");
8861 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008862 }
8863 }
8864
8865 if (!Args.hasArg(options::OPT_nostdlib) &&
8866 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008867 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008868 CmdArgs.push_back(
8869 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008870 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008871 CmdArgs.push_back(
8872 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8873 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008874 }
8875
Alexey Samsonov7811d192014-02-20 13:57:37 +00008876 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008877
Logan Chieneb9162f2014-06-26 14:23:45 +00008878 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008879 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008880}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008881
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008882// Try to find Exe from a Visual Studio distribution. This first tries to find
8883// an installed copy of Visual Studio and, failing that, looks in the PATH,
8884// making sure that whatever executable that's found is not a same-named exe
8885// from clang itself to prevent clang from falling back to itself.
8886static std::string FindVisualStudioExecutable(const ToolChain &TC,
8887 const char *Exe,
8888 const char *ClangProgramPath) {
8889 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8890 std::string visualStudioBinDir;
8891 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8892 visualStudioBinDir)) {
8893 SmallString<128> FilePath(visualStudioBinDir);
8894 llvm::sys::path::append(FilePath, Exe);
8895 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8896 return FilePath.str();
8897 }
8898
8899 return Exe;
8900}
8901
Douglas Katzman95354292015-06-23 20:42:09 +00008902void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8903 const InputInfo &Output,
8904 const InputInfoList &Inputs,
8905 const ArgList &Args,
8906 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008907 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008908 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008909
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008910 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8911 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008912 CmdArgs.push_back(
8913 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008914
8915 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008916 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008917 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008918
Zachary Turner10d75b22014-10-22 20:40:43 +00008919 if (!llvm::sys::Process::GetEnv("LIB")) {
8920 // If the VC environment hasn't been configured (perhaps because the user
8921 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008922 // the environment variable is set however, assume the user knows what
8923 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008924 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008925 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008926 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8927 SmallString<128> LibDir(VisualStudioDir);
8928 llvm::sys::path::append(LibDir, "VC", "lib");
8929 switch (MSVC.getArch()) {
8930 case llvm::Triple::x86:
8931 // x86 just puts the libraries directly in lib
8932 break;
8933 case llvm::Triple::x86_64:
8934 llvm::sys::path::append(LibDir, "amd64");
8935 break;
8936 case llvm::Triple::arm:
8937 llvm::sys::path::append(LibDir, "arm");
8938 break;
8939 default:
8940 break;
8941 }
8942 CmdArgs.push_back(
8943 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008944
8945 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8946 std::string UniversalCRTLibPath;
8947 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8948 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8949 UniversalCRTLibPath.c_str()));
8950 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008951 }
8952
8953 std::string WindowsSdkLibPath;
8954 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8955 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8956 WindowsSdkLibPath.c_str()));
8957 }
8958
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008959 CmdArgs.push_back("-nologo");
8960
Reid Kleckner124955a2015-08-05 18:51:13 +00008961 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008962 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008963
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008964 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008965 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008966 if (DLL) {
8967 CmdArgs.push_back(Args.MakeArgString("-dll"));
8968
8969 SmallString<128> ImplibName(Output.getFilename());
8970 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008971 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008972 }
8973
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008974 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008975 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008976 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008977 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008978 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008979 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008980 };
8981 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00008982 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008983 // Make sure the dynamic runtime thunk is not optimized out at link time
8984 // to ensure proper SEH handling.
8985 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008986 } else if (DLL) {
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00008987 CmdArgs.push_back(getCompilerRTArgString(TC, Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008988 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008989 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008990 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008991 };
8992 for (const auto &Component : CompilerRTComponents)
Saleem Abdulrasoold44901f2015-09-26 03:26:44 +00008993 CmdArgs.push_back(getCompilerRTArgString(TC, Args, Component));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008994 }
Hans Wennborg65f17522013-08-27 18:10:21 +00008995 }
8996
Hans Wennborg2e274592013-08-13 23:38:57 +00008997 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00008998
Alexey Bataevc7e84352015-08-19 04:49:01 +00008999 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9000 options::OPT_fno_openmp, false)) {
9001 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9002 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9003 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9004 TC.getDriver().Dir + "/../lib"));
9005 switch (getOpenMPRuntime(getToolChain(), Args)) {
9006 case OMPRT_OMP:
9007 CmdArgs.push_back("-defaultlib:libomp.lib");
9008 break;
9009 case OMPRT_IOMP5:
9010 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9011 break;
9012 case OMPRT_GOMP:
9013 break;
9014 case OMPRT_Unknown:
9015 // Already diagnosed.
9016 break;
9017 }
9018 }
9019
Reid Kleckner337188f2014-09-16 19:22:00 +00009020 // Add filenames, libraries, and other linker inputs.
9021 for (const auto &Input : Inputs) {
9022 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009023 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009024 continue;
9025 }
9026
9027 const Arg &A = Input.getInputArg();
9028
9029 // Render -l options differently for the MSVC linker.
9030 if (A.getOption().matches(options::OPT_l)) {
9031 StringRef Lib = A.getValue();
9032 const char *LinkLibArg;
9033 if (Lib.endswith(".lib"))
9034 LinkLibArg = Args.MakeArgString(Lib);
9035 else
9036 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9037 CmdArgs.push_back(LinkLibArg);
9038 continue;
9039 }
9040
9041 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9042 // or -L. Render it, even if MSVC doesn't understand it.
9043 A.renderAsInput(Args, CmdArgs);
9044 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009045
Zachary Turner719f58c2014-12-01 23:06:47 +00009046 // We need to special case some linker paths. In the case of lld, we need to
9047 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9048 // linker, we need to use a special search algorithm.
9049 llvm::SmallString<128> linkPath;
9050 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9051 if (Linker.equals_lower("lld"))
9052 Linker = "lld-link";
9053
9054 if (Linker.equals_lower("link")) {
9055 // If we're using the MSVC linker, it's not sufficient to just use link
9056 // from the program PATH, because other environments like GnuWin32 install
9057 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009058 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009059 C.getDriver().getClangProgramPath());
9060 } else {
9061 linkPath = Linker;
9062 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009063 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009064 }
9065
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009066 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009067 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009068}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009069
Douglas Katzman95354292015-06-23 20:42:09 +00009070void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9071 const InputInfo &Output,
9072 const InputInfoList &Inputs,
9073 const ArgList &Args,
9074 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009075 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9076}
9077
Douglas Katzman95354292015-06-23 20:42:09 +00009078std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009079 Compilation &C, const JobAction &JA, const InputInfo &Output,
9080 const InputInfoList &Inputs, const ArgList &Args,
9081 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009082 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009083 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009084 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009085 CmdArgs.push_back("/W0"); // No warnings.
9086
9087 // The goal is to be able to invoke this tool correctly based on
9088 // any flag accepted by clang-cl.
9089
9090 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009091 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009092
9093 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009094 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9095 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9096 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009097 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9098 if (A->getOption().getID() == options::OPT_O0) {
9099 CmdArgs.push_back("/Od");
9100 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009101 CmdArgs.push_back("/Og");
9102
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009103 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009104 if (OptLevel == "s" || OptLevel == "z")
9105 CmdArgs.push_back("/Os");
9106 else
9107 CmdArgs.push_back("/Ot");
9108
9109 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009110 }
9111 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009112 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9113 options::OPT_fno_omit_frame_pointer))
9114 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9115 ? "/Oy"
9116 : "/Oy-");
9117 if (!Args.hasArg(options::OPT_fwritable_strings))
9118 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009119
Nico Weber3f8dafb2015-03-12 19:37:10 +00009120 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009121 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9122
David Majnemerf6072342014-07-01 22:24:56 +00009123 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9124 /*default=*/false))
9125 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009126 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9127 options::OPT_fno_function_sections))
9128 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9129 ? "/Gy"
9130 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009131 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9132 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009133 CmdArgs.push_back(
9134 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009135 if (Args.hasArg(options::OPT_fsyntax_only))
9136 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009137 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9138 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009139 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009140
Nico Weber3f8dafb2015-03-12 19:37:10 +00009141 std::vector<std::string> Includes =
9142 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009143 for (const auto &Include : Includes)
9144 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009145
Hans Wennborg87cfa712013-09-19 20:32:16 +00009146 // Flags that can simply be passed through.
9147 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9148 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009149 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009150 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009151
9152 // The order of these flags is relevant, so pick the last one.
9153 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9154 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9155 A->render(Args, CmdArgs);
9156
Hans Wennborg87cfa712013-09-19 20:32:16 +00009157 // Input filename.
9158 assert(Inputs.size() == 1);
9159 const InputInfo &II = Inputs[0];
9160 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9161 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9162 if (II.isFilename())
9163 CmdArgs.push_back(II.getFilename());
9164 else
9165 II.getInputArg().renderAsInput(Args, CmdArgs);
9166
9167 // Output filename.
9168 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009169 const char *Fo =
9170 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009171 CmdArgs.push_back(Fo);
9172
Hans Wennborg188382e2013-09-20 18:16:35 +00009173 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009174 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9175 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009176 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009177 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009178}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009179
Yaron Keren1c0070c2015-07-02 04:45:27 +00009180/// MinGW Tools
9181void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9182 const InputInfo &Output,
9183 const InputInfoList &Inputs,
9184 const ArgList &Args,
9185 const char *LinkingOutput) const {
9186 claimNoWarnArgs(Args);
9187 ArgStringList CmdArgs;
9188
9189 if (getToolChain().getArch() == llvm::Triple::x86) {
9190 CmdArgs.push_back("--32");
9191 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9192 CmdArgs.push_back("--64");
9193 }
9194
9195 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9196
9197 CmdArgs.push_back("-o");
9198 CmdArgs.push_back(Output.getFilename());
9199
9200 for (const auto &II : Inputs)
9201 CmdArgs.push_back(II.getFilename());
9202
9203 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009204 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009205
9206 if (Args.hasArg(options::OPT_gsplit_dwarf))
9207 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9208 SplitDebugName(Args, Inputs[0]));
9209}
9210
9211void MinGW::Linker::AddLibGCC(const ArgList &Args,
9212 ArgStringList &CmdArgs) const {
9213 if (Args.hasArg(options::OPT_mthreads))
9214 CmdArgs.push_back("-lmingwthrd");
9215 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009216
Yaron Kerenaa281332015-08-09 00:24:07 +00009217 // Make use of compiler-rt if --rtlib option is used
9218 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9219 if (RLT == ToolChain::RLT_Libgcc) {
9220 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9221 Args.hasArg(options::OPT_static);
9222 bool Shared = Args.hasArg(options::OPT_shared);
9223 bool CXX = getToolChain().getDriver().CCCIsCXX();
9224
9225 if (Static || (!CXX && !Shared)) {
9226 CmdArgs.push_back("-lgcc");
9227 CmdArgs.push_back("-lgcc_eh");
9228 } else {
9229 CmdArgs.push_back("-lgcc_s");
9230 CmdArgs.push_back("-lgcc");
9231 }
9232 } else {
9233 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9234 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009235
Yaron Keren1c0070c2015-07-02 04:45:27 +00009236 CmdArgs.push_back("-lmoldname");
9237 CmdArgs.push_back("-lmingwex");
9238 CmdArgs.push_back("-lmsvcrt");
9239}
9240
9241void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9242 const InputInfo &Output,
9243 const InputInfoList &Inputs,
9244 const ArgList &Args,
9245 const char *LinkingOutput) const {
9246 const ToolChain &TC = getToolChain();
9247 const Driver &D = TC.getDriver();
9248 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9249
9250 ArgStringList CmdArgs;
9251
9252 // Silence warning for "clang -g foo.o -o foo"
9253 Args.ClaimAllArgs(options::OPT_g_Group);
9254 // and "clang -emit-llvm foo.o -o foo"
9255 Args.ClaimAllArgs(options::OPT_emit_llvm);
9256 // and for "clang -w foo.o -o foo". Other warning options are already
9257 // handled somewhere else.
9258 Args.ClaimAllArgs(options::OPT_w);
9259
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009260 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9261 if (LinkerName.equals_lower("lld")) {
9262 CmdArgs.push_back("-flavor");
9263 CmdArgs.push_back("gnu");
9264 }
9265
Yaron Keren1c0070c2015-07-02 04:45:27 +00009266 if (!D.SysRoot.empty())
9267 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9268
9269 if (Args.hasArg(options::OPT_s))
9270 CmdArgs.push_back("-s");
9271
9272 CmdArgs.push_back("-m");
9273 if (TC.getArch() == llvm::Triple::x86)
9274 CmdArgs.push_back("i386pe");
9275 if (TC.getArch() == llvm::Triple::x86_64)
9276 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009277 if (TC.getArch() == llvm::Triple::arm)
9278 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009279
9280 if (Args.hasArg(options::OPT_mwindows)) {
9281 CmdArgs.push_back("--subsystem");
9282 CmdArgs.push_back("windows");
9283 } else if (Args.hasArg(options::OPT_mconsole)) {
9284 CmdArgs.push_back("--subsystem");
9285 CmdArgs.push_back("console");
9286 }
9287
9288 if (Args.hasArg(options::OPT_static))
9289 CmdArgs.push_back("-Bstatic");
9290 else {
9291 if (Args.hasArg(options::OPT_mdll))
9292 CmdArgs.push_back("--dll");
9293 else if (Args.hasArg(options::OPT_shared))
9294 CmdArgs.push_back("--shared");
9295 CmdArgs.push_back("-Bdynamic");
9296 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9297 CmdArgs.push_back("-e");
9298 if (TC.getArch() == llvm::Triple::x86)
9299 CmdArgs.push_back("_DllMainCRTStartup@12");
9300 else
9301 CmdArgs.push_back("DllMainCRTStartup");
9302 CmdArgs.push_back("--enable-auto-image-base");
9303 }
9304 }
9305
9306 CmdArgs.push_back("-o");
9307 CmdArgs.push_back(Output.getFilename());
9308
9309 Args.AddAllArgs(CmdArgs, options::OPT_e);
9310 // FIXME: add -N, -n flags
9311 Args.AddLastArg(CmdArgs, options::OPT_r);
9312 Args.AddLastArg(CmdArgs, options::OPT_s);
9313 Args.AddLastArg(CmdArgs, options::OPT_t);
9314 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9315 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9316
9317 if (!Args.hasArg(options::OPT_nostdlib) &&
9318 !Args.hasArg(options::OPT_nostartfiles)) {
9319 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9320 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9321 } else {
9322 if (Args.hasArg(options::OPT_municode))
9323 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9324 else
9325 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9326 }
9327 if (Args.hasArg(options::OPT_pg))
9328 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9329 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9330 }
9331
9332 Args.AddAllArgs(CmdArgs, options::OPT_L);
9333 const ToolChain::path_list Paths = TC.getFilePaths();
9334 for (const auto &Path : Paths)
9335 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9336
9337 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9338
9339 // TODO: Add ASan stuff here
9340
9341 // TODO: Add profile stuff here
9342
9343 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9344 !Args.hasArg(options::OPT_nodefaultlibs)) {
9345 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9346 !Args.hasArg(options::OPT_static);
9347 if (OnlyLibstdcxxStatic)
9348 CmdArgs.push_back("-Bstatic");
9349 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9350 if (OnlyLibstdcxxStatic)
9351 CmdArgs.push_back("-Bdynamic");
9352 }
9353
9354 if (!Args.hasArg(options::OPT_nostdlib)) {
9355 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9356 if (Args.hasArg(options::OPT_static))
9357 CmdArgs.push_back("--start-group");
9358
9359 if (Args.hasArg(options::OPT_fstack_protector) ||
9360 Args.hasArg(options::OPT_fstack_protector_strong) ||
9361 Args.hasArg(options::OPT_fstack_protector_all)) {
9362 CmdArgs.push_back("-lssp_nonshared");
9363 CmdArgs.push_back("-lssp");
9364 }
9365 if (Args.hasArg(options::OPT_fopenmp))
9366 CmdArgs.push_back("-lgomp");
9367
9368 AddLibGCC(Args, CmdArgs);
9369
9370 if (Args.hasArg(options::OPT_pg))
9371 CmdArgs.push_back("-lgmon");
9372
Yaron Kerenadce68e2015-07-06 18:52:19 +00009373 if (Args.hasArg(options::OPT_pthread))
9374 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009375
9376 // add system libraries
9377 if (Args.hasArg(options::OPT_mwindows)) {
9378 CmdArgs.push_back("-lgdi32");
9379 CmdArgs.push_back("-lcomdlg32");
9380 }
9381 CmdArgs.push_back("-ladvapi32");
9382 CmdArgs.push_back("-lshell32");
9383 CmdArgs.push_back("-luser32");
9384 CmdArgs.push_back("-lkernel32");
9385
9386 if (Args.hasArg(options::OPT_static))
9387 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009388 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009389 AddLibGCC(Args, CmdArgs);
9390 }
9391
9392 if (!Args.hasArg(options::OPT_nostartfiles)) {
9393 // Add crtfastmath.o if available and fast math is enabled.
9394 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9395
9396 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9397 }
9398 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009399 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009400 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009401}
9402
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009403/// XCore Tools
9404// We pass assemble and link construction to the xcc tool.
9405
Douglas Katzman95354292015-06-23 20:42:09 +00009406void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9407 const InputInfo &Output,
9408 const InputInfoList &Inputs,
9409 const ArgList &Args,
9410 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009411 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009412 ArgStringList CmdArgs;
9413
9414 CmdArgs.push_back("-o");
9415 CmdArgs.push_back(Output.getFilename());
9416
9417 CmdArgs.push_back("-c");
9418
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009419 if (Args.hasArg(options::OPT_v))
9420 CmdArgs.push_back("-v");
9421
Robert Lytton894d25c2014-05-02 09:33:25 +00009422 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9423 if (!A->getOption().matches(options::OPT_g0))
9424 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009425
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009426 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9427 false))
9428 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009429
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009430 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009431
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009432 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009433 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009434
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009435 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009437}
9438
Douglas Katzman95354292015-06-23 20:42:09 +00009439void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9440 const InputInfo &Output,
9441 const InputInfoList &Inputs,
9442 const ArgList &Args,
9443 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009444 ArgStringList CmdArgs;
9445
9446 if (Output.isFilename()) {
9447 CmdArgs.push_back("-o");
9448 CmdArgs.push_back(Output.getFilename());
9449 } else {
9450 assert(Output.isNothing() && "Invalid output.");
9451 }
9452
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009453 if (Args.hasArg(options::OPT_v))
9454 CmdArgs.push_back("-v");
9455
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009456 // Pass -fexceptions through to the linker if it was present.
9457 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9458 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009459 CmdArgs.push_back("-fexceptions");
9460
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009461 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9462
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009463 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009464 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009465}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009466
Douglas Katzman95354292015-06-23 20:42:09 +00009467void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9468 const InputInfo &Output,
9469 const InputInfoList &Inputs,
9470 const ArgList &Args,
9471 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009472 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009473 const auto &TC =
9474 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9475 ArgStringList CmdArgs;
9476 const char *Exec;
9477
9478 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009479 default:
9480 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009481 case llvm::Triple::arm:
9482 case llvm::Triple::thumb:
9483 break;
9484 case llvm::Triple::x86:
9485 CmdArgs.push_back("--32");
9486 break;
9487 case llvm::Triple::x86_64:
9488 CmdArgs.push_back("--64");
9489 break;
9490 }
9491
9492 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9493
9494 CmdArgs.push_back("-o");
9495 CmdArgs.push_back(Output.getFilename());
9496
9497 for (const auto &Input : Inputs)
9498 CmdArgs.push_back(Input.getFilename());
9499
9500 const std::string Assembler = TC.GetProgramPath("as");
9501 Exec = Args.MakeArgString(Assembler);
9502
Justin Bognerd3371d82015-07-17 03:35:54 +00009503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009504}
9505
Douglas Katzman95354292015-06-23 20:42:09 +00009506void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9507 const InputInfo &Output,
9508 const InputInfoList &Inputs,
9509 const ArgList &Args,
9510 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009511 const auto &TC =
9512 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9513 const llvm::Triple &T = TC.getTriple();
9514 const Driver &D = TC.getDriver();
9515 SmallString<128> EntryPoint;
9516 ArgStringList CmdArgs;
9517 const char *Exec;
9518
9519 // Silence warning for "clang -g foo.o -o foo"
9520 Args.ClaimAllArgs(options::OPT_g_Group);
9521 // and "clang -emit-llvm foo.o -o foo"
9522 Args.ClaimAllArgs(options::OPT_emit_llvm);
9523 // and for "clang -w foo.o -o foo"
9524 Args.ClaimAllArgs(options::OPT_w);
9525 // Other warning options are already handled somewhere else.
9526
9527 if (!D.SysRoot.empty())
9528 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9529
9530 if (Args.hasArg(options::OPT_pie))
9531 CmdArgs.push_back("-pie");
9532 if (Args.hasArg(options::OPT_rdynamic))
9533 CmdArgs.push_back("-export-dynamic");
9534 if (Args.hasArg(options::OPT_s))
9535 CmdArgs.push_back("--strip-all");
9536
9537 CmdArgs.push_back("-m");
9538 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009539 default:
9540 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009541 case llvm::Triple::arm:
9542 case llvm::Triple::thumb:
9543 // FIXME: this is incorrect for WinCE
9544 CmdArgs.push_back("thumb2pe");
9545 break;
9546 case llvm::Triple::x86:
9547 CmdArgs.push_back("i386pe");
9548 EntryPoint.append("_");
9549 break;
9550 case llvm::Triple::x86_64:
9551 CmdArgs.push_back("i386pep");
9552 break;
9553 }
9554
9555 if (Args.hasArg(options::OPT_shared)) {
9556 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009557 default:
9558 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009559 case llvm::Triple::arm:
9560 case llvm::Triple::thumb:
9561 case llvm::Triple::x86_64:
9562 EntryPoint.append("_DllMainCRTStartup");
9563 break;
9564 case llvm::Triple::x86:
9565 EntryPoint.append("_DllMainCRTStartup@12");
9566 break;
9567 }
9568
9569 CmdArgs.push_back("-shared");
9570 CmdArgs.push_back("-Bdynamic");
9571
9572 CmdArgs.push_back("--enable-auto-image-base");
9573
9574 CmdArgs.push_back("--entry");
9575 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9576 } else {
9577 EntryPoint.append("mainCRTStartup");
9578
9579 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9580 : "-Bdynamic");
9581
9582 if (!Args.hasArg(options::OPT_nostdlib) &&
9583 !Args.hasArg(options::OPT_nostartfiles)) {
9584 CmdArgs.push_back("--entry");
9585 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9586 }
9587
9588 // FIXME: handle subsystem
9589 }
9590
9591 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009592 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009593
9594 CmdArgs.push_back("-o");
9595 CmdArgs.push_back(Output.getFilename());
9596
9597 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9598 SmallString<261> ImpLib(Output.getFilename());
9599 llvm::sys::path::replace_extension(ImpLib, ".lib");
9600
9601 CmdArgs.push_back("--out-implib");
9602 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9603 }
9604
9605 if (!Args.hasArg(options::OPT_nostdlib) &&
9606 !Args.hasArg(options::OPT_nostartfiles)) {
9607 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9608 const char *CRTBegin;
9609
9610 CRTBegin =
9611 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9612 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9613 }
9614
9615 Args.AddAllArgs(CmdArgs, options::OPT_L);
9616
9617 const auto &Paths = TC.getFilePaths();
9618 for (const auto &Path : Paths)
9619 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9620
9621 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9622
9623 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9624 !Args.hasArg(options::OPT_nodefaultlibs)) {
9625 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9626 !Args.hasArg(options::OPT_static);
9627 if (StaticCXX)
9628 CmdArgs.push_back("-Bstatic");
9629 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9630 if (StaticCXX)
9631 CmdArgs.push_back("-Bdynamic");
9632 }
9633
9634 if (!Args.hasArg(options::OPT_nostdlib)) {
9635 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9636 // TODO handle /MT[d] /MD[d]
9637 CmdArgs.push_back("-lmsvcrt");
9638 AddRunTimeLibs(TC, D, CmdArgs, Args);
9639 }
9640 }
9641
9642 const std::string Linker = TC.GetProgramPath("ld");
9643 Exec = Args.MakeArgString(Linker);
9644
Justin Bognerd3371d82015-07-17 03:35:54 +00009645 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009646}
Douglas Katzman84a75642015-06-19 14:55:19 +00009647
Douglas Katzman95354292015-06-23 20:42:09 +00009648void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9649 const InputInfo &Output,
9650 const InputInfoList &Inputs,
9651 const ArgList &Args,
9652 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009653
9654 ArgStringList CmdArgs;
9655
9656 assert(Inputs.size() == 1);
9657 const InputInfo &II = Inputs[0];
9658 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9659 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9660
Douglas Katzman84a75642015-06-19 14:55:19 +00009661 CmdArgs.push_back("-DMYRIAD2");
9662 CmdArgs.push_back("-mcpu=myriad2");
9663 CmdArgs.push_back("-S");
9664
Douglas Katzmanf6071112015-08-03 14:34:22 +00009665 // Append all -I, -iquote, -isystem paths, defines/undefines,
9666 // 'f' flags, optimize flags, and warning options.
9667 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009668 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9669 options::OPT_D, options::OPT_U,
9670 options::OPT_f_Group, options::OPT_f_clang_Group,
9671 options::OPT_g_Group, options::OPT_M_Group,
9672 options::OPT_O_Group, options::OPT_W_Group});
9673
9674 // If we're producing a dependency file, and assembly is the final action,
9675 // then the name of the target in the dependency file should be the '.o'
9676 // file, not the '.s' file produced by this step. For example, instead of
9677 // /tmp/mumble.s: mumble.c .../someheader.h
9678 // the filename on the lefthand side should be "mumble.o"
9679 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9680 C.getActions().size() == 1 &&
9681 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9682 Arg *A = Args.getLastArg(options::OPT_o);
9683 if (A) {
9684 CmdArgs.push_back("-MT");
9685 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9686 }
9687 }
9688
Douglas Katzman84a75642015-06-19 14:55:19 +00009689 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9690
9691 CmdArgs.push_back(II.getFilename());
9692 CmdArgs.push_back("-o");
9693 CmdArgs.push_back(Output.getFilename());
9694
9695 std::string Exec =
9696 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009697 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9698 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009699}
9700
Douglas Katzman95354292015-06-23 20:42:09 +00009701void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9702 const InputInfo &Output,
9703 const InputInfoList &Inputs,
9704 const ArgList &Args,
9705 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009706 ArgStringList CmdArgs;
9707
9708 assert(Inputs.size() == 1);
9709 const InputInfo &II = Inputs[0];
9710 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9711 assert(Output.getType() == types::TY_Object);
9712
9713 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009714 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009715 CmdArgs.push_back("-noSPrefixing");
9716 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009717 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9718 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9719 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009720 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009721 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009722 }
9723 CmdArgs.push_back("-elf"); // Output format.
9724 CmdArgs.push_back(II.getFilename());
9725 CmdArgs.push_back(
9726 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9727
9728 std::string Exec =
9729 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009730 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9731 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009732}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009733
9734void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9735 const InputInfo &Output,
9736 const InputInfoList &Inputs,
9737 const ArgList &Args,
9738 const char *LinkingOutput) const {
9739 const auto &TC =
9740 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9741 const llvm::Triple &T = TC.getTriple();
9742 ArgStringList CmdArgs;
9743 bool UseStartfiles = !Args.hasArg(options::OPT_nostartfiles);
9744
9745 std::string StartFilesDir, BuiltinLibDir;
9746 TC.getCompilerSupportDir(StartFilesDir);
9747 TC.getBuiltinLibDir(BuiltinLibDir);
9748
9749 if (T.getArch() == llvm::Triple::sparc)
9750 CmdArgs.push_back("-EB");
9751 else // SHAVE assumes little-endian, and sparcel is expressly so.
9752 CmdArgs.push_back("-EL");
9753
9754 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9755 // but we never pass through a --sysroot option and various other bits.
9756 // For example, there are no sanitizers (yet) nor gold linker.
9757
9758 // Eat some arguments that may be present but have no effect.
9759 Args.ClaimAllArgs(options::OPT_g_Group);
9760 Args.ClaimAllArgs(options::OPT_w);
9761 Args.ClaimAllArgs(options::OPT_static_libgcc);
9762
9763 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
9764 CmdArgs.push_back("-s");
9765
9766 CmdArgs.push_back("-o");
9767 CmdArgs.push_back(Output.getFilename());
9768
9769 if (UseStartfiles) {
9770 // If you want startfiles, it means you want the builtin crti and crtbegin,
9771 // but not crt0. Myriad link commands provide their own crt0.o as needed.
9772 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crti.o"));
9773 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtbegin.o"));
9774 }
9775
9776 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
9777 options::OPT_e, options::OPT_s, options::OPT_t,
9778 options::OPT_Z_Flag, options::OPT_r});
9779
9780 // The linker doesn't use these builtin paths unless directed to,
9781 // because it was not compiled for support with sysroots, nor does
9782 // it have a default of little-endian with FPU.
9783 CmdArgs.push_back(Args.MakeArgString("-L" + BuiltinLibDir));
9784 CmdArgs.push_back(Args.MakeArgString("-L" + StartFilesDir));
9785
9786 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9787
9788 if (T.getOS() == llvm::Triple::RTEMS) {
9789 CmdArgs.push_back("--start-group");
9790 CmdArgs.push_back("-lc");
9791 // You must provide your own "-L" option to enable finding these.
9792 CmdArgs.push_back("-lrtemscpu");
9793 CmdArgs.push_back("-lrtemsbsp");
9794 CmdArgs.push_back("--end-group");
9795 } else {
9796 CmdArgs.push_back("-lc");
9797 }
9798 if (C.getDriver().CCCIsCXX())
9799 CmdArgs.push_back("-lstdc++");
9800 CmdArgs.push_back("-lgcc");
9801 if (UseStartfiles) {
9802 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtend.o"));
9803 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crtn.o"));
9804 }
9805
9806 std::string Exec =
9807 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
9808 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9809 CmdArgs, Inputs));
9810}