blob: 7c85985059263138a0673f907c7bfadad36171b4 [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);
563 std::string Arch = arm::getARMArch(ArchName, Triple);
Chandler Carruthd96f37a2015-08-30 07:51:18 +0000564 if (arm::getLLVMArchSuffixForARM(CPU, Arch).empty())
Renato Goline17c5802015-07-27 23:44:42 +0000565 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000566}
567
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000568static bool useAAPCSForMachO(const llvm::Triple &T) {
569 // The backend is hardwired to assume AAPCS for M-class processors, ensure
570 // the frontend matches that.
571 return T.getEnvironment() == llvm::Triple::EABI ||
572 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
573}
574
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000575// Select the float ABI as determined by -msoft-float, -mhard-float, and
576// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000577StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000578 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000579 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000580 if (Arg *A =
581 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
582 options::OPT_mfloat_abi_EQ)) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000583 if (A->getOption().matches(options::OPT_msoft_float))
584 FloatABI = "soft";
585 else if (A->getOption().matches(options::OPT_mhard_float))
586 FloatABI = "hard";
587 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000588 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000589 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000590 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Daniel Dunbar78485922009-09-10 23:00:09 +0000591 FloatABI = "soft";
592 }
593 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000594
595 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
596 // "apcs-gnu".
597 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
598 FloatABI == "hard")
599 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
600 << Triple.getArchName();
Daniel Dunbar78485922009-09-10 23:00:09 +0000601 }
602
603 // If unspecified, choose the default based on the platform.
604 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000605 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000606 case llvm::Triple::Darwin:
607 case llvm::Triple::MacOSX:
608 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 // Darwin defaults to "softfp" for v6 and v7.
610 //
John Brawn94fd9632015-05-21 12:19:49 +0000611 if (getARMSubArchVersionNumber(Triple) == 6 ||
612 getARMSubArchVersionNumber(Triple) == 7)
Daniel Dunbar78485922009-09-10 23:00:09 +0000613 FloatABI = "softfp";
614 else
615 FloatABI = "soft";
616 break;
617 }
618
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000619 // FIXME: this is invalid for WindowsCE
620 case llvm::Triple::Win32:
621 FloatABI = "hard";
622 break;
623
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000624 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000625 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000626 case llvm::Triple::GNUEABIHF:
627 FloatABI = "hard";
628 break;
629 default:
630 // FreeBSD defaults to soft float
631 FloatABI = "soft";
632 break;
633 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000634 break;
635
Daniel Dunbar78485922009-09-10 23:00:09 +0000636 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000637 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000638 case llvm::Triple::GNUEABIHF:
639 FloatABI = "hard";
640 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000641 case llvm::Triple::GNUEABI:
642 FloatABI = "softfp";
643 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000644 case llvm::Triple::EABIHF:
645 FloatABI = "hard";
646 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000647 case llvm::Triple::EABI:
648 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
649 FloatABI = "softfp";
650 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000651 case llvm::Triple::Android: {
John Brawn94fd9632015-05-21 12:19:49 +0000652 if (getARMSubArchVersionNumber(Triple) == 7)
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000653 FloatABI = "softfp";
654 else
655 FloatABI = "soft";
656 break;
657 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000658 default:
659 // Assume "soft", but warn the user we are guessing.
660 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000661 if (Triple.getOS() != llvm::Triple::UnknownOS ||
662 !Triple.isOSBinFormatMachO())
663 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 break;
665 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
668
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000669 return FloatABI;
670}
671
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000672static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
673 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000674 std::vector<const char *> &Features,
675 bool ForAS) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000676 bool KernelOrKext =
677 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Nico Weber6e0ebae2015-04-29 21:16:40 +0000678 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000679 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
680 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
681
Nico Weber6e0ebae2015-04-29 21:16:40 +0000682 if (!ForAS) {
683 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
684 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
685 // stripped out by the ARM target. We should probably pass this a new
686 // -target-option, which is handled by the -cc1/-cc1as invocation.
687 //
688 // FIXME2: For consistency, it would be ideal if we set up the target
689 // machine state the same when using the frontend or the assembler. We don't
690 // currently do that for the assembler, we pass the options directly to the
691 // backend and never even instantiate the frontend TargetInfo. If we did,
692 // and used its handleTargetFeatures hook, then we could ensure the
693 // assembler and the frontend behave the same.
694
695 // Use software floating point operations?
696 if (FloatABI == "soft")
697 Features.push_back("+soft-float");
698
699 // Use software floating point argument passing?
700 if (FloatABI != "hard")
701 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000702 } else {
703 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
704 // to the assembler correctly.
705 for (const Arg *A :
706 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
707 StringRef Value = A->getValue();
708 if (Value.startswith("-mfpu=")) {
709 WaFPU = A;
710 } else if (Value.startswith("-mcpu=")) {
711 WaCPU = A;
712 } else if (Value.startswith("-mhwdiv=")) {
713 WaHDiv = A;
714 } else if (Value.startswith("-march=")) {
715 WaArch = A;
716 }
717 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000718 }
719
Renato Golin7c542b42015-07-27 23:44:45 +0000720 // Check -march. ClangAs gives preference to -Wa,-march=.
721 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000722 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000723 if (WaArch) {
724 if (ArchArg)
725 D.Diag(clang::diag::warn_drv_unused_argument)
726 << ArchArg->getAsString(Args);
727 ArchName = StringRef(WaArch->getValue()).substr(7);
728 checkARMArchName(D, WaArch, Args, ArchName, Triple);
729 // FIXME: Set Arch.
730 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
731 } else if (ArchArg) {
732 ArchName = ArchArg->getValue();
733 checkARMArchName(D, ArchArg, Args, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000734 }
735
Renato Golin7c542b42015-07-27 23:44:45 +0000736 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
737 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000738 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000739 if (WaCPU) {
740 if (CPUArg)
741 D.Diag(clang::diag::warn_drv_unused_argument)
742 << CPUArg->getAsString(Args);
743 CPUName = StringRef(WaCPU->getValue()).substr(6);
744 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Triple);
745 } else if (CPUArg) {
746 CPUName = CPUArg->getValue();
747 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000748 }
John Brawna95c1a82015-05-08 12:52:18 +0000749
Renato Golin23459c62015-07-30 16:40:17 +0000750 // Add CPU features for generic CPUs
751 if (CPUName == "native") {
752 llvm::StringMap<bool> HostFeatures;
753 if (llvm::sys::getHostCPUFeatures(HostFeatures))
754 for (auto &F : HostFeatures)
755 Features.push_back(
756 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
757 }
758
759 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
760 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
761 if (WaFPU) {
762 if (FPUArg)
763 D.Diag(clang::diag::warn_drv_unused_argument)
764 << FPUArg->getAsString(Args);
765 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
766 Features);
767 } else if (FPUArg) {
768 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
769 }
770
771 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
772 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
773 if (WaHDiv) {
774 if (HDivArg)
775 D.Diag(clang::diag::warn_drv_unused_argument)
776 << HDivArg->getAsString(Args);
777 getARMHWDivFeatures(D, WaHDiv, Args,
778 StringRef(WaHDiv->getValue()).substr(8), Features);
779 } else if (HDivArg)
780 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
781
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000782 // Setting -msoft-float effectively disables NEON because of the GCC
783 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000784 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000785 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000786 // Also need to explicitly disable features which imply NEON.
787 Features.push_back("-crypto");
788 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000789
Eric Christopher269c2a22015-04-04 03:34:43 +0000790 // En/disable crc code generation.
791 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000792 if (A->getOption().matches(options::OPT_mcrc))
793 Features.push_back("+crc");
794 else
795 Features.push_back("-crc");
796 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000797
798 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
799 Features.insert(Features.begin(), "+v8.1a");
800 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000801
Akira Hatanakac2694822015-07-07 08:28:42 +0000802 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
803 // neither options are specified, see if we are compiling for kernel/kext and
804 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000805 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
806 options::OPT_mno_long_calls)) {
807 if (A->getOption().matches(options::OPT_mlong_calls))
808 Features.push_back("+long-calls");
809 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6))) {
810 Features.push_back("+long-calls");
811 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000812
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000813 // Kernel code has more strict alignment requirements.
814 if (KernelOrKext)
815 Features.push_back("+strict-align");
816 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
817 options::OPT_munaligned_access)) {
818 if (A->getOption().matches(options::OPT_munaligned_access)) {
819 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
820 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
821 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
822 } else
823 Features.push_back("+strict-align");
824 } else {
825 // Assume pre-ARMv6 doesn't support unaligned accesses.
826 //
827 // ARMv6 may or may not support unaligned accesses depending on the
828 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
829 // Darwin and NetBSD targets support unaligned accesses, and others don't.
830 //
831 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
832 // which raises an alignment fault on unaligned accesses. Linux
833 // defaults this bit to 0 and handles it as a system-wide (not
834 // per-process) setting. It is therefore safe to assume that ARMv7+
835 // Linux targets support unaligned accesses. The same goes for NaCl.
836 //
837 // The above behavior is consistent with GCC.
838 int VersionNum = getARMSubArchVersionNumber(Triple);
839 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
840 if (VersionNum < 6)
841 Features.push_back("+strict-align");
842 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
843 if (VersionNum < 7)
844 Features.push_back("+strict-align");
845 } else
846 Features.push_back("+strict-align");
847 }
848
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000849 // llvm does not support reserving registers in general. There is support
850 // for reserving r9 on ARM though (defined as a platform-specific register
851 // in ARM EABI).
852 if (Args.hasArg(options::OPT_ffixed_r9))
853 Features.push_back("+reserve-r9");
854
Akira Hatanaka580efb22015-07-16 00:43:00 +0000855 // The kext linker doesn't know how to deal with movw/movt.
856 if (KernelOrKext)
857 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000858}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000859
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000860void Clang::AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000861 bool KernelOrKext) const {
862 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000863 // Get the effective triple, which takes into account the deployment target.
864 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
865 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000866
867 // Select the ABI to use.
868 //
869 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000870 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000871 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000872 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000873 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000874 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000875 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000876 ABIName = "aapcs";
877 } else {
878 ABIName = "apcs-gnu";
879 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000880 } else if (Triple.isOSWindows()) {
881 // FIXME: this is invalid for WindowsCE
882 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000883 } else {
884 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000885 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000886 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000887 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000888 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000889 ABIName = "aapcs-linux";
890 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000891 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000892 case llvm::Triple::EABI:
893 ABIName = "aapcs";
894 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000895 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000896 if (Triple.getOS() == llvm::Triple::NetBSD)
897 ABIName = "apcs-gnu";
898 else
899 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000900 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000901 }
902 }
903 CmdArgs.push_back("-target-abi");
904 CmdArgs.push_back(ABIName);
905
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000906 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000907 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000908 if (FloatABI == "soft") {
909 // Floating point operations and argument passing are soft.
910 //
911 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000912 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000915 } else if (FloatABI == "softfp") {
916 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000917 CmdArgs.push_back("-mfloat-abi");
918 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000919 } else {
920 // Floating point operations and argument passing are hard.
921 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000922 CmdArgs.push_back("-mfloat-abi");
923 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000924 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000925
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000926 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000927 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
928 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000929 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000930 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000931 CmdArgs.push_back("-arm-global-merge=false");
932 else
933 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000934 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000935
Bob Wilson9c8af452013-04-11 18:53:25 +0000936 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000937 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000938 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000939}
Renato Goline17c5802015-07-27 23:44:42 +0000940// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000941
Tim Northover573cbee2014-05-24 12:52:07 +0000942/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
943/// targeting.
944static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +0000945 Arg *A;
946 std::string CPU;
947 // If we have -mtune or -mcpu, use that.
948 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +0000949 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +0000950 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +0000951 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +0000952 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +0000953 }
954
Kevin Qin110db6f2014-07-18 07:03:22 +0000955 // Handle CPU name is 'native'.
956 if (CPU == "native")
957 return llvm::sys::getHostCPUName();
958 else if (CPU.size())
959 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +0000960
James Molloy9b1586b2014-04-17 12:51:17 +0000961 // Make sure we pick "cyclone" if -arch is used.
962 // FIXME: Should this be picked by checking the target triple instead?
963 if (Args.getLastArg(options::OPT_arch))
964 return "cyclone";
965
966 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000967}
968
Tim Northover573cbee2014-05-24 12:52:07 +0000969void Clang::AddAArch64TargetArgs(const ArgList &Args,
970 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000971 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
972 llvm::Triple Triple(TripleStr);
973
974 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
975 Args.hasArg(options::OPT_mkernel) ||
976 Args.hasArg(options::OPT_fapple_kext))
977 CmdArgs.push_back("-disable-red-zone");
978
979 if (!Args.hasFlag(options::OPT_mimplicit_float,
980 options::OPT_mno_implicit_float, true))
981 CmdArgs.push_back("-no-implicit-float");
982
Craig Topper92fc2df2014-05-17 16:56:41 +0000983 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000984 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
985 ABIName = A->getValue();
986 else if (Triple.isOSDarwin())
987 ABIName = "darwinpcs";
988 else
989 ABIName = "aapcs";
990
991 CmdArgs.push_back("-target-abi");
992 CmdArgs.push_back(ABIName);
993
Bradley Smith9ff64332014-10-13 10:16:06 +0000994 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
995 options::OPT_mno_fix_cortex_a53_835769)) {
996 CmdArgs.push_back("-backend-option");
997 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
998 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
999 else
1000 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001001 } else if (Triple.getEnvironment() == llvm::Triple::Android) {
1002 // Enabled A53 errata (835769) workaround by default on android
1003 CmdArgs.push_back("-backend-option");
1004 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001005 }
1006
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001008 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1009 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001010 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001011 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001012 CmdArgs.push_back("-aarch64-global-merge=false");
1013 else
1014 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001015 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001016}
1017
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001018// Get CPU and ABI names. They are not independent
1019// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001020void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1021 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001022 const char *DefMips32CPU = "mips32r2";
1023 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001024
Daniel Sanders2bf13662014-07-10 14:40:57 +00001025 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1026 // default for mips64(el)?-img-linux-gnu.
1027 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1028 Triple.getEnvironment() == llvm::Triple::GNU) {
1029 DefMips32CPU = "mips32r6";
1030 DefMips64CPU = "mips64r6";
1031 }
Renato Golin7c542b42015-07-27 23:44:45 +00001032
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001033 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
1034 if (Triple.getEnvironment() == llvm::Triple::Android)
1035 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001036
Brad Smithba26f582015-01-06 02:53:17 +00001037 // MIPS3 is the default for mips64*-unknown-openbsd.
1038 if (Triple.getOS() == llvm::Triple::OpenBSD)
1039 DefMips64CPU = "mips3";
1040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001041 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001042 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001043
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001044 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001045 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001046 // Convert a GNU style Mips ABI name to the name
1047 // accepted by LLVM Mips backend.
1048 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001049 .Case("32", "o32")
1050 .Case("64", "n64")
1051 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001052 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001053
1054 // Setup default CPU and ABI names.
1055 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001056 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001057 default:
1058 llvm_unreachable("Unexpected triple arch name");
1059 case llvm::Triple::mips:
1060 case llvm::Triple::mipsel:
1061 CPUName = DefMips32CPU;
1062 break;
1063 case llvm::Triple::mips64:
1064 case llvm::Triple::mips64el:
1065 CPUName = DefMips64CPU;
1066 break;
1067 }
1068 }
1069
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001070 if (ABIName.empty()) {
1071 // Deduce ABI name from the target triple.
1072 if (Triple.getArch() == llvm::Triple::mips ||
1073 Triple.getArch() == llvm::Triple::mipsel)
1074 ABIName = "o32";
1075 else
1076 ABIName = "n64";
1077 }
1078
1079 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001080 // Deduce CPU name from ABI name.
1081 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001082 .Cases("o32", "eabi", DefMips32CPU)
1083 .Cases("n32", "n64", DefMips64CPU)
1084 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001085 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001086
1087 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001088}
1089
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001090// Convert ABI name to the GNU tools acceptable variant.
1091static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1092 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001093 .Case("o32", "32")
1094 .Case("n64", "64")
1095 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001096}
1097
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001098// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1099// and -mfloat-abi=.
1100static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001101 StringRef FloatABI;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001102 if (Arg *A =
1103 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1104 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001105 if (A->getOption().matches(options::OPT_msoft_float))
1106 FloatABI = "soft";
1107 else if (A->getOption().matches(options::OPT_mhard_float))
1108 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001109 else {
Richard Smithbd55daf2012-11-01 04:30:05 +00001110 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +00001111 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001112 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001113 FloatABI = "hard";
1114 }
1115 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001116 }
1117
1118 // If unspecified, choose the default based on the platform.
1119 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001120 // Assume "hard", because it's a default value used by gcc.
1121 // When we start to recognize specific target MIPS processors,
1122 // we will be able to select the default more correctly.
1123 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001124 }
1125
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001126 return FloatABI;
1127}
1128
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001129static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001130 std::vector<const char *> &Features,
1131 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001132 StringRef FeatureName) {
1133 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001134 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001135 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001136 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001137 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001138 }
1139}
1140
Daniel Sanders379d44b2014-07-16 11:52:23 +00001141static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1142 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001143 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001144 StringRef CPUName;
1145 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001146 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001147 ABIName = getGnuCompatibleMipsABIName(ABIName);
1148
Daniel Sandersfeb61302014-08-08 15:47:17 +00001149 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1150 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001151
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001152 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001153 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001154 // FIXME: Note, this is a hack. We need to pass the selected float
1155 // mode to the MipsTargetInfoBase to define appropriate macros there.
1156 // Now it is the only method.
1157 Features.push_back("+soft-float");
1158 }
1159
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001161 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001162 if (Val == "2008") {
1163 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1164 Features.push_back("+nan2008");
1165 else {
1166 Features.push_back("-nan2008");
1167 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1168 }
1169 } else if (Val == "legacy") {
1170 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1171 Features.push_back("-nan2008");
1172 else {
1173 Features.push_back("+nan2008");
1174 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1175 }
1176 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001177 D.Diag(diag::err_drv_unsupported_option_argument)
1178 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001179 }
1180
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001181 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1182 options::OPT_mdouble_float, "single-float");
1183 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1184 "mips16");
1185 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1186 options::OPT_mno_micromips, "micromips");
1187 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1188 "dsp");
1189 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1190 "dspr2");
1191 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1192 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001193
1194 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1195 // pass -mfpxx
1196 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1197 options::OPT_mfp64)) {
1198 if (A->getOption().matches(options::OPT_mfp32))
1199 Features.push_back(Args.MakeArgString("-fp64"));
1200 else if (A->getOption().matches(options::OPT_mfpxx)) {
1201 Features.push_back(Args.MakeArgString("+fpxx"));
1202 Features.push_back(Args.MakeArgString("+nooddspreg"));
1203 } else
1204 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001205 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001206 Features.push_back(Args.MakeArgString("+fpxx"));
1207 Features.push_back(Args.MakeArgString("+nooddspreg"));
1208 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001209
Daniel Sanders28e5d392014-07-10 10:39:51 +00001210 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1211 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001212}
1213
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001214void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001215 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001216 const Driver &D = getToolChain().getDriver();
1217 StringRef CPUName;
1218 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001219 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001220 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001221
1222 CmdArgs.push_back("-target-abi");
1223 CmdArgs.push_back(ABIName.data());
1224
1225 StringRef FloatABI = getMipsFloatABI(D, Args);
1226
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001227 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001228 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001229 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001230 CmdArgs.push_back("-mfloat-abi");
1231 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001232 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001233 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001234 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001235 CmdArgs.push_back("-mfloat-abi");
1236 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001237 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001238
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001239 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1240 if (A->getOption().matches(options::OPT_mxgot)) {
1241 CmdArgs.push_back("-mllvm");
1242 CmdArgs.push_back("-mxgot");
1243 }
1244 }
1245
Simon Atanasyanc580b322013-05-11 06:33:44 +00001246 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1247 options::OPT_mno_ldc1_sdc1)) {
1248 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1249 CmdArgs.push_back("-mllvm");
1250 CmdArgs.push_back("-mno-ldc1-sdc1");
1251 }
1252 }
1253
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001254 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1255 options::OPT_mno_check_zero_division)) {
1256 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1257 CmdArgs.push_back("-mllvm");
1258 CmdArgs.push_back("-mno-check-zero-division");
1259 }
1260 }
1261
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001262 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001263 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001264 CmdArgs.push_back("-mllvm");
1265 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1266 A->claim();
1267 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001268}
1269
Hal Finkel8eb59282012-06-11 22:35:19 +00001270/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1271static std::string getPPCTargetCPU(const ArgList &Args) {
1272 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001273 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001274
1275 if (CPUName == "native") {
1276 std::string CPU = llvm::sys::getHostCPUName();
1277 if (!CPU.empty() && CPU != "generic")
1278 return CPU;
1279 else
1280 return "";
1281 }
1282
1283 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001284 .Case("common", "generic")
1285 .Case("440", "440")
1286 .Case("440fp", "440")
1287 .Case("450", "450")
1288 .Case("601", "601")
1289 .Case("602", "602")
1290 .Case("603", "603")
1291 .Case("603e", "603e")
1292 .Case("603ev", "603ev")
1293 .Case("604", "604")
1294 .Case("604e", "604e")
1295 .Case("620", "620")
1296 .Case("630", "pwr3")
1297 .Case("G3", "g3")
1298 .Case("7400", "7400")
1299 .Case("G4", "g4")
1300 .Case("7450", "7450")
1301 .Case("G4+", "g4+")
1302 .Case("750", "750")
1303 .Case("970", "970")
1304 .Case("G5", "g5")
1305 .Case("a2", "a2")
1306 .Case("a2q", "a2q")
1307 .Case("e500mc", "e500mc")
1308 .Case("e5500", "e5500")
1309 .Case("power3", "pwr3")
1310 .Case("power4", "pwr4")
1311 .Case("power5", "pwr5")
1312 .Case("power5x", "pwr5x")
1313 .Case("power6", "pwr6")
1314 .Case("power6x", "pwr6x")
1315 .Case("power7", "pwr7")
1316 .Case("power8", "pwr8")
1317 .Case("pwr3", "pwr3")
1318 .Case("pwr4", "pwr4")
1319 .Case("pwr5", "pwr5")
1320 .Case("pwr5x", "pwr5x")
1321 .Case("pwr6", "pwr6")
1322 .Case("pwr6x", "pwr6x")
1323 .Case("pwr7", "pwr7")
1324 .Case("pwr8", "pwr8")
1325 .Case("powerpc", "ppc")
1326 .Case("powerpc64", "ppc64")
1327 .Case("powerpc64le", "ppc64le")
1328 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001329 }
1330
1331 return "";
1332}
1333
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001334static void getPPCTargetFeatures(const ArgList &Args,
1335 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001336 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1337 StringRef Name = A->getOption().getName();
1338 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001339
1340 // Skip over "-m".
1341 assert(Name.startswith("m") && "Invalid feature name.");
1342 Name = Name.substr(1);
1343
1344 bool IsNegative = Name.startswith("no-");
1345 if (IsNegative)
1346 Name = Name.substr(3);
1347
1348 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1349 // pass the correct option to the backend while calling the frontend
1350 // option the same.
1351 // TODO: Change the LLVM backend option maybe?
1352 if (Name == "mfcrf")
1353 Name = "mfocrf";
1354
1355 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1356 }
1357
1358 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001359 AddTargetFeature(Args, Features, options::OPT_faltivec,
1360 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001361}
1362
Ulrich Weigand8afad612014-07-28 13:17:52 +00001363void Clang::AddPPCTargetArgs(const ArgList &Args,
1364 ArgStringList &CmdArgs) const {
1365 // Select the ABI to use.
1366 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001367 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001368 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001369 case llvm::Triple::ppc64: {
1370 // When targeting a processor that supports QPX, or if QPX is
1371 // specifically enabled, default to using the ABI that supports QPX (so
1372 // long as it is not specifically disabled).
1373 bool HasQPX = false;
1374 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1375 HasQPX = A->getValue() == StringRef("a2q");
1376 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1377 if (HasQPX) {
1378 ABIName = "elfv1-qpx";
1379 break;
1380 }
1381
Ulrich Weigand8afad612014-07-28 13:17:52 +00001382 ABIName = "elfv1";
1383 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001384 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001385 case llvm::Triple::ppc64le:
1386 ABIName = "elfv2";
1387 break;
1388 default:
1389 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001390 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001391
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001392 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1393 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1394 // the option if given as we don't have backend support for any targets
1395 // that don't use the altivec abi.
1396 if (StringRef(A->getValue()) != "altivec")
1397 ABIName = A->getValue();
1398
Ulrich Weigand8afad612014-07-28 13:17:52 +00001399 if (ABIName) {
1400 CmdArgs.push_back("-target-abi");
1401 CmdArgs.push_back(ABIName);
1402 }
1403}
1404
1405bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1406 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1407 return A && (A->getValue() == StringRef(Value));
1408}
1409
Tom Stellard6674c702013-04-01 20:56:53 +00001410/// Get the (LLVM) name of the R600 gpu we are targeting.
1411static std::string getR600TargetGPU(const ArgList &Args) {
1412 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001413 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001414 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001415 .Cases("rv630", "rv635", "r600")
1416 .Cases("rv610", "rv620", "rs780", "rs880")
1417 .Case("rv740", "rv770")
1418 .Case("palm", "cedar")
1419 .Cases("sumo", "sumo2", "sumo")
1420 .Case("hemlock", "cypress")
1421 .Case("aruba", "cayman")
1422 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001423 }
1424 return "";
1425}
1426
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001427void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001428 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001429 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001430 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001431
James Y Knightb2406522015-06-15 20:51:24 +00001432 bool SoftFloatABI = false;
1433 if (Arg *A =
1434 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001435 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001436 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001437 }
1438
James Y Knightb2406522015-06-15 20:51:24 +00001439 // Only the hard-float ABI on Sparc is standardized, and it is the
1440 // default. GCC also supports a nonstandard soft-float ABI mode, and
1441 // perhaps LLVM should implement that, too. However, since llvm
1442 // currently does not support Sparc soft-float, at all, display an
1443 // error if it's requested.
1444 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001445 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1446 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001447 }
1448}
1449
Richard Sandiford4652d892013-07-19 16:51:51 +00001450static const char *getSystemZTargetCPU(const ArgList &Args) {
1451 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1452 return A->getValue();
1453 return "z10";
1454}
1455
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001456static void getSystemZTargetFeatures(const ArgList &Args,
1457 std::vector<const char *> &Features) {
1458 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001460 if (A->getOption().matches(options::OPT_mhtm))
1461 Features.push_back("+transactional-execution");
1462 else
1463 Features.push_back("-transactional-execution");
1464 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001465 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001466 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001467 if (A->getOption().matches(options::OPT_mvx))
1468 Features.push_back("+vector");
1469 else
1470 Features.push_back("-vector");
1471 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001472}
1473
Chandler Carruth953fb082013-01-13 11:46:33 +00001474static const char *getX86TargetCPU(const ArgList &Args,
1475 const llvm::Triple &Triple) {
1476 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001477 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001478 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001479 return "core-avx2";
1480
Chandler Carruth953fb082013-01-13 11:46:33 +00001481 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001482 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001483
1484 // FIXME: Reject attempts to use -march=native unless the target matches
1485 // the host.
1486 //
1487 // FIXME: We should also incorporate the detected target features for use
1488 // with -native.
1489 std::string CPU = llvm::sys::getHostCPUName();
1490 if (!CPU.empty() && CPU != "generic")
1491 return Args.MakeArgString(CPU);
1492 }
1493
Reid Kleckner3123eff2015-06-30 16:32:04 +00001494 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1495 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1496 StringRef Arch = A->getValue();
1497 const char *CPU;
1498 if (Triple.getArch() == llvm::Triple::x86) {
1499 CPU = llvm::StringSwitch<const char *>(Arch)
1500 .Case("IA32", "i386")
1501 .Case("SSE", "pentium3")
1502 .Case("SSE2", "pentium4")
1503 .Case("AVX", "sandybridge")
1504 .Case("AVX2", "haswell")
1505 .Default(nullptr);
1506 } else {
1507 CPU = llvm::StringSwitch<const char *>(Arch)
1508 .Case("AVX", "sandybridge")
1509 .Case("AVX2", "haswell")
1510 .Default(nullptr);
1511 }
1512 if (CPU)
1513 return CPU;
1514 }
1515
Chandler Carruth953fb082013-01-13 11:46:33 +00001516 // Select the default CPU if none was given (or detection failed).
1517
1518 if (Triple.getArch() != llvm::Triple::x86_64 &&
1519 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001520 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001521
1522 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1523
1524 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001525 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001526 if (Triple.getArchName() == "x86_64h")
1527 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001528 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001529 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001530
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001531 // Set up default CPU name for PS4 compilers.
1532 if (Triple.isPS4CPU())
1533 return "btver2";
1534
Alexey Bataev286d1b92014-01-31 04:07:13 +00001535 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001536 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001537 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001538
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001539 // Everything else goes to x86-64 in 64-bit mode.
1540 if (Is64Bit)
1541 return "x86-64";
1542
1543 switch (Triple.getOS()) {
1544 case llvm::Triple::FreeBSD:
1545 case llvm::Triple::NetBSD:
1546 case llvm::Triple::OpenBSD:
1547 return "i486";
1548 case llvm::Triple::Haiku:
1549 return "i586";
1550 case llvm::Triple::Bitrig:
1551 return "i686";
1552 default:
1553 // Fallback to p4.
1554 return "pentium4";
1555 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001556}
1557
Dan Gohmanc2853072015-09-03 22:51:53 +00001558/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1559static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1560 // If we have -mcpu=, use that.
1561 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1562 StringRef CPU = A->getValue();
1563
1564#ifdef __wasm__
1565 // Handle "native" by examining the host. "native" isn't meaningful when
1566 // cross compiling, so only support this when the host is also WebAssembly.
1567 if (CPU == "native")
1568 return llvm::sys::getHostCPUName();
1569#endif
1570
1571 return CPU;
1572 }
1573
1574 return "generic";
1575}
1576
Renato Golin7c542b42015-07-27 23:44:45 +00001577static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1578 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001579 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001580 default:
1581 return "";
1582
Amara Emerson703da2e2013-10-31 09:32:33 +00001583 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001584 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001585 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001586
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001587 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001588 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001589 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001590 case llvm::Triple::thumbeb: {
1591 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001592 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001593 return arm::getARMTargetCPU(MCPU, MArch, T);
1594 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001595 case llvm::Triple::mips:
1596 case llvm::Triple::mipsel:
1597 case llvm::Triple::mips64:
1598 case llvm::Triple::mips64el: {
1599 StringRef CPUName;
1600 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001601 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001602 return CPUName;
1603 }
1604
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001605 case llvm::Triple::nvptx:
1606 case llvm::Triple::nvptx64:
1607 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1608 return A->getValue();
1609 return "";
1610
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001611 case llvm::Triple::ppc:
1612 case llvm::Triple::ppc64:
1613 case llvm::Triple::ppc64le: {
1614 std::string TargetCPUName = getPPCTargetCPU(Args);
1615 // LLVM may default to generating code for the native CPU,
1616 // but, like gcc, we default to a more generic option for
1617 // each architecture. (except on Darwin)
1618 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1619 if (T.getArch() == llvm::Triple::ppc64)
1620 TargetCPUName = "ppc64";
1621 else if (T.getArch() == llvm::Triple::ppc64le)
1622 TargetCPUName = "ppc64le";
1623 else
1624 TargetCPUName = "ppc";
1625 }
1626 return TargetCPUName;
1627 }
1628
1629 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001630 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001631 case llvm::Triple::sparcv9:
1632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001633 return A->getValue();
1634 return "";
1635
1636 case llvm::Triple::x86:
1637 case llvm::Triple::x86_64:
1638 return getX86TargetCPU(Args, T);
1639
1640 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001641 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001642
1643 case llvm::Triple::systemz:
1644 return getSystemZTargetCPU(Args);
1645
1646 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001647 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001648 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001649
1650 case llvm::Triple::wasm32:
1651 case llvm::Triple::wasm64:
1652 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001653 }
1654}
1655
Alp Tokerce365ca2013-12-02 12:43:03 +00001656static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1657 ArgStringList &CmdArgs) {
1658 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1659 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1660 // forward.
1661 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 std::string Plugin =
1663 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001664 CmdArgs.push_back(Args.MakeArgString(Plugin));
1665
1666 // Try to pass driver level flags relevant to LTO code generation down to
1667 // the plugin.
1668
1669 // Handle flags for selecting CPU variants.
1670 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1671 if (!CPU.empty())
1672 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1673}
1674
Sanjay Patel2987c292015-06-11 14:53:41 +00001675/// This is a helper function for validating the optional refinement step
1676/// parameter in reciprocal argument strings. Return false if there is an error
1677/// parsing the refinement step. Otherwise, return true and set the Position
1678/// of the refinement step in the input string.
1679static bool getRefinementStep(const StringRef &In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001680 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001681 const char RefinementStepToken = ':';
1682 Position = In.find(RefinementStepToken);
1683 if (Position != StringRef::npos) {
1684 StringRef Option = A.getOption().getName();
1685 StringRef RefStep = In.substr(Position + 1);
1686 // Allow exactly one numeric character for the additional refinement
1687 // step parameter. This is reasonable for all currently-supported
1688 // operations and architectures because we would expect that a larger value
1689 // of refinement steps would cause the estimate "optimization" to
1690 // under-perform the native operation. Also, if the estimate does not
1691 // converge quickly, it probably will not ever converge, so further
1692 // refinement steps will not produce a better answer.
1693 if (RefStep.size() != 1) {
1694 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1695 return false;
1696 }
1697 char RefStepChar = RefStep[0];
1698 if (RefStepChar < '0' || RefStepChar > '9') {
1699 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1700 return false;
1701 }
1702 }
1703 return true;
1704}
1705
1706/// The -mrecip flag requires processing of many optional parameters.
1707static void ParseMRecip(const Driver &D, const ArgList &Args,
1708 ArgStringList &OutStrings) {
1709 StringRef DisabledPrefixIn = "!";
1710 StringRef DisabledPrefixOut = "!";
1711 StringRef EnabledPrefixOut = "";
1712 StringRef Out = "-mrecip=";
1713
1714 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1715 if (!A)
1716 return;
1717
1718 unsigned NumOptions = A->getNumValues();
1719 if (NumOptions == 0) {
1720 // No option is the same as "all".
1721 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1722 return;
1723 }
1724
1725 // Pass through "all", "none", or "default" with an optional refinement step.
1726 if (NumOptions == 1) {
1727 StringRef Val = A->getValue(0);
1728 size_t RefStepLoc;
1729 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1730 return;
1731 StringRef ValBase = Val.slice(0, RefStepLoc);
1732 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1733 OutStrings.push_back(Args.MakeArgString(Out + Val));
1734 return;
1735 }
1736 }
1737
1738 // Each reciprocal type may be enabled or disabled individually.
1739 // Check each input value for validity, concatenate them all back together,
1740 // and pass through.
1741
1742 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001743 OptionStrings.insert(std::make_pair("divd", false));
1744 OptionStrings.insert(std::make_pair("divf", false));
1745 OptionStrings.insert(std::make_pair("vec-divd", false));
1746 OptionStrings.insert(std::make_pair("vec-divf", false));
1747 OptionStrings.insert(std::make_pair("sqrtd", false));
1748 OptionStrings.insert(std::make_pair("sqrtf", false));
1749 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1750 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001751
1752 for (unsigned i = 0; i != NumOptions; ++i) {
1753 StringRef Val = A->getValue(i);
1754
1755 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1756 // Ignore the disablement token for string matching.
1757 if (IsDisabled)
1758 Val = Val.substr(1);
1759
1760 size_t RefStep;
1761 if (!getRefinementStep(Val, D, *A, RefStep))
1762 return;
1763
1764 StringRef ValBase = Val.slice(0, RefStep);
1765 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1766 if (OptionIter == OptionStrings.end()) {
1767 // Try again specifying float suffix.
1768 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1769 if (OptionIter == OptionStrings.end()) {
1770 // The input name did not match any known option string.
1771 D.Diag(diag::err_drv_unknown_argument) << Val;
1772 return;
1773 }
1774 // The option was specified without a float or double suffix.
1775 // Make sure that the double entry was not already specified.
1776 // The float entry will be checked below.
1777 if (OptionStrings[ValBase.str() + 'd']) {
1778 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1779 return;
1780 }
1781 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001782
Sanjay Patel2987c292015-06-11 14:53:41 +00001783 if (OptionIter->second == true) {
1784 // Duplicate option specified.
1785 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1786 return;
1787 }
1788
1789 // Mark the matched option as found. Do not allow duplicate specifiers.
1790 OptionIter->second = true;
1791
1792 // If the precision was not specified, also mark the double entry as found.
1793 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1794 OptionStrings[ValBase.str() + 'd'] = true;
1795
1796 // Build the output string.
1797 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1798 Out = Args.MakeArgString(Out + Prefix + Val);
1799 if (i != NumOptions - 1)
1800 Out = Args.MakeArgString(Out + ",");
1801 }
1802
1803 OutStrings.push_back(Args.MakeArgString(Out));
1804}
1805
Eric Christopherc54920a2015-03-23 19:26:05 +00001806static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001807 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001808 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001809 // If -march=native, autodetect the feature list.
1810 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1811 if (StringRef(A->getValue()) == "native") {
1812 llvm::StringMap<bool> HostFeatures;
1813 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1814 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001815 Features.push_back(
1816 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001817 }
1818 }
1819
Jim Grosbach82eee262013-11-16 00:53:35 +00001820 if (Triple.getArchName() == "x86_64h") {
1821 // x86_64h implies quite a few of the more modern subtarget features
1822 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1823 Features.push_back("-rdrnd");
1824 Features.push_back("-aes");
1825 Features.push_back("-pclmul");
1826 Features.push_back("-rtm");
1827 Features.push_back("-hle");
1828 Features.push_back("-fsgsbase");
1829 }
1830
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001831 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001832 // Add features to be compatible with gcc for Android.
Alexey Bataev286d1b92014-01-31 04:07:13 +00001833 if (Triple.getEnvironment() == llvm::Triple::Android) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001834 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001835 Features.push_back("+sse4.2");
1836 Features.push_back("+popcnt");
1837 } else
1838 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001839 }
1840
Eric Christopherc54920a2015-03-23 19:26:05 +00001841 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001842 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1843 StringRef Arch = A->getValue();
1844 bool ArchUsed = false;
1845 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001846 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001847 if (Arch == "AVX" || Arch == "AVX2") {
1848 ArchUsed = true;
1849 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1850 }
1851 }
1852 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001853 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001854 if (Arch == "IA32") {
1855 ArchUsed = true;
1856 } else if (Arch == "SSE" || Arch == "SSE2") {
1857 ArchUsed = true;
1858 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1859 }
1860 }
1861 if (!ArchUsed)
1862 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1863 }
1864
Jim Grosbach82eee262013-11-16 00:53:35 +00001865 // Now add any that the user explicitly requested on the command line,
1866 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001867 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1868 StringRef Name = A->getOption().getName();
1869 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001870
1871 // Skip over "-m".
1872 assert(Name.startswith("m") && "Invalid feature name.");
1873 Name = Name.substr(1);
1874
1875 bool IsNegative = Name.startswith("no-");
1876 if (IsNegative)
1877 Name = Name.substr(3);
1878
1879 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1880 }
1881}
1882
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001883void Clang::AddX86TargetArgs(const ArgList &Args,
1884 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001885 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001886 Args.hasArg(options::OPT_mkernel) ||
1887 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001888 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001889
Bob Wilson2616e2e2013-02-10 16:01:41 +00001890 // Default to avoid implicit floating-point for kernel/kext code, but allow
1891 // that to be overridden with -mno-soft-float.
1892 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1893 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 if (Arg *A = Args.getLastArg(
1895 options::OPT_msoft_float, options::OPT_mno_soft_float,
1896 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001897 const Option &O = A->getOption();
1898 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1899 O.matches(options::OPT_msoft_float));
1900 }
1901 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001902 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001903
1904 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1905 StringRef Value = A->getValue();
1906 if (Value == "intel" || Value == "att") {
1907 CmdArgs.push_back("-mllvm");
1908 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1909 } else {
1910 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1911 << A->getOption().getName() << Value;
1912 }
1913 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001914}
1915
Tony Linthicum76329bf2011-12-12 21:14:55 +00001916void Clang::AddHexagonTargetArgs(const ArgList &Args,
1917 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001918 CmdArgs.push_back("-mqdsp6-compat");
1919 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001920
Douglas Katzman54366072015-07-27 16:53:08 +00001921 if (const char *v =
1922 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001923 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001924 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00001926 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001927 }
1928
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001929 if (!Args.hasArg(options::OPT_fno_short_enums))
1930 CmdArgs.push_back("-fshort-enums");
1931 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001932 CmdArgs.push_back("-mllvm");
1933 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001934 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001935 CmdArgs.push_back("-mllvm");
1936 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001937}
1938
Kevin Qin110db6f2014-07-18 07:03:22 +00001939// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00001940static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00001941 std::vector<const char *> &Features) {
1942 SmallVector<StringRef, 8> Split;
1943 text.split(Split, StringRef("+"), -1, false);
1944
Douglas Katzman2675d012015-06-29 19:12:56 +00001945 for (const StringRef Feature : Split) {
1946 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00001947 .Case("fp", "+fp-armv8")
1948 .Case("simd", "+neon")
1949 .Case("crc", "+crc")
1950 .Case("crypto", "+crypto")
1951 .Case("nofp", "-fp-armv8")
1952 .Case("nosimd", "-neon")
1953 .Case("nocrc", "-crc")
1954 .Case("nocrypto", "-crypto")
1955 .Default(nullptr);
1956 if (result)
1957 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00001958 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00001959 D.Diag(diag::err_drv_no_neon_modifier);
1960 else
1961 return false;
1962 }
1963 return true;
1964}
1965
1966// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
1967// decode CPU and feature.
1968static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
1969 std::vector<const char *> &Features) {
1970 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
1971 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001972 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
1973 CPU == "cortex-a72") {
Kevin Qin110db6f2014-07-18 07:03:22 +00001974 Features.push_back("+neon");
1975 Features.push_back("+crc");
1976 Features.push_back("+crypto");
1977 } else if (CPU == "generic") {
1978 Features.push_back("+neon");
1979 } else {
1980 return false;
1981 }
1982
1983 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
1984 return false;
1985
1986 return true;
1987}
1988
1989static bool
1990getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
1991 const ArgList &Args,
1992 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00001993 std::string MarchLowerCase = March.lower();
1994 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001996 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001997 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001998 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00001999 Features.push_back("+v8.1a");
2000 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002001 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002002 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002003
2004 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2005 return false;
2006
2007 return true;
2008}
2009
2010static bool
2011getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2012 const ArgList &Args,
2013 std::vector<const char *> &Features) {
2014 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002015 std::string McpuLowerCase = Mcpu.lower();
2016 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002017 return false;
2018
2019 return true;
2020}
2021
2022static bool
2023getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2024 const ArgList &Args,
2025 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002026 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002027 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002028 if (MtuneLowerCase == "native")
2029 MtuneLowerCase = llvm::sys::getHostCPUName();
2030 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002031 Features.push_back("+zcm");
2032 Features.push_back("+zcz");
2033 }
2034 return true;
2035}
2036
2037static bool
2038getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2039 const ArgList &Args,
2040 std::vector<const char *> &Features) {
2041 StringRef CPU;
2042 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002043 std::string McpuLowerCase = Mcpu.lower();
2044 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002045 return false;
2046
2047 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2048}
2049
Akira Hatanaka92500472015-07-27 19:29:04 +00002050static void getAArch64TargetFeatures(const Driver &D,
2051 const llvm::Triple &Triple,
2052 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002053 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002054 Arg *A;
2055 bool success = true;
2056 // Enable NEON by default.
2057 Features.push_back("+neon");
2058 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2059 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2060 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2061 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002062 else if (Args.hasArg(options::OPT_arch))
2063 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2064 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002065
2066 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2067 success =
2068 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2069 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2070 success =
2071 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002072 else if (Args.hasArg(options::OPT_arch))
2073 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2074 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002075
2076 if (!success)
2077 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002078
2079 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2080 Features.push_back("-fp-armv8");
2081 Features.push_back("-crypto");
2082 Features.push_back("-neon");
2083 }
Bradley Smith418c5932014-05-02 15:17:51 +00002084
2085 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002086 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002087 if (A->getOption().matches(options::OPT_mcrc))
2088 Features.push_back("+crc");
2089 else
2090 Features.push_back("-crc");
2091 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002092
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002093 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2094 options::OPT_munaligned_access))
2095 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2096 Features.push_back("+strict-align");
2097
Akira Hatanaka92500472015-07-27 19:29:04 +00002098 if (Args.hasArg(options::OPT_ffixed_x18) || Triple.isOSDarwin())
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002099 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002100}
2101
Dan Gohmanc2853072015-09-03 22:51:53 +00002102static void getWebAssemblyTargetFeatures(const ArgList &Args,
2103 std::vector<const char *> &Features) {
2104 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2105 StringRef Name = A->getOption().getName();
2106 A->claim();
2107
2108 // Skip over "-m".
2109 assert(Name.startswith("m") && "Invalid feature name.");
2110 Name = Name.substr(1);
2111
2112 bool IsNegative = Name.startswith("no-");
2113 if (IsNegative)
2114 Name = Name.substr(3);
2115
2116 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2117 }
2118}
2119
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002120static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002121 const ArgList &Args, ArgStringList &CmdArgs,
2122 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002123 std::vector<const char *> Features;
2124 switch (Triple.getArch()) {
2125 default:
2126 break;
2127 case llvm::Triple::mips:
2128 case llvm::Triple::mipsel:
2129 case llvm::Triple::mips64:
2130 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002131 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002132 break;
2133
2134 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002135 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002137 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002138 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002139 break;
2140
2141 case llvm::Triple::ppc:
2142 case llvm::Triple::ppc64:
2143 case llvm::Triple::ppc64le:
2144 getPPCTargetFeatures(Args, Features);
2145 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002146 case llvm::Triple::systemz:
2147 getSystemZTargetFeatures(Args, Features);
2148 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002149 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002150 case llvm::Triple::aarch64_be:
Akira Hatanaka92500472015-07-27 19:29:04 +00002151 getAArch64TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002152 break;
2153 case llvm::Triple::x86:
2154 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002155 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002156 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002157 case llvm::Triple::wasm32:
2158 case llvm::Triple::wasm64:
2159 getWebAssemblyTargetFeatures(Args, Features);
2160 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002161 }
Rafael Espindola43964802013-08-21 17:34:32 +00002162
2163 // Find the last of each feature.
2164 llvm::StringMap<unsigned> LastOpt;
2165 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2166 const char *Name = Features[I];
2167 assert(Name[0] == '-' || Name[0] == '+');
2168 LastOpt[Name + 1] = I;
2169 }
2170
2171 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2172 // If this feature was overridden, ignore it.
2173 const char *Name = Features[I];
2174 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2175 assert(LastI != LastOpt.end());
2176 unsigned Last = LastI->second;
2177 if (Last != I)
2178 continue;
2179
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002180 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002181 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002182 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002183}
2184
David Majnemerae394812014-12-09 00:12:30 +00002185static bool
2186shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2187 const llvm::Triple &Triple) {
2188 // We use the zero-cost exception tables for Objective-C if the non-fragile
2189 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2190 // later.
2191 if (runtime.isNonFragile())
2192 return true;
2193
2194 if (!Triple.isMacOSX())
2195 return false;
2196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002197 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002198 (Triple.getArch() == llvm::Triple::x86_64 ||
2199 Triple.getArch() == llvm::Triple::arm));
2200}
2201
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002202/// Adds exception related arguments to the driver command arguments. There's a
2203/// master flag, -fexceptions and also language specific flags to enable/disable
2204/// C++ and Objective-C exceptions. This makes it possible to for example
2205/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002206static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002207 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002208 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002209 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002210 const Driver &D = TC.getDriver();
2211 const llvm::Triple &Triple = TC.getTriple();
2212
Chad Rosier4fab82c2012-03-26 22:04:46 +00002213 if (KernelOrKext) {
2214 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2215 // arguments now to avoid warnings about unused arguments.
2216 Args.ClaimAllArgs(options::OPT_fexceptions);
2217 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2218 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2219 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2220 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2221 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002222 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002223 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002224
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002225 // See if the user explicitly enabled exceptions.
2226 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2227 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002228
David Majnemerae394812014-12-09 00:12:30 +00002229 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2230 // is not necessarily sensible, but follows GCC.
2231 if (types::isObjC(InputType) &&
2232 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002233 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002234 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002235
David Majnemerae394812014-12-09 00:12:30 +00002236 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002237 }
2238
2239 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002240 // Disable C++ EH by default on XCore, PS4, and MSVC.
2241 // FIXME: Remove MSVC from this list once things work.
2242 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2243 !Triple.isPS4CPU() &&
2244 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002245 Arg *ExceptionArg = Args.getLastArg(
2246 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2247 options::OPT_fexceptions, options::OPT_fno_exceptions);
2248 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002249 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002250 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2251 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002252
2253 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002254 if (Triple.isPS4CPU()) {
2255 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2256 assert(ExceptionArg &&
2257 "On the PS4 exceptions should only be enabled if passing "
2258 "an argument");
2259 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2260 const Arg *RTTIArg = TC.getRTTIArg();
2261 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2262 D.Diag(diag::err_drv_argument_not_allowed_with)
2263 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2264 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2265 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2266 } else
2267 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2268
Anders Carlssone96ab552011-02-28 02:27:16 +00002269 CmdArgs.push_back("-fcxx-exceptions");
2270
David Majnemer8de68642014-12-05 08:11:58 +00002271 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002272 }
2273 }
2274
David Majnemer8de68642014-12-05 08:11:58 +00002275 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002276 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002277}
2278
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002279static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002280 bool Default = true;
2281 if (TC.getTriple().isOSDarwin()) {
2282 // The native darwin assembler doesn't support the linker_option directives,
2283 // so we disable them if we think the .s file will be passed to it.
2284 Default = TC.useIntegratedAs();
2285 }
2286 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2287 Default);
2288}
2289
Ted Kremenek62093662013-03-12 17:02:12 +00002290static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2291 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002292 bool UseDwarfDirectory =
2293 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2294 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002295 return !UseDwarfDirectory;
2296}
2297
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002298/// \brief Check whether the given input tree contains any compilation actions.
2299static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002300 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002301 return true;
2302
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002303 for (const auto &Act : *A)
2304 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002305 return true;
2306
2307 return false;
2308}
2309
2310/// \brief Check if -relax-all should be passed to the internal assembler.
2311/// This is done by default when compiling non-assembler source with -O0.
2312static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2313 bool RelaxDefault = true;
2314
2315 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2316 RelaxDefault = A->getOption().matches(options::OPT_O0);
2317
2318 if (RelaxDefault) {
2319 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002320 for (const auto &Act : C.getActions()) {
2321 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002322 RelaxDefault = true;
2323 break;
2324 }
2325 }
2326 }
2327
2328 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002329 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002330}
2331
David Blaikie9260ed62013-07-25 21:19:01 +00002332static void CollectArgsForIntegratedAssembler(Compilation &C,
2333 const ArgList &Args,
2334 ArgStringList &CmdArgs,
2335 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002336 if (UseRelaxAll(C, Args))
2337 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002338
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002339 // When passing -I arguments to the assembler we sometimes need to
2340 // unconditionally take the next argument. For example, when parsing
2341 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2342 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2343 // arg after parsing the '-I' arg.
2344 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002345
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346 // When using an integrated assembler, translate -Wa, and -Xassembler
2347 // options.
2348 bool CompressDebugSections = false;
2349 for (const Arg *A :
2350 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2351 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002352
Renato Golin7c542b42015-07-27 23:44:45 +00002353 for (const StringRef Value : A->getValues()) {
2354 if (TakeNextArg) {
2355 CmdArgs.push_back(Value.data());
2356 TakeNextArg = false;
2357 continue;
2358 }
David Blaikie9260ed62013-07-25 21:19:01 +00002359
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002360 if (Value == "-force_cpusubtype_ALL") {
2361 // Do nothing, this is the default and we don't support anything else.
2362 } else if (Value == "-L") {
2363 CmdArgs.push_back("-msave-temp-labels");
2364 } else if (Value == "--fatal-warnings") {
2365 CmdArgs.push_back("-massembler-fatal-warnings");
2366 } else if (Value == "--noexecstack") {
2367 CmdArgs.push_back("-mnoexecstack");
2368 } else if (Value == "-compress-debug-sections" ||
2369 Value == "--compress-debug-sections") {
2370 CompressDebugSections = true;
2371 } else if (Value == "-nocompress-debug-sections" ||
2372 Value == "--nocompress-debug-sections") {
2373 CompressDebugSections = false;
2374 } else if (Value.startswith("-I")) {
2375 CmdArgs.push_back(Value.data());
2376 // We need to consume the next argument if the current arg is a plain
2377 // -I. The next arg will be the include directory.
2378 if (Value == "-I")
2379 TakeNextArg = true;
2380 } else if (Value.startswith("-gdwarf-")) {
2381 CmdArgs.push_back(Value.data());
Renato Golin7c542b42015-07-27 23:44:45 +00002382 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2383 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2384 // Do nothing, we'll validate it later.
Daniel Sanders4f7cd232015-09-03 12:58:39 +00002385 } else if (Value == "--trap") {
2386 CmdArgs.push_back("-target-feature");
2387 CmdArgs.push_back("+use-tcc-in-div");
2388 } else if (Value == "--break") {
2389 CmdArgs.push_back("-target-feature");
2390 CmdArgs.push_back("-use-tcc-in-div");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391 } else {
2392 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002393 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002394 }
2395 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002396 }
2397 if (CompressDebugSections) {
2398 if (llvm::zlib::isAvailable())
2399 CmdArgs.push_back("-compress-debug-sections");
2400 else
2401 D.Diag(diag::warn_debug_compression_unavailable);
2402 }
David Blaikie9260ed62013-07-25 21:19:01 +00002403}
2404
Renato Goline807c122014-01-31 11:47:28 +00002405// Until ARM libraries are build separately, we have them all in one library
2406static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Reid Kleckner0213a472015-07-22 16:01:38 +00002407 if (TC.getTriple().isWindowsMSVCEnvironment() &&
Peter Collingbourne2659fb32015-07-02 02:07:43 +00002408 TC.getArch() == llvm::Triple::x86)
2409 return "i386";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002410 if (TC.getArch() == llvm::Triple::arm || TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00002411 return "arm";
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002412 return TC.getArchName();
Renato Goline807c122014-01-31 11:47:28 +00002413}
2414
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002415static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
2416 // The runtimes are located in the OS-specific resource directory.
2417 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002418 const llvm::Triple &Triple = TC.getTriple();
2419 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002420 StringRef OSLibName =
2421 (Triple.getOS() == llvm::Triple::FreeBSD) ? "freebsd" : TC.getOS();
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00002422 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002423 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00002424}
2425
Peter Collingbourne581f4382015-07-02 01:48:12 +00002426SmallString<128> tools::getCompilerRT(const ToolChain &TC, StringRef Component,
2427 bool Shared) {
Dan Albert6f2875d2015-01-28 23:23:36 +00002428 const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
2429 ? "-android"
2430 : "";
2431
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002432 bool IsOSWindows = TC.getTriple().isOSWindows();
Reid Kleckner0213a472015-07-22 16:01:38 +00002433 bool IsITANMSVCWindows = TC.getTriple().isWindowsMSVCEnvironment() ||
2434 TC.getTriple().isWindowsItaniumEnvironment();
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002435 StringRef Arch = getArchNameForCompilerRTLib(TC);
Reid Kleckner0213a472015-07-22 16:01:38 +00002436 const char *Prefix = IsITANMSVCWindows ? "" : "lib";
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002437 const char *Suffix =
Reid Kleckner0213a472015-07-22 16:01:38 +00002438 Shared ? (IsOSWindows ? ".dll" : ".so") : (IsITANMSVCWindows ? ".lib" : ".a");
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002439
2440 SmallString<128> Path = getCompilerRTLibDir(TC);
2441 llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
2442 Arch + Env + Suffix);
2443
2444 return Path;
2445}
2446
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002447// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002448// FIXME: Make sure we can also emit shared objects if they're requested
2449// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002450static void addClangRT(const ToolChain &TC, const ArgList &Args,
2451 ArgStringList &CmdArgs) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002452 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00002453}
2454
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00002455static void addProfileRT(const ToolChain &TC, const ArgList &Args,
2456 ArgStringList &CmdArgs) {
Justin Bogner31a4aca2014-08-07 03:14:34 +00002457 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2458 false) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002459 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +00002460 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002461 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Justin Bognera71e6812015-04-30 23:49:42 +00002462 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
Chandler Carruth36381702013-06-23 11:28:48 +00002463 Args.hasArg(options::OPT_fcreate_profile) ||
2464 Args.hasArg(options::OPT_coverage)))
2465 return;
2466
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002467 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002468}
2469
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002470namespace {
2471enum OpenMPRuntimeKind {
2472 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2473 /// without knowing what runtime to target.
2474 OMPRT_Unknown,
2475
2476 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2477 /// the default for Clang.
2478 OMPRT_OMP,
2479
2480 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2481 /// this runtime but can swallow the pragmas, and find and link against the
2482 /// runtime library itself.
2483 OMPRT_GOMP,
2484
Chandler Carruthc6625c62015-05-28 21:10:31 +00002485 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002486 /// OpenMP runtime. We support this mode for users with existing dependencies
2487 /// on this runtime library name.
2488 OMPRT_IOMP5
2489};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002490}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002491
2492/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002493static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2494 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002495 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2496
2497 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2498 if (A)
2499 RuntimeName = A->getValue();
2500
2501 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002502 .Case("libomp", OMPRT_OMP)
2503 .Case("libgomp", OMPRT_GOMP)
2504 .Case("libiomp5", OMPRT_IOMP5)
2505 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002506
2507 if (RT == OMPRT_Unknown) {
2508 if (A)
2509 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002511 else
2512 // FIXME: We could use a nicer diagnostic here.
2513 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2514 }
2515
2516 return RT;
2517}
2518
Alexey Samsonov52550342014-09-15 19:58:40 +00002519static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2520 ArgStringList &CmdArgs, StringRef Sanitizer,
2521 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002522 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002523 // whole-archive.
Alexey Samsonov52550342014-09-15 19:58:40 +00002524 if (!IsShared)
2525 CmdArgs.push_back("-whole-archive");
Dan Albert6f2875d2015-01-28 23:23:36 +00002526 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared)));
Alexey Samsonov52550342014-09-15 19:58:40 +00002527 if (!IsShared)
2528 CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002529}
2530
Alexey Samsonov52550342014-09-15 19:58:40 +00002531// Tries to use a file with the list of dynamic symbols that need to be exported
2532// from the runtime library. Returns true if the file was found.
2533static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2534 ArgStringList &CmdArgs,
2535 StringRef Sanitizer) {
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002536 SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
2537 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2538 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002539 return true;
2540 }
2541 return false;
2542}
2543
2544static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2545 ArgStringList &CmdArgs) {
2546 // Force linking against the system libraries sanitizers depends on
2547 // (see PR15823 why this is necessary).
2548 CmdArgs.push_back("--no-as-needed");
2549 CmdArgs.push_back("-lpthread");
2550 CmdArgs.push_back("-lrt");
2551 CmdArgs.push_back("-lm");
2552 // There's no libdl on FreeBSD.
2553 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2554 CmdArgs.push_back("-ldl");
2555}
2556
2557static void
2558collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2559 SmallVectorImpl<StringRef> &SharedRuntimes,
2560 SmallVectorImpl<StringRef> &StaticRuntimes,
2561 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2562 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2563 // Collect shared runtimes.
2564 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2565 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002566 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002567
Alexey Samsonov52550342014-09-15 19:58:40 +00002568 // Collect static runtimes.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002569 if (Args.hasArg(options::OPT_shared) ||
Alexey Samsonov52550342014-09-15 19:58:40 +00002570 (TC.getTriple().getEnvironment() == llvm::Triple::Android)) {
2571 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002572 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002573 }
2574 if (SanArgs.needsAsanRt()) {
2575 if (SanArgs.needsSharedAsanRt()) {
2576 HelperStaticRuntimes.push_back("asan-preinit");
2577 } else {
2578 StaticRuntimes.push_back("asan");
2579 if (SanArgs.linkCXXRuntimes())
2580 StaticRuntimes.push_back("asan_cxx");
2581 }
2582 }
2583 if (SanArgs.needsDfsanRt())
2584 StaticRuntimes.push_back("dfsan");
2585 if (SanArgs.needsLsanRt())
2586 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002587 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002588 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002589 if (SanArgs.linkCXXRuntimes())
2590 StaticRuntimes.push_back("msan_cxx");
2591 }
2592 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002593 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002594 if (SanArgs.linkCXXRuntimes())
2595 StaticRuntimes.push_back("tsan_cxx");
2596 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002597 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002598 StaticRuntimes.push_back("ubsan_standalone");
2599 if (SanArgs.linkCXXRuntimes())
2600 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002601 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002602 if (SanArgs.needsSafeStackRt())
2603 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002604}
2605
Alexey Samsonov52550342014-09-15 19:58:40 +00002606// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2607// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2608static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002609 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002610 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2611 HelperStaticRuntimes;
2612 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2613 HelperStaticRuntimes);
2614 for (auto RT : SharedRuntimes)
2615 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2616 for (auto RT : HelperStaticRuntimes)
2617 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2618 bool AddExportDynamic = false;
2619 for (auto RT : StaticRuntimes) {
2620 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2621 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2622 }
2623 // If there is a static runtime with no dynamic list, force all the symbols
2624 // to be dynamic to be sure we export sanitizer interface functions.
2625 if (AddExportDynamic)
2626 CmdArgs.push_back("-export-dynamic");
2627 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002628}
2629
Reid Kleckner86ea7702015-02-04 23:45:07 +00002630static bool areOptimizationsEnabled(const ArgList &Args) {
2631 // Find the last -O arg and see if it is non-zero.
2632 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2633 return !A->getOption().matches(options::OPT_O0);
2634 // Defaults to -O0.
2635 return false;
2636}
2637
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002638static bool shouldUseFramePointerForTarget(const ArgList &Args,
2639 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002640 switch (Triple.getArch()) {
2641 case llvm::Triple::xcore:
2642 case llvm::Triple::wasm32:
2643 case llvm::Triple::wasm64:
2644 // XCore never wants frame pointers, regardless of OS.
2645 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002646 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002647 default:
2648 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002649 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002650
2651 if (Triple.isOSLinux()) {
2652 switch (Triple.getArch()) {
2653 // Don't use a frame pointer on linux if optimizing for certain targets.
2654 case llvm::Triple::mips64:
2655 case llvm::Triple::mips64el:
2656 case llvm::Triple::mips:
2657 case llvm::Triple::mipsel:
2658 case llvm::Triple::systemz:
2659 case llvm::Triple::x86:
2660 case llvm::Triple::x86_64:
2661 return !areOptimizationsEnabled(Args);
2662 default:
2663 return true;
2664 }
2665 }
2666
2667 if (Triple.isOSWindows()) {
2668 switch (Triple.getArch()) {
2669 case llvm::Triple::x86:
2670 return !areOptimizationsEnabled(Args);
2671 default:
2672 // All other supported Windows ISAs use xdata unwind information, so frame
2673 // pointers are not generally useful.
2674 return false;
2675 }
2676 }
2677
2678 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002679}
2680
Rafael Espindola224dd632011-12-14 21:02:23 +00002681static bool shouldUseFramePointer(const ArgList &Args,
2682 const llvm::Triple &Triple) {
2683 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2684 options::OPT_fomit_frame_pointer))
2685 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2686
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002687 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002688}
2689
Eric Christopherb7d97e92013-04-03 01:58:53 +00002690static bool shouldUseLeafFramePointer(const ArgList &Args,
2691 const llvm::Triple &Triple) {
2692 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2693 options::OPT_momit_leaf_frame_pointer))
2694 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2695
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002696 if (Triple.isPS4CPU())
2697 return false;
2698
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002699 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002700}
2701
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002702/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002703static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002704 SmallString<128> cwd;
2705 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002706 CmdArgs.push_back("-fdebug-compilation-dir");
2707 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002708 }
2709}
2710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002711static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002712 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2713 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2714 SmallString<128> T(FinalOutput->getValue());
2715 llvm::sys::path::replace_extension(T, "dwo");
2716 return Args.MakeArgString(T);
2717 } else {
2718 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002719 SmallString<128> T(
2720 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002721 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002722 llvm::sys::path::replace_extension(F, "dwo");
2723 T += F;
2724 return Args.MakeArgString(F);
2725 }
2726}
2727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002728static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2729 const JobAction &JA, const ArgList &Args,
2730 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002731 ArgStringList ExtractArgs;
2732 ExtractArgs.push_back("--extract-dwo");
2733
2734 ArgStringList StripArgs;
2735 StripArgs.push_back("--strip-dwo");
2736
2737 // Grabbing the output of the earlier compile step.
2738 StripArgs.push_back(Output.getFilename());
2739 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002740 ExtractArgs.push_back(OutFile);
2741
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002743 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002744
2745 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002746 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002747
2748 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002749 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002750}
2751
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002752/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002753/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2754static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002755 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002756 if (A->getOption().matches(options::OPT_O4) ||
2757 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002758 return true;
2759
2760 if (A->getOption().matches(options::OPT_O0))
2761 return false;
2762
2763 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2764
Rafael Espindola91780de2013-08-26 14:05:41 +00002765 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002766 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002767 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002768 return true;
2769
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002770 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002771 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002772 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002773
2774 unsigned OptLevel = 0;
2775 if (S.getAsInteger(10, OptLevel))
2776 return false;
2777
2778 return OptLevel > 1;
2779 }
2780
2781 return false;
2782}
2783
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002784/// Add -x lang to \p CmdArgs for \p Input.
2785static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2786 ArgStringList &CmdArgs) {
2787 // When using -verify-pch, we don't want to provide the type
2788 // 'precompiled-header' if it was inferred from the file extension
2789 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2790 return;
2791
2792 CmdArgs.push_back("-x");
2793 if (Args.hasArg(options::OPT_rewrite_objc))
2794 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2795 else
2796 CmdArgs.push_back(types::getTypeName(Input.getType()));
2797}
2798
David Majnemerc371ff02015-03-22 08:39:22 +00002799static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002800 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002801 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002802
2803 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002804 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002805
2806 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002808 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002809 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002810}
2811
Rafael Espindola577637a2015-01-03 00:06:04 +00002812// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002813// options that build systems might add but are unused when assembling or only
2814// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002815static void claimNoWarnArgs(const ArgList &Args) {
2816 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002817 // preprocessing, precompiling or assembling.
Rafael Espindola577637a2015-01-03 00:06:04 +00002818 Args.ClaimAllArgs(options::OPT_flto);
2819 Args.ClaimAllArgs(options::OPT_fno_lto);
2820}
2821
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002822static void appendUserToPath(SmallVectorImpl<char> &Result) {
2823#ifdef LLVM_ON_UNIX
2824 const char *Username = getenv("LOGNAME");
2825#else
2826 const char *Username = getenv("USERNAME");
2827#endif
2828 if (Username) {
2829 // Validate that LoginName can be used in a path, and get its length.
2830 size_t Len = 0;
2831 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002832 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002833 Username = nullptr;
2834 break;
2835 }
2836 }
2837
2838 if (Username && Len > 0) {
2839 Result.append(Username, Username + Len);
2840 return;
2841 }
2842 }
2843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002844// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002845#ifdef LLVM_ON_UNIX
2846 std::string UID = llvm::utostr(getuid());
2847#else
2848 // FIXME: Windows seems to have an 'SID' that might work.
2849 std::string UID = "9999";
2850#endif
2851 Result.append(UID.begin(), UID.end());
2852}
2853
David Majnemere11d3732015-06-08 00:22:46 +00002854VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2855 const llvm::Triple &Triple,
2856 const llvm::opt::ArgList &Args,
2857 bool IsWindowsMSVC) {
2858 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2859 IsWindowsMSVC) ||
2860 Args.hasArg(options::OPT_fmsc_version) ||
2861 Args.hasArg(options::OPT_fms_compatibility_version)) {
2862 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2863 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002864 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002865
2866 if (MSCVersion && MSCompatibilityVersion) {
2867 if (D)
2868 D->Diag(diag::err_drv_argument_not_allowed_with)
2869 << MSCVersion->getAsString(Args)
2870 << MSCompatibilityVersion->getAsString(Args);
2871 return VersionTuple();
2872 }
2873
2874 if (MSCompatibilityVersion) {
2875 VersionTuple MSVT;
2876 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2877 D->Diag(diag::err_drv_invalid_value)
2878 << MSCompatibilityVersion->getAsString(Args)
2879 << MSCompatibilityVersion->getValue();
2880 return MSVT;
2881 }
2882
2883 if (MSCVersion) {
2884 unsigned Version = 0;
2885 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
2886 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
2887 << MSCVersion->getValue();
2888 return getMSCompatibilityVersion(Version);
2889 }
2890
2891 unsigned Major, Minor, Micro;
2892 Triple.getEnvironmentVersion(Major, Minor, Micro);
2893 if (Major || Minor || Micro)
2894 return VersionTuple(Major, Minor, Micro);
2895
2896 return VersionTuple(18);
2897 }
2898 return VersionTuple();
2899}
2900
Diego Novilloa0545962015-07-10 18:00:07 +00002901static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
2902 const InputInfo &Output, const ArgList &Args,
2903 ArgStringList &CmdArgs) {
2904 auto *ProfileGenerateArg = Args.getLastArg(
2905 options::OPT_fprofile_instr_generate,
2906 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00002907 options::OPT_fprofile_generate_EQ,
2908 options::OPT_fno_profile_instr_generate);
2909 if (ProfileGenerateArg &&
2910 ProfileGenerateArg->getOption().matches(
2911 options::OPT_fno_profile_instr_generate))
2912 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002913
2914 auto *ProfileUseArg = Args.getLastArg(
2915 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00002916 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
2917 options::OPT_fno_profile_instr_use);
2918 if (ProfileUseArg &&
2919 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
2920 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00002921
2922 if (ProfileGenerateArg && ProfileUseArg)
2923 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00002924 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00002925
Diego Novillo758f3f52015-08-05 21:49:51 +00002926 if (ProfileGenerateArg) {
2927 if (ProfileGenerateArg->getOption().matches(
2928 options::OPT_fprofile_instr_generate_EQ))
2929 ProfileGenerateArg->render(Args, CmdArgs);
2930 else if (ProfileGenerateArg->getOption().matches(
2931 options::OPT_fprofile_generate_EQ)) {
2932 SmallString<128> Path(ProfileGenerateArg->getValue());
2933 llvm::sys::path::append(Path, "default.profraw");
2934 CmdArgs.push_back(
2935 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
2936 } else
2937 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2938 }
Diego Novilloa0545962015-07-10 18:00:07 +00002939
Diego Novillo758f3f52015-08-05 21:49:51 +00002940 if (ProfileUseArg) {
2941 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
2942 ProfileUseArg->render(Args, CmdArgs);
2943 else if ((ProfileUseArg->getOption().matches(
2944 options::OPT_fprofile_use_EQ) ||
2945 ProfileUseArg->getOption().matches(
2946 options::OPT_fprofile_instr_use))) {
2947 SmallString<128> Path(
2948 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
2949 if (Path.empty() || llvm::sys::fs::is_directory(Path))
2950 llvm::sys::path::append(Path, "default.profdata");
2951 CmdArgs.push_back(
2952 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
2953 }
Diego Novilloa0545962015-07-10 18:00:07 +00002954 }
2955
2956 if (Args.hasArg(options::OPT_ftest_coverage) ||
2957 Args.hasArg(options::OPT_coverage))
2958 CmdArgs.push_back("-femit-coverage-notes");
2959 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
2960 false) ||
2961 Args.hasArg(options::OPT_coverage))
2962 CmdArgs.push_back("-femit-coverage-data");
2963
Diego Novilloc4b94da2015-08-05 23:27:40 +00002964 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2965 options::OPT_fno_coverage_mapping, false) &&
2966 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00002967 D.Diag(diag::err_drv_argument_only_allowed_with)
2968 << "-fcoverage-mapping"
2969 << "-fprofile-instr-generate";
2970
Diego Novilloc4b94da2015-08-05 23:27:40 +00002971 if (Args.hasFlag(options::OPT_fcoverage_mapping,
2972 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00002973 CmdArgs.push_back("-fcoverage-mapping");
2974
2975 if (C.getArgs().hasArg(options::OPT_c) ||
2976 C.getArgs().hasArg(options::OPT_S)) {
2977 if (Output.isFilename()) {
2978 CmdArgs.push_back("-coverage-file");
2979 SmallString<128> CoverageFilename;
2980 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
2981 CoverageFilename = FinalOutput->getValue();
2982 } else {
2983 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
2984 }
2985 if (llvm::sys::path::is_relative(CoverageFilename)) {
2986 SmallString<128> Pwd;
2987 if (!llvm::sys::fs::current_path(Pwd)) {
2988 llvm::sys::path::append(Pwd, CoverageFilename);
2989 CoverageFilename.swap(Pwd);
2990 }
2991 }
2992 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
2993 }
2994 }
2995}
2996
James Y Knight5bdf7ab2015-08-19 15:12:02 +00002997/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
2998/// smooshes them together with platform defaults, to decide whether
2999/// this compile should be using PIC mode or not. Returns a tuple of
3000/// (RelocationModel, PICLevel, IsPIE).
3001static std::tuple<llvm::Reloc::Model, unsigned, bool>
3002ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3003 const ArgList &Args) {
3004 // FIXME: why does this code...and so much everywhere else, use both
3005 // ToolChain.getTriple() and Triple?
3006 bool PIE = ToolChain.isPIEDefault();
3007 bool PIC = PIE || ToolChain.isPICDefault();
3008 bool IsPICLevelTwo = PIC;
3009
3010 bool KernelOrKext =
3011 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3012
3013 // Android-specific defaults for PIC/PIE
3014 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
3015 switch (ToolChain.getArch()) {
3016 case llvm::Triple::arm:
3017 case llvm::Triple::armeb:
3018 case llvm::Triple::thumb:
3019 case llvm::Triple::thumbeb:
3020 case llvm::Triple::aarch64:
3021 case llvm::Triple::mips:
3022 case llvm::Triple::mipsel:
3023 case llvm::Triple::mips64:
3024 case llvm::Triple::mips64el:
3025 PIC = true; // "-fpic"
3026 break;
3027
3028 case llvm::Triple::x86:
3029 case llvm::Triple::x86_64:
3030 PIC = true; // "-fPIC"
3031 IsPICLevelTwo = true;
3032 break;
3033
3034 default:
3035 break;
3036 }
3037 }
3038
3039 // OpenBSD-specific defaults for PIE
3040 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3041 switch (ToolChain.getArch()) {
3042 case llvm::Triple::mips64:
3043 case llvm::Triple::mips64el:
3044 case llvm::Triple::sparcel:
3045 case llvm::Triple::x86:
3046 case llvm::Triple::x86_64:
3047 IsPICLevelTwo = false; // "-fpie"
3048 break;
3049
3050 case llvm::Triple::ppc:
3051 case llvm::Triple::sparc:
3052 case llvm::Triple::sparcv9:
3053 IsPICLevelTwo = true; // "-fPIE"
3054 break;
3055
3056 default:
3057 break;
3058 }
3059 }
3060
3061 // The last argument relating to either PIC or PIE wins, and no
3062 // other argument is used. If the last argument is any flavor of the
3063 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3064 // option implicitly enables PIC at the same level.
3065 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3066 options::OPT_fpic, options::OPT_fno_pic,
3067 options::OPT_fPIE, options::OPT_fno_PIE,
3068 options::OPT_fpie, options::OPT_fno_pie);
3069 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3070 // is forced, then neither PIC nor PIE flags will have no effect.
3071 if (!ToolChain.isPICDefaultForced()) {
3072 if (LastPICArg) {
3073 Option O = LastPICArg->getOption();
3074 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3075 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3076 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3077 PIC =
3078 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3079 IsPICLevelTwo =
3080 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3081 } else {
3082 PIE = PIC = false;
3083 }
3084 }
3085 }
3086
3087 // Introduce a Darwin-specific hack. If the default is PIC, but the
3088 // PIC level would've been set to level 1, force it back to level 2
3089 // PIC instead. This matches the behavior of Darwin GCC (based on
3090 // chandlerc's informal testing in 2012).
3091 if (PIC && ToolChain.getTriple().isOSDarwin())
3092 IsPICLevelTwo |= ToolChain.isPICDefault();
3093
James Y Knightc4015d32015-08-21 04:14:55 +00003094 // This kernel flags are a trump-card: they will disable PIC/PIE
3095 // generation, independent of the argument order.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003096 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)))
3097 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003098
3099 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3100 // This is a very special mode. It trumps the other modes, almost no one
3101 // uses it, and it isn't even valid on any OS but Darwin.
3102 if (!ToolChain.getTriple().isOSDarwin())
3103 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3104 << A->getSpelling() << ToolChain.getTriple().str();
3105
3106 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3107
3108 // Only a forced PIC mode can cause the actual compile to have PIC defines
3109 // etc., no flags are sufficient. This behavior was selected to closely
3110 // match that of llvm-gcc and Apple GCC before that.
3111 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3112
3113 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3114 }
3115
3116 if (PIC)
3117 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3118
3119 return std::make_tuple(llvm::Reloc::Static, 0, false);
3120}
3121
3122static const char *RelocationModelName(llvm::Reloc::Model Model) {
3123 switch (Model) {
3124 case llvm::Reloc::Default:
3125 return nullptr;
3126 case llvm::Reloc::Static:
3127 return "static";
3128 case llvm::Reloc::PIC_:
3129 return "pic";
3130 case llvm::Reloc::DynamicNoPIC:
3131 return "dynamic-no-pic";
3132 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003133 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003134}
3135
3136static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3137 ArgStringList &CmdArgs) {
3138 llvm::Reloc::Model RelocationModel;
3139 unsigned PICLevel;
3140 bool IsPIE;
3141 std::tie(RelocationModel, PICLevel, IsPIE) =
3142 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3143
3144 if (RelocationModel != llvm::Reloc::Static)
3145 CmdArgs.push_back("-KPIC");
3146}
3147
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003148void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003149 const InputInfo &Output, const InputInfoList &Inputs,
3150 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003151 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3152 const llvm::Triple Triple(TripleStr);
3153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003154 bool KernelOrKext =
3155 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003156 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 ArgStringList CmdArgs;
3158
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003159 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003160 bool IsWindowsCygnus =
3161 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003162 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
3163
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003164 // Check number of inputs for sanity. We need at least one input.
3165 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003166 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003167 // CUDA compilation may have multiple inputs (source file + results of
3168 // device-side compilations). All other jobs are expected to have exactly one
3169 // input.
3170 bool IsCuda = types::isCuda(Input.getType());
3171 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003172
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003173 // Invoke ourselves in -cc1 mode.
3174 //
3175 // FIXME: Implement custom jobs for internal actions.
3176 CmdArgs.push_back("-cc1");
3177
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003178 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003179 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003180 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003181
James Y Knight2db38f32015-08-15 03:45:25 +00003182 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3183 Triple.getArch() == llvm::Triple::thumb)) {
3184 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003185 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003186 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003187 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003188 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003189 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003190 }
3191
Tim Northover336f1892014-03-29 13:16:12 +00003192 // Push all default warning arguments that are specific to
3193 // the given target. These come before user provided warning options
3194 // are provided.
3195 getToolChain().addClangWarningOptions(CmdArgs);
3196
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003197 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003198 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003199
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003200 if (isa<AnalyzeJobAction>(JA)) {
3201 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3202 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003203 } else if (isa<MigrateJobAction>(JA)) {
3204 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003205 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003206 if (Output.getType() == types::TY_Dependencies)
3207 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003208 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003209 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003210 if (Args.hasArg(options::OPT_rewrite_objc) &&
3211 !Args.hasArg(options::OPT_g_Group))
3212 CmdArgs.push_back("-P");
3213 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003214 } else if (isa<AssembleJobAction>(JA)) {
3215 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003216
David Blaikie9260ed62013-07-25 21:19:01 +00003217 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003218
3219 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003220 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003221 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003222 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003223 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003224
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003225 if (JA.getType() == types::TY_Nothing)
3226 CmdArgs.push_back("-fsyntax-only");
3227 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003228 CmdArgs.push_back("-emit-pch");
3229 else
3230 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003231 } else if (isa<VerifyPCHJobAction>(JA)) {
3232 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003233 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003234 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3235 "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003236
Renato Golin7c542b42015-07-27 23:44:45 +00003237 if (JA.getType() == types::TY_LTO_IR || JA.getType() == types::TY_LTO_BC) {
Teresa Johnson8749d8042015-07-06 16:23:00 +00003238 CmdArgs.push_back("-flto");
3239 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003240 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003241 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003242 } else if (JA.getType() == types::TY_LLVM_IR ||
3243 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003244 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003245 } else if (JA.getType() == types::TY_LLVM_BC ||
3246 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003247 CmdArgs.push_back("-emit-llvm-bc");
3248 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003249 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003250 } else if (JA.getType() == types::TY_AST) {
3251 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003252 } else if (JA.getType() == types::TY_ModuleFile) {
3253 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003254 } else if (JA.getType() == types::TY_RewrittenObjC) {
3255 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003256 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003257 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3258 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003259 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003260 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003261 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003262 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003263
3264 // Preserve use-list order by default when emitting bitcode, so that
3265 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3266 // same result as running passes here. For LTO, we don't need to preserve
3267 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003268 if (JA.getType() == types::TY_LLVM_BC)
3269 CmdArgs.push_back("-emit-llvm-uselists");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003270 }
3271
Justin Bognera88f0122014-06-20 22:59:50 +00003272 // We normally speed up the clang process a bit by skipping destructors at
3273 // exit, but when we're generating diagnostics we can rely on some of the
3274 // cleanup.
3275 if (!C.isForDiagnostics())
3276 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003279#ifdef NDEBUG
3280 CmdArgs.push_back("-disable-llvm-verifier");
3281#endif
3282
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003283 // Set the main file name, so that debug info works even with
3284 // -save-temps.
3285 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003286 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003287
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003288 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003289 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003290 if (Args.hasArg(options::OPT_static))
3291 CmdArgs.push_back("-static-define");
3292
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003293 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003294 // Enable region store model by default.
3295 CmdArgs.push_back("-analyzer-store=region");
3296
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003297 // Treat blocks as analysis entry points.
3298 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3299
Ted Kremenek49c79792011-03-24 00:28:47 +00003300 CmdArgs.push_back("-analyzer-eagerly-assume");
3301
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003302 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003303 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003304 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003305
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003306 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003307 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003308
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003309 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003310 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003311
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003312 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003313
Artem Belevichba558952015-05-06 18:20:23 +00003314 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003315 CmdArgs.push_back("-analyzer-checker=cplusplus");
3316
Nico Webere8e53112014-05-11 01:04:02 +00003317 // Enable the following experimental checkers for testing.
3318 CmdArgs.push_back(
3319 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003320 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3321 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003322 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003323 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3324 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003325 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003326
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003327 // Set the output format. The default is plist, for (lame) historical
3328 // reasons.
3329 CmdArgs.push_back("-analyzer-output");
3330 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003332 else
3333 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003334
Ted Kremenekfe449a22010-03-22 22:32:05 +00003335 // Disable the presentation of standard compiler warnings when
3336 // using --analyze. We only want to show static analyzer diagnostics
3337 // or frontend errors.
3338 CmdArgs.push_back("-w");
3339
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003340 // Add -Xanalyzer arguments when running as analyzer.
3341 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003342 }
3343
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003344 CheckCodeGenerationOptions(D, Args);
3345
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003346 llvm::Reloc::Model RelocationModel;
3347 unsigned PICLevel;
3348 bool IsPIE;
3349 std::tie(RelocationModel, PICLevel, IsPIE) =
3350 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003351
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003352 const char *RMName = RelocationModelName(RelocationModel);
3353 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003354 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003355 CmdArgs.push_back(RMName);
3356 }
3357 if (PICLevel > 0) {
3358 CmdArgs.push_back("-pic-level");
3359 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3360 if (IsPIE) {
3361 CmdArgs.push_back("-pie-level");
3362 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003363 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003364 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003365
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003366 CmdArgs.push_back("-mthread-model");
3367 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3368 CmdArgs.push_back(A->getValue());
3369 else
3370 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3371
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003372 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3373
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003374 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3375 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003376 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003377
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003378 // LLVM Code Generator Options.
3379
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003380 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3381 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003382 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3383 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003384 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003385 CmdArgs.push_back(A->getValue());
3386 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003387 }
3388 }
3389
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003390 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3391 StringRef v = A->getValue();
3392 CmdArgs.push_back("-mllvm");
3393 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3394 A->claim();
3395 }
3396
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003397 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3398 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003399 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003400 }
3401
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003402 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3403 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003404 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003405 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003406 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003407 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3408 CmdArgs.push_back("-fpcc-struct-return");
3409 } else {
3410 assert(A->getOption().matches(options::OPT_freg_struct_return));
3411 CmdArgs.push_back("-freg-struct-return");
3412 }
3413 }
3414
Roman Divacky65b88cd2011-03-01 17:40:53 +00003415 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3416 CmdArgs.push_back("-mrtd");
3417
Rafael Espindola224dd632011-12-14 21:02:23 +00003418 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003419 CmdArgs.push_back("-mdisable-fp-elim");
3420 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3421 options::OPT_fno_zero_initialized_in_bss))
3422 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003423
3424 bool OFastEnabled = isOptimizationLevelFast(Args);
3425 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3426 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003427 OptSpecifier StrictAliasingAliasOption =
3428 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003429 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3430 // doesn't do any TBAA.
3431 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003432 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003433 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003434 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003435 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3436 options::OPT_fno_struct_path_tbaa))
3437 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003438 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3439 false))
3440 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003441 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3442 options::OPT_fno_optimize_sibling_calls))
3443 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003444
Eric Christopher006208c2013-04-04 06:29:47 +00003445 // Handle segmented stacks.
3446 if (Args.hasArg(options::OPT_fsplit_stack))
3447 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003448
3449 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3450 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003451 OptSpecifier FastMathAliasOption =
3452 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3453
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003454 // Handle various floating point optimization flags, mapping them to the
3455 // appropriate LLVM code generation flags. The pattern for all of these is to
3456 // default off the codegen optimizations, and if any flag enables them and no
3457 // flag disables them after the flag enabling them, enable the codegen
3458 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003459 if (Arg *A = Args.getLastArg(
3460 options::OPT_ffast_math, FastMathAliasOption,
3461 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3462 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3463 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003464 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3465 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003466 A->getOption().getID() != options::OPT_fhonor_infinities)
3467 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003468 if (Arg *A = Args.getLastArg(
3469 options::OPT_ffast_math, FastMathAliasOption,
3470 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3471 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3472 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003473 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3474 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003475 A->getOption().getID() != options::OPT_fhonor_nans)
3476 CmdArgs.push_back("-menable-no-nans");
3477
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003478 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3479 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003480 if (Arg *A =
3481 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3482 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3483 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003484 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3485 // However, turning *off* -ffast_math merely restores the toolchain default
3486 // (which may be false).
3487 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3488 A->getOption().getID() == options::OPT_ffast_math ||
3489 A->getOption().getID() == options::OPT_Ofast)
3490 MathErrno = false;
3491 else if (A->getOption().getID() == options::OPT_fmath_errno)
3492 MathErrno = true;
3493 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003494 if (MathErrno)
3495 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003496
3497 // There are several flags which require disabling very specific
3498 // optimizations. Any of these being disabled forces us to turn off the
3499 // entire set of LLVM optimizations, so collect them through all the flag
3500 // madness.
3501 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502 if (Arg *A = Args.getLastArg(
3503 options::OPT_ffast_math, FastMathAliasOption,
3504 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3505 options::OPT_fno_unsafe_math_optimizations,
3506 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003507 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3508 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003509 A->getOption().getID() != options::OPT_fno_associative_math)
3510 AssociativeMath = true;
3511 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003512 if (Arg *A = Args.getLastArg(
3513 options::OPT_ffast_math, FastMathAliasOption,
3514 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3515 options::OPT_fno_unsafe_math_optimizations,
3516 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003517 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3518 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003519 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3520 ReciprocalMath = true;
3521 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003522 if (Arg *A = Args.getLastArg(
3523 options::OPT_ffast_math, FastMathAliasOption,
3524 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3525 options::OPT_fno_unsafe_math_optimizations,
3526 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003527 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3528 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003529 A->getOption().getID() != options::OPT_fsigned_zeros)
3530 SignedZeros = false;
3531 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003532 if (Arg *A = Args.getLastArg(
3533 options::OPT_ffast_math, FastMathAliasOption,
3534 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3535 options::OPT_fno_unsafe_math_optimizations,
3536 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003537 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3538 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003539 A->getOption().getID() != options::OPT_ftrapping_math)
3540 TrappingMath = false;
3541 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3542 !TrappingMath)
3543 CmdArgs.push_back("-menable-unsafe-fp-math");
3544
Sanjay Patel76c9e092015-01-23 16:40:50 +00003545 if (!SignedZeros)
3546 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003547
Sanjay Patel359b1052015-04-09 15:03:23 +00003548 if (ReciprocalMath)
3549 CmdArgs.push_back("-freciprocal-math");
3550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003552 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003553 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003554 options::OPT_ffp_contract)) {
3555 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003556 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003557 if (Val == "fast" || Val == "on" || Val == "off") {
3558 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3559 } else {
3560 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003561 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003562 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003563 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3564 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003565 // If fast-math is set then set the fp-contract mode to fast.
3566 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3567 }
3568 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569
Sanjay Patel2987c292015-06-11 14:53:41 +00003570 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003571
Bob Wilson6a039162012-07-19 03:52:53 +00003572 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3573 // and if we find them, tell the frontend to provide the appropriate
3574 // preprocessor macros. This is distinct from enabling any optimizations as
3575 // these options induce language changes which must survive serialization
3576 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003577 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3578 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003579 if (!A->getOption().matches(options::OPT_fno_fast_math))
3580 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003581 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3582 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003583 if (A->getOption().matches(options::OPT_ffinite_math_only))
3584 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003585
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003586 // Decide whether to use verbose asm. Verbose assembly is the default on
3587 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003588 bool IsIntegratedAssemblerDefault =
3589 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003590 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003591 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003592 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003593 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003594
Rafael Espindolab8a12932015-05-22 20:44:03 +00003595 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3596 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003597 CmdArgs.push_back("-no-integrated-as");
3598
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003599 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3600 CmdArgs.push_back("-mdebug-pass");
3601 CmdArgs.push_back("Structure");
3602 }
3603 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3604 CmdArgs.push_back("-mdebug-pass");
3605 CmdArgs.push_back("Arguments");
3606 }
3607
John McCall8517abc2010-02-19 02:45:38 +00003608 // Enable -mconstructor-aliases except on darwin, where we have to
3609 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003610 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003611 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003612
John McCall7ef5cb32011-03-18 02:56:14 +00003613 // Darwin's kernel doesn't support guard variables; just die if we
3614 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003615 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003616 CmdArgs.push_back("-fforbid-guard-variables");
3617
Douglas Gregordbe39272011-02-01 15:15:22 +00003618 if (Args.hasArg(options::OPT_mms_bitfields)) {
3619 CmdArgs.push_back("-mms-bitfields");
3620 }
John McCall8517abc2010-02-19 02:45:38 +00003621
Daniel Dunbar306945d2009-09-16 06:17:29 +00003622 // This is a coarse approximation of what llvm-gcc actually does, both
3623 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3624 // complicated ways.
3625 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003626 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3627 options::OPT_fno_asynchronous_unwind_tables,
3628 (getToolChain().IsUnwindTablesDefault() ||
3629 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3630 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003631 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3632 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003633 CmdArgs.push_back("-munwind-tables");
3634
Chandler Carruth05fb5852012-11-21 23:40:23 +00003635 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003636
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003637 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3638 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003639 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003640 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003641
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003642 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003643 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003644
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003645 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003646 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003647 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003648 }
3649
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003650 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003651 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003652 if (!CPU.empty()) {
3653 CmdArgs.push_back("-target-cpu");
3654 CmdArgs.push_back(Args.MakeArgString(CPU));
3655 }
3656
Rafael Espindolaeb265472013-08-21 21:59:03 +00003657 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3658 CmdArgs.push_back("-mfpmath");
3659 CmdArgs.push_back(A->getValue());
3660 }
3661
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003662 // Add the target features
John Brawn94fd9632015-05-21 12:19:49 +00003663 getTargetFeatures(D, Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003664
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003665 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003666 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003667 default:
3668 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003669
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003670 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003671 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003672 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003673 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00003674 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003675 break;
3676
Tim Northover573cbee2014-05-24 12:52:07 +00003677 case llvm::Triple::aarch64:
3678 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003679 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003680 break;
3681
Eric Christopher0b26a612010-03-02 02:41:08 +00003682 case llvm::Triple::mips:
3683 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003684 case llvm::Triple::mips64:
3685 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003686 AddMIPSTargetArgs(Args, CmdArgs);
3687 break;
3688
Ulrich Weigand8afad612014-07-28 13:17:52 +00003689 case llvm::Triple::ppc:
3690 case llvm::Triple::ppc64:
3691 case llvm::Triple::ppc64le:
3692 AddPPCTargetArgs(Args, CmdArgs);
3693 break;
3694
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003695 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003696 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003697 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003698 AddSparcTargetArgs(Args, CmdArgs);
3699 break;
3700
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003701 case llvm::Triple::x86:
3702 case llvm::Triple::x86_64:
3703 AddX86TargetArgs(Args, CmdArgs);
3704 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003705
3706 case llvm::Triple::hexagon:
3707 AddHexagonTargetArgs(Args, CmdArgs);
3708 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003709 }
3710
Hans Wennborg75958c42013-08-08 00:17:41 +00003711 // Add clang-cl arguments.
3712 if (getToolChain().getDriver().IsCLMode())
3713 AddClangCLArgs(Args, CmdArgs);
3714
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003715 // Pass the linker version in use.
3716 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3717 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003718 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003719 }
3720
Eric Christopherb7d97e92013-04-03 01:58:53 +00003721 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003722 CmdArgs.push_back("-momit-leaf-frame-pointer");
3723
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003724 // Explicitly error on some things we know we don't support and can't just
3725 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003726 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003727 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3728 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003730 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003731 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3732 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003733 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003734 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003735 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003736 }
3737
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003738 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003739 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003740 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003741 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003742 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3743 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003744 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003745 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003746 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003747
Chad Rosierbe10f982011-08-02 17:58:04 +00003748 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003749 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003750 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3751 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003752 }
3753
Manman Ren17bdb0f2013-11-20 20:22:14 +00003754 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
3755 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00003756 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003757 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003758 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikiece3e7a62015-07-30 21:42:22 +00003759 if ((A->getOption().matches(options::OPT_gline_tables_only) ||
3760 A->getOption().matches(options::OPT_g1)) &&
3761 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00003762 // FIXME: we should support specifying dwarf version with
3763 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003764 CmdArgs.push_back("-gline-tables-only");
Alexander Eremin670c6272014-10-16 05:55:24 +00003765 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003766 const llvm::Triple &Triple = getToolChain().getTriple();
3767 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003768 Triple.getOS() == llvm::Triple::FreeBSD ||
3769 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003770 CmdArgs.push_back("-gdwarf-2");
David Blaikiece3e7a62015-07-30 21:42:22 +00003771 SplitDwarfArg = nullptr;
Manman Ren17bdb0f2013-11-20 20:22:14 +00003772 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00003773 CmdArgs.push_back("-gdwarf-2");
3774 else if (A->getOption().matches(options::OPT_gdwarf_3))
3775 CmdArgs.push_back("-gdwarf-3");
3776 else if (A->getOption().matches(options::OPT_gdwarf_4))
3777 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003778 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00003779 !A->getOption().matches(options::OPT_ggdb0)) {
Alexander Eremin670c6272014-10-16 05:55:24 +00003780 // Default is dwarf-2 for Darwin, OpenBSD, FreeBSD and Solaris.
Brad Smith378e7f9b2014-06-13 03:35:37 +00003781 const llvm::Triple &Triple = getToolChain().getTriple();
3782 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
Alexander Eremin670c6272014-10-16 05:55:24 +00003783 Triple.getOS() == llvm::Triple::FreeBSD ||
3784 Triple.getOS() == llvm::Triple::Solaris)
Adrian Prantl549c5142014-02-17 17:40:52 +00003785 CmdArgs.push_back("-gdwarf-2");
3786 else
3787 CmdArgs.push_back("-g");
3788 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003789 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003790
Reid Kleckner124955a2015-08-05 18:51:13 +00003791 // Forward -gcodeview.
3792 Args.AddLastArg(CmdArgs, options::OPT_gcodeview);
3793
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003794 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3795 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Diego Novillo94b276d2014-07-10 23:29:28 +00003796 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
3797 /*Default*/ true))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003798 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003799
Eric Christopher138c32b2013-09-13 22:37:55 +00003800 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003801 if (Args.hasArg(options::OPT_gmodules)) {
3802 CmdArgs.push_back("-g");
3803 CmdArgs.push_back("-dwarf-ext-refs");
3804 CmdArgs.push_back("-fmodule-format=obj");
3805 }
3806
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003807 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3808 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003809 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003810 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003811 CmdArgs.push_back("-g");
3812 CmdArgs.push_back("-backend-option");
3813 CmdArgs.push_back("-split-dwarf=Enable");
3814 }
3815
Eric Christopher138c32b2013-09-13 22:37:55 +00003816 // -ggnu-pubnames turns on gnu style pubnames in the backend.
3817 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
3818 CmdArgs.push_back("-backend-option");
3819 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
3820 }
Eric Christophereec89c22013-06-18 00:03:50 +00003821
Eric Christopher0d403d22014-02-14 01:27:03 +00003822 // -gdwarf-aranges turns on the emission of the aranges section in the
3823 // backend.
3824 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
3825 CmdArgs.push_back("-backend-option");
3826 CmdArgs.push_back("-generate-arange-section");
3827 }
3828
David Blaikief36d9ba2014-01-27 18:52:43 +00003829 if (Args.hasFlag(options::OPT_fdebug_types_section,
3830 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00003831 CmdArgs.push_back("-backend-option");
3832 CmdArgs.push_back("-generate-type-units");
3833 }
Eric Christophereec89c22013-06-18 00:03:50 +00003834
Ed Schouten6e576152015-03-26 17:50:28 +00003835 // CloudABI uses -ffunction-sections and -fdata-sections by default.
3836 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
3837
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003838 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00003839 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003840 CmdArgs.push_back("-ffunction-sections");
3841 }
3842
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003843 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
3844 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00003845 CmdArgs.push_back("-fdata-sections");
3846 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00003847
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003848 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00003849 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00003850 CmdArgs.push_back("-fno-unique-section-names");
3851
Chris Lattner3c77a352010-06-22 00:03:40 +00003852 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
3853
Diego Novilloa0545962015-07-10 18:00:07 +00003854 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00003855
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003856 // Pass options for controlling the default header search paths.
3857 if (Args.hasArg(options::OPT_nostdinc)) {
3858 CmdArgs.push_back("-nostdsysteminc");
3859 CmdArgs.push_back("-nobuiltininc");
3860 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003861 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003862 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003863 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3864 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3865 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003866
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003867 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003868 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003869 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003870
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003871 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3872
Ted Kremenekf7639e12012-03-06 20:06:33 +00003873 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003874 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003875 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003876 options::OPT_ccc_arcmt_modify,
3877 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003878 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003879 switch (A->getOption().getID()) {
3880 default:
3881 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003882 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003883 CmdArgs.push_back("-arcmt-check");
3884 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003885 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003886 CmdArgs.push_back("-arcmt-modify");
3887 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003888 case options::OPT_ccc_arcmt_migrate:
3889 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003890 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003891 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003892
3893 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3894 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003895 break;
John McCalld70fb982011-06-15 23:25:17 +00003896 }
3897 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003898 } else {
3899 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3900 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3901 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003902 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003903
Ted Kremenekf7639e12012-03-06 20:06:33 +00003904 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3905 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
3907 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00003908 }
3909 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003910 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003911
3912 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003913 options::OPT_objcmt_migrate_subscripting,
3914 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003915 // None specified, means enable them all.
3916 CmdArgs.push_back("-objcmt-migrate-literals");
3917 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003918 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003919 } else {
3920 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3921 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003922 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003923 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003924 } else {
3925 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3926 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3927 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3928 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3929 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3930 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00003931 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003932 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3933 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3934 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3935 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3936 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3937 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3938 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003939 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003940 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003941 }
3942
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003943 // Add preprocessing options like -I, -D, etc. if we are using the
3944 // preprocessor.
3945 //
3946 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003947 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003948 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003949
Rafael Espindolaa7431922011-07-21 23:40:37 +00003950 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3951 // that "The compiler can only warn and ignore the option if not recognized".
3952 // When building with ccache, it will pass -D options to clang even on
3953 // preprocessed inputs and configure concludes that -fPIC is not supported.
3954 Args.ClaimAllArgs(options::OPT_D);
3955
Alp Toker7874bdc2013-11-15 20:40:58 +00003956 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003957 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3958 if (A->getOption().matches(options::OPT_O4)) {
3959 CmdArgs.push_back("-O3");
3960 D.Diag(diag::warn_O4_is_O3);
3961 } else {
3962 A->render(Args, CmdArgs);
3963 }
3964 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003965
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003966 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00003967 for (const Arg *A :
3968 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
3969 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00003970 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00003971 }
3972
Rafael Espindola577637a2015-01-03 00:06:04 +00003973 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00003974
Richard Smith3be1cb22014-08-07 00:24:21 +00003975 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00003976 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003977 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3978 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003979 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003980 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003981
3982 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003983 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003984 //
3985 // If a std is supplied, only add -trigraphs if it follows the
3986 // option.
David Majnemer8db91762015-05-18 04:49:30 +00003987 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003988 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3989 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003990 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003991 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003992 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003993 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003994 else
3995 Std->render(Args, CmdArgs);
3996
Nico Weber00721502014-12-23 22:32:37 +00003997 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003998 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00003999 options::OPT_ftrigraphs,
4000 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004001 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004002 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004003 } else {
4004 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004005 //
4006 // FIXME: Clang doesn't correctly handle -std= when the input language
4007 // doesn't match. For the time being just ignore this for C++ inputs;
4008 // eventually we want to do all the standard defaulting here instead of
4009 // splitting it between the driver and clang -cc1.
4010 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004011 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4012 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004013 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004014 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004015
Nico Weber00721502014-12-23 22:32:37 +00004016 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4017 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004018 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004019
Richard Smith282b4492013-09-04 22:50:31 +00004020 // GCC's behavior for -Wwrite-strings is a bit strange:
4021 // * In C, this "warning flag" changes the types of string literals from
4022 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4023 // for the discarded qualifier.
4024 // * In C++, this is just a normal warning flag.
4025 //
4026 // Implementing this warning correctly in C is hard, so we follow GCC's
4027 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4028 // a non-const char* in C, rather than using this crude hack.
4029 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004030 // FIXME: This should behave just like a warning flag, and thus should also
4031 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4032 Arg *WriteStrings =
4033 Args.getLastArg(options::OPT_Wwrite_strings,
4034 options::OPT_Wno_write_strings, options::OPT_w);
4035 if (WriteStrings &&
4036 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004037 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004038 }
4039
Chandler Carruth61fbf622011-04-23 09:27:53 +00004040 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004041 // during C++ compilation, which it is by default. GCC keeps this define even
4042 // in the presence of '-w', match this behavior bug-for-bug.
4043 if (types::isCXX(InputType) &&
4044 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4045 true)) {
4046 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004047 }
4048
Chandler Carruthe0391482010-05-22 02:21:53 +00004049 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4050 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4051 if (Asm->getOption().matches(options::OPT_fasm))
4052 CmdArgs.push_back("-fgnu-keywords");
4053 else
4054 CmdArgs.push_back("-fno-gnu-keywords");
4055 }
4056
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004057 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4058 CmdArgs.push_back("-fno-dwarf-directory-asm");
4059
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004060 if (ShouldDisableAutolink(Args, getToolChain()))
4061 CmdArgs.push_back("-fno-autolink");
4062
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004063 // Add in -fdebug-compilation-dir if necessary.
4064 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004065
Richard Smith9a568822011-11-21 19:36:32 +00004066 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4067 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004068 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004069 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004070 }
4071
Richard Smith79c927b2013-11-06 19:31:51 +00004072 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4073 CmdArgs.push_back("-foperator-arrow-depth");
4074 CmdArgs.push_back(A->getValue());
4075 }
4076
Richard Smith9a568822011-11-21 19:36:32 +00004077 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4078 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004079 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004080 }
4081
Richard Smitha3d3bd22013-05-08 02:12:03 +00004082 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4083 CmdArgs.push_back("-fconstexpr-steps");
4084 CmdArgs.push_back(A->getValue());
4085 }
4086
Richard Smithb3a14522013-02-22 01:59:51 +00004087 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4088 CmdArgs.push_back("-fbracket-depth");
4089 CmdArgs.push_back(A->getValue());
4090 }
4091
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004092 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4093 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004094 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004095 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004096 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4097 } else
4098 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004099 }
4100
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004101 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004102 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004103
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004104 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4105 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004106 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004107 }
David Chisnall5778fce2009-08-31 16:41:57 +00004108
Chris Lattnere23003d2010-01-09 21:54:33 +00004109 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4110 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004111 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004112 }
4113
Chris Lattnerb35583d2010-04-07 20:49:23 +00004114 CmdArgs.push_back("-ferror-limit");
4115 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004116 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004117 else
4118 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004119
Chandler Carrutha77a7272010-05-06 04:55:18 +00004120 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4121 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004122 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004123 }
4124
4125 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4126 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004127 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004128 }
4129
Richard Smithf6f003a2011-12-16 19:06:07 +00004130 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4131 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004132 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004133 }
4134
Nick Lewycky24653262014-12-16 21:39:02 +00004135 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4136 CmdArgs.push_back("-fspell-checking-limit");
4137 CmdArgs.push_back(A->getValue());
4138 }
4139
Daniel Dunbar2c978472009-11-04 06:24:47 +00004140 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004141 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004142 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004143 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004144 } else {
4145 // If -fmessage-length=N was not specified, determine whether this is a
4146 // terminal and, if so, implicitly define -fmessage-length appropriately.
4147 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004149 }
4150
John McCallb4a99d32013-02-19 01:57:35 +00004151 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4152 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4153 options::OPT_fvisibility_ms_compat)) {
4154 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4155 CmdArgs.push_back("-fvisibility");
4156 CmdArgs.push_back(A->getValue());
4157 } else {
4158 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4159 CmdArgs.push_back("-fvisibility");
4160 CmdArgs.push_back("hidden");
4161 CmdArgs.push_back("-ftype-visibility");
4162 CmdArgs.push_back("default");
4163 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004164 }
4165
Douglas Gregor08329632010-06-15 17:05:35 +00004166 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004167
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004168 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4169
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004170 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004171 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4172 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004173 CmdArgs.push_back("-ffreestanding");
4174
Daniel Dunbare357d562009-12-03 18:42:11 +00004175 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004176 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004177 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00004178 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
4179 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00004180 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004181 // Emulated TLS is enabled by default on Android, and can be enabled manually
4182 // with -femulated-tls.
4183 bool EmulatedTLSDefault = Triple.getEnvironment() == llvm::Triple::Android;
4184 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4185 EmulatedTLSDefault))
4186 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004187 // AltiVec-like language extensions aren't relevant for assembling.
4188 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004189 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004190 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4191 }
Richard Trieu91844232012-06-26 18:18:47 +00004192 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4193 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004194
Alexey Bataevdb390212015-05-20 04:24:19 +00004195 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004196 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4197 options::OPT_fno_openmp, false))
4198 switch (getOpenMPRuntime(getToolChain(), Args)) {
4199 case OMPRT_OMP:
4200 case OMPRT_IOMP5:
4201 // Clang can generate useful OpenMP code for these two runtime libraries.
4202 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004203
4204 // If no option regarding the use of TLS in OpenMP codegeneration is
4205 // given, decide a default based on the target. Otherwise rely on the
4206 // options and pass the right information to the frontend.
4207 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004208 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004209 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004210 break;
4211 default:
4212 // By default, if Clang doesn't know how to generate useful OpenMP code
4213 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4214 // down to the actual compilation.
4215 // FIXME: It would be better to have a mode which *only* omits IR
4216 // generation based on the OpenMP support so that we get consistent
4217 // semantic analysis, etc.
4218 break;
4219 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004220
Peter Collingbourne32701642013-11-01 18:16:25 +00004221 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004222 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004223
Eric Christopher459d2712013-02-19 06:16:53 +00004224 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004225 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4226 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4227 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4228 Arch == llvm::Triple::ppc64le))
4229 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4230 << "ppc/ppc64/ppc64le";
4231 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004232
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004233 // -fzvector is incompatible with -faltivec.
4234 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4235 if (Args.hasArg(options::OPT_faltivec))
4236 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4237 << "-faltivec";
4238
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004239 if (getToolChain().SupportsProfiling())
4240 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004241
4242 // -flax-vector-conversions is default.
4243 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4244 options::OPT_fno_lax_vector_conversions))
4245 CmdArgs.push_back("-fno-lax-vector-conversions");
4246
John Brawna7b4ec02015-08-10 11:11:28 +00004247 if (Args.getLastArg(options::OPT_fapple_kext) ||
4248 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004249 CmdArgs.push_back("-fapple-kext");
4250
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004251 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004252 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004253 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004254 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4255 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004256
4257 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4258 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004259 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004260 }
4261
Bob Wilson14adb362012-02-03 06:27:22 +00004262 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004263
Chandler Carruth6e501032011-03-27 00:04:55 +00004264 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4265 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004266 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004267 if (A->getOption().matches(options::OPT_fwrapv))
4268 CmdArgs.push_back("-fwrapv");
4269 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4270 options::OPT_fno_strict_overflow)) {
4271 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4272 CmdArgs.push_back("-fwrapv");
4273 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004274
4275 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4276 options::OPT_fno_reroll_loops))
4277 if (A->getOption().matches(options::OPT_freroll_loops))
4278 CmdArgs.push_back("-freroll-loops");
4279
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004280 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004281 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4282 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004283
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004284 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4285
Daniel Dunbar4930e332009-11-17 08:07:36 +00004286 // -stack-protector=0 is default.
4287 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004288 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4289 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4290 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4291 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4292 Args.ClaimAllArgs(options::OPT_fstack_protector);
4293 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004294 options::OPT_fstack_protector_all,
4295 options::OPT_fstack_protector_strong,
4296 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004297 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004298 StackProtectorLevel = std::max<unsigned>(
4299 LangOptions::SSPOn,
4300 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004301 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004302 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004303 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004304 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004305 } else {
4306 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004307 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004308 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004309 if (StackProtectorLevel) {
4310 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004311 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004312 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004313
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004314 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004315 for (const Arg *A : Args.filtered(options::OPT__param)) {
4316 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004317 if (Str.startswith("ssp-buffer-size=")) {
4318 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004319 CmdArgs.push_back("-stack-protector-buffer-size");
4320 // FIXME: Verify the argument is a valid integer.
4321 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004322 }
Sean Silva14facf32015-06-09 01:57:17 +00004323 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004324 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004325 }
4326
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004327 // Translate -mstackrealign
4328 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
4329 false)) {
4330 CmdArgs.push_back("-backend-option");
4331 CmdArgs.push_back("-force-align-stack");
4332 }
4333 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004334 false)) {
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004335 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
4336 }
4337
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004338 if (Args.hasArg(options::OPT_mstack_alignment)) {
4339 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4340 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004341 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004342
Hans Wennborg77dc2362015-01-20 19:45:50 +00004343 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4344 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4345
4346 if (!Size.empty())
4347 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4348 else
4349 CmdArgs.push_back("-mstack-probe-size=0");
4350 }
4351
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004352 switch (getToolChain().getArch()) {
4353 case llvm::Triple::aarch64:
4354 case llvm::Triple::aarch64_be:
4355 case llvm::Triple::arm:
4356 case llvm::Triple::armeb:
4357 case llvm::Triple::thumb:
4358 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004359 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004360 break;
4361
4362 default:
4363 break;
4364 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004365
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004366 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4367 options::OPT_mno_restrict_it)) {
4368 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4369 CmdArgs.push_back("-backend-option");
4370 CmdArgs.push_back("-arm-restrict-it");
4371 } else {
4372 CmdArgs.push_back("-backend-option");
4373 CmdArgs.push_back("-arm-no-restrict-it");
4374 }
James Y Knight2db38f32015-08-15 03:45:25 +00004375 } else if (Triple.isOSWindows() &&
4376 (Triple.getArch() == llvm::Triple::arm ||
4377 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004378 // Windows on ARM expects restricted IT blocks
4379 CmdArgs.push_back("-backend-option");
4380 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004381 }
4382
Daniel Dunbard18049a2009-04-07 21:16:11 +00004383 // Forward -f options with positive and negative forms; we translate
4384 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004385 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4386 StringRef fname = A->getValue();
4387 if (!llvm::sys::fs::exists(fname))
4388 D.Diag(diag::err_drv_no_such_file) << fname;
4389 else
4390 A->render(Args, CmdArgs);
4391 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004392
John Brawna7b4ec02015-08-10 11:11:28 +00004393 // -fbuiltin is default unless -mkernel is used
4394 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4395 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004396 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004397
Nuno Lopes13c88c72009-12-16 16:59:22 +00004398 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4399 options::OPT_fno_assume_sane_operator_new))
4400 CmdArgs.push_back("-fno-assume-sane-operator-new");
4401
Daniel Dunbar4930e332009-11-17 08:07:36 +00004402 // -fblocks=0 is default.
4403 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004404 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004405 (Args.hasArg(options::OPT_fgnu_runtime) &&
4406 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4407 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004408 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004409
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004410 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004411 !getToolChain().hasBlocksRuntime())
4412 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004413 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004414
Richard Smith47972af2015-06-16 00:08:24 +00004415 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004416 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004417 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004418 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004419 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004420 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4421 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004422 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004423 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004424 HaveModules = true;
4425 }
4426 }
4427
Richard Smith47972af2015-06-16 00:08:24 +00004428 // -fmodule-maps enables implicit reading of module map files. By default,
4429 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004430 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4431 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004432 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004433 }
4434
Daniel Jasperac42b752013-10-21 06:34:34 +00004435 // -fmodules-decluse checks that modules used are declared so (off by
4436 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004437 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004438 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004439 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004440 }
4441
Daniel Jasper962b38e2014-04-11 11:47:45 +00004442 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4443 // all #included headers are part of modules.
4444 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004445 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004446 CmdArgs.push_back("-fmodules-strict-decluse");
4447 }
4448
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004449 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4450 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4451 options::OPT_fno_implicit_modules)) {
4452 CmdArgs.push_back("-fno-implicit-modules");
4453 }
4454
Daniel Jasperac42b752013-10-21 06:34:34 +00004455 // -fmodule-name specifies the module that is currently being built (or
4456 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004457 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004458
Richard Smith9887d792014-10-17 01:42:53 +00004459 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004460 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004461 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004462
Richard Smithe842a472014-10-22 02:05:46 +00004463 // -fmodule-file can be used to specify files containing precompiled modules.
4464 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4465
4466 // -fmodule-cache-path specifies where our implicitly-built module files
4467 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004468 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004469 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004470 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004471 if (HaveModules) {
4472 if (C.isForDiagnostics()) {
4473 // When generating crash reports, we want to emit the modules along with
4474 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004475 Path = Output.getFilename();
4476 llvm::sys::path::replace_extension(Path, ".cache");
4477 llvm::sys::path::append(Path, "modules");
4478 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004479 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004480 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004481 llvm::sys::path::append(Path, "org.llvm.clang.");
4482 appendUserToPath(Path);
4483 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004484 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004485 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004486 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4487 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004488 }
4489
4490 // When building modules and generating crashdumps, we need to dump a module
4491 // dependency VFS alongside the output.
4492 if (HaveModules && C.isForDiagnostics()) {
4493 SmallString<128> VFSDir(Output.getFilename());
4494 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004495 // Add the cache directory as a temp so the crash diagnostics pick it up.
4496 C.addTempFile(Args.MakeArgString(VFSDir));
4497
Justin Bognera88f0122014-06-20 22:59:50 +00004498 llvm::sys::path::append(VFSDir, "vfs");
4499 CmdArgs.push_back("-module-dependency-dir");
4500 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004501 }
4502
Richard Smith9887d792014-10-17 01:42:53 +00004503 if (HaveModules)
4504 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004505
Douglas Gregor35b04d62013-02-07 19:01:24 +00004506 // Pass through all -fmodules-ignore-macro arguments.
4507 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004508 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4509 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004510
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004511 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4512
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004513 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4514 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4515 D.Diag(diag::err_drv_argument_not_allowed_with)
4516 << A->getAsString(Args) << "-fbuild-session-timestamp";
4517
4518 llvm::sys::fs::file_status Status;
4519 if (llvm::sys::fs::status(A->getValue(), Status))
4520 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004521 CmdArgs.push_back(Args.MakeArgString(
4522 "-fbuild-session-timestamp=" +
4523 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004524 }
4525
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004526 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004527 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4528 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004529 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4530
4531 Args.AddLastArg(CmdArgs,
4532 options::OPT_fmodules_validate_once_per_build_session);
4533 }
4534
Ben Langmuirdcf73862014-03-12 00:06:17 +00004535 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4536
John McCalldfea9982010-04-09 19:12:06 +00004537 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004538 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004539 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004540 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004541
Anders Carlssond470fef2010-11-21 00:09:52 +00004542 // -felide-constructors is the default.
4543 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004544 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004545 CmdArgs.push_back("-fno-elide-constructors");
4546
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004547 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004548
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004549 if (KernelOrKext || (types::isCXX(InputType) &&
4550 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4551 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004552 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004553
Tony Linthicum76329bf2011-12-12 21:14:55 +00004554 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004555 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4556 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004557 CmdArgs.push_back("-fshort-enums");
4558
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004559 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004560 if (Arg *A = Args.getLastArg(
4561 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4562 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4563 if (A->getOption().matches(options::OPT_funsigned_char) ||
4564 A->getOption().matches(options::OPT_fno_signed_char)) {
4565 CmdArgs.push_back("-fno-signed-char");
4566 }
4567 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004568 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004569 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004570
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004571 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004572 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
4573 options::OPT_fno_use_cxa_atexit,
4574 !IsWindowsCygnus && !IsWindowsGNU &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004575 getToolChain().getArch() != llvm::Triple::hexagon &&
4576 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004577 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004578 CmdArgs.push_back("-fno-use-cxa-atexit");
4579
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004580 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004581 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004582 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004583 CmdArgs.push_back("-fms-extensions");
4584
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004585 // -fno-use-line-directives is default.
4586 if (Args.hasFlag(options::OPT_fuse_line_directives,
4587 options::OPT_fno_use_line_directives, false))
4588 CmdArgs.push_back("-fuse-line-directives");
4589
Francois Pichet1b4f1632011-09-17 04:32:15 +00004590 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004592 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004593 (IsWindowsMSVC &&
4594 Args.hasFlag(options::OPT_fms_extensions,
4595 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004596 CmdArgs.push_back("-fms-compatibility");
4597
David Majnemerc371ff02015-03-22 08:39:22 +00004598 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004599 VersionTuple MSVT = visualstudio::getMSVCVersion(
4600 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4601 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004602 CmdArgs.push_back(
4603 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004604
David Majnemer8db91762015-05-18 04:49:30 +00004605 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4606 if (ImplyVCPPCXXVer) {
4607 if (IsMSVC2015Compatible)
4608 CmdArgs.push_back("-std=c++14");
4609 else
4610 CmdArgs.push_back("-std=c++11");
4611 }
4612
Eric Christopher5ecce122013-02-18 00:38:31 +00004613 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004614 if (Args.hasFlag(options::OPT_fborland_extensions,
4615 options::OPT_fno_borland_extensions, false))
4616 CmdArgs.push_back("-fborland-extensions");
4617
David Majnemerc371ff02015-03-22 08:39:22 +00004618 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4619 // than 19.
4620 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4621 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004622 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004623 CmdArgs.push_back("-fno-threadsafe-statics");
4624
Francois Pichet02744872011-09-01 16:38:08 +00004625 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4626 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004627 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004628 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004629 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004630
Chandler Carruthe03aa552010-04-17 20:17:31 +00004631 // -fgnu-keywords default varies depending on language; only pass if
4632 // specified.
4633 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004634 options::OPT_fno_gnu_keywords))
4635 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004637 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004638 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004639 CmdArgs.push_back("-fgnu89-inline");
4640
Chad Rosier9c76d242012-03-15 22:31:42 +00004641 if (Args.hasArg(options::OPT_fno_inline))
4642 CmdArgs.push_back("-fno-inline");
4643
Chad Rosier64d6be92012-03-06 21:17:19 +00004644 if (Args.hasArg(options::OPT_fno_inline_functions))
4645 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004646
John McCall5fb5df92012-06-20 06:18:46 +00004647 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004648
John McCall5fb5df92012-06-20 06:18:46 +00004649 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004650 // legacy is the default. Except for deployment taget of 10.5,
4651 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4652 // gets ignored silently.
4653 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004654 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4655 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004656 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004657 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004658 if (getToolChain().UseObjCMixedDispatch())
4659 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4660 else
4661 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4662 }
4663 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004664
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004665 // When ObjectiveC legacy runtime is in effect on MacOSX,
4666 // turn on the option to do Array/Dictionary subscripting
4667 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004668 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004669 getToolChain().getTriple().isMacOSX() &&
4670 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4671 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004672 objcRuntime.isNeXTFamily())
4673 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004674
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004675 // -fencode-extended-block-signature=1 is default.
4676 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4677 CmdArgs.push_back("-fencode-extended-block-signature");
4678 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004679
John McCall24fc0de2011-07-06 00:26:06 +00004680 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4681 // NOTE: This logic is duplicated in ToolChains.cpp.
4682 bool ARC = isObjCAutoRefCount(Args);
4683 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004684 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004685
John McCall24fc0de2011-07-06 00:26:06 +00004686 CmdArgs.push_back("-fobjc-arc");
4687
Chandler Carruth491db322011-11-04 07:34:47 +00004688 // FIXME: It seems like this entire block, and several around it should be
4689 // wrapped in isObjC, but for now we just use it here as this is where it
4690 // was being used previously.
4691 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4692 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4693 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4694 else
4695 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4696 }
4697
John McCall24fc0de2011-07-06 00:26:06 +00004698 // Allow the user to enable full exceptions code emission.
4699 // We define off for Objective-CC, on for Objective-C++.
4700 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4701 options::OPT_fno_objc_arc_exceptions,
4702 /*default*/ types::isCXX(InputType)))
4703 CmdArgs.push_back("-fobjc-arc-exceptions");
4704 }
4705
4706 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4707 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004708 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004709 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004710
John McCall24fc0de2011-07-06 00:26:06 +00004711 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4712 // takes precedence.
4713 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4714 if (!GCArg)
4715 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4716 if (GCArg) {
4717 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004718 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004719 } else if (getToolChain().SupportsObjCGC()) {
4720 GCArg->render(Args, CmdArgs);
4721 } else {
4722 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004723 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004724 }
4725 }
4726
Bob Wilsonb111ec92015-03-02 19:01:14 +00004727 if (Args.hasFlag(options::OPT_fapplication_extension,
4728 options::OPT_fno_application_extension, false))
4729 CmdArgs.push_back("-fapplication-extension");
4730
Reid Klecknerc542d372014-06-27 17:02:02 +00004731 // Handle GCC-style exception args.
4732 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004733 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4734 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004735
4736 if (getToolChain().UseSjLjExceptions())
4737 CmdArgs.push_back("-fsjlj-exceptions");
4738
4739 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004740 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4741 options::OPT_fno_assume_sane_operator_new))
4742 CmdArgs.push_back("-fno-assume-sane-operator-new");
4743
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004744 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4745 // most platforms.
4746 if (Args.hasFlag(options::OPT_fsized_deallocation,
4747 options::OPT_fno_sized_deallocation, false))
4748 CmdArgs.push_back("-fsized-deallocation");
4749
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004750 // -fconstant-cfstrings is default, and may be subject to argument translation
4751 // on Darwin.
4752 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4753 options::OPT_fno_constant_cfstrings) ||
4754 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4755 options::OPT_mno_constant_cfstrings))
4756 CmdArgs.push_back("-fno-constant-cfstrings");
4757
John Thompsoned4e2952009-11-05 20:14:16 +00004758 // -fshort-wchar default varies depending on platform; only
4759 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004760 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4761 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004762 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004763
Hans Wennborg28c96312013-07-31 23:39:13 +00004764 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004765 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004766 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004767 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004768
Daniel Dunbar096ed292011-10-05 21:04:55 +00004769 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4770 // -fno-pack-struct doesn't apply to -fpack-struct=.
4771 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00004772 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00004773 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00004774 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00004775 } else if (Args.hasFlag(options::OPT_fpack_struct,
4776 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00004777 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00004778 }
4779
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00004780 // Handle -fmax-type-align=N and -fno-type-align
4781 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
4782 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
4783 if (!SkipMaxTypeAlign) {
4784 std::string MaxTypeAlignStr = "-fmax-type-align=";
4785 MaxTypeAlignStr += A->getValue();
4786 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4787 }
4788 } else if (getToolChain().getTriple().isOSDarwin()) {
4789 if (!SkipMaxTypeAlign) {
4790 std::string MaxTypeAlignStr = "-fmax-type-align=16";
4791 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
4792 }
4793 }
4794
John Brawna7b4ec02015-08-10 11:11:28 +00004795 // -fcommon is the default unless compiling kernel code or the target says so
4796 bool NoCommonDefault =
4797 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
4798 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
4799 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004800 CmdArgs.push_back("-fno-common");
4801
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004802 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00004803 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00004804 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004805 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004806 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004807 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00004808
Daniel Dunbar6358d682010-10-15 22:30:42 +00004809 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004810 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004811 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004812 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00004813
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004814 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004815 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
4816 StringRef value = inputCharset->getValue();
4817 if (value != "UTF-8")
4818 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
4819 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00004820 }
4821
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004822 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004823 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
4824 StringRef value = execCharset->getValue();
4825 if (value != "UTF-8")
4826 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
4827 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00004828 }
4829
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00004830 // -fcaret-diagnostics is default.
4831 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
4832 options::OPT_fno_caret_diagnostics, true))
4833 CmdArgs.push_back("-fno-caret-diagnostics");
4834
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004835 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00004836 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00004837 options::OPT_fno_diagnostics_fixit_info))
4838 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004839
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004840 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00004841 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004842 options::OPT_fno_diagnostics_show_option))
4843 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004844
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004845 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004846 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004847 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00004848 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00004849 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004850
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004851 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00004852 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00004853 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00004854 }
4855
Chandler Carruthb6766f02011-03-27 01:50:55 +00004856 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 options::OPT_fdiagnostics_show_note_include_stack,
4858 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00004859 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004860 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00004861 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
4862 else
4863 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
4864 }
4865
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004866 // Color diagnostics are the default, unless the terminal doesn't support
4867 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00004868 // Support both clang's -f[no-]color-diagnostics and gcc's
4869 // -f[no-]diagnostics-colors[=never|always|auto].
4870 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004871 for (const auto &Arg : Args) {
4872 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00004873 if (!O.matches(options::OPT_fcolor_diagnostics) &&
4874 !O.matches(options::OPT_fdiagnostics_color) &&
4875 !O.matches(options::OPT_fno_color_diagnostics) &&
4876 !O.matches(options::OPT_fno_diagnostics_color) &&
4877 !O.matches(options::OPT_fdiagnostics_color_EQ))
4878 continue;
4879
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004880 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00004881 if (O.matches(options::OPT_fcolor_diagnostics) ||
4882 O.matches(options::OPT_fdiagnostics_color)) {
4883 ShowColors = Colors_On;
4884 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
4885 O.matches(options::OPT_fno_diagnostics_color)) {
4886 ShowColors = Colors_Off;
4887 } else {
4888 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004889 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00004890 if (value == "always")
4891 ShowColors = Colors_On;
4892 else if (value == "never")
4893 ShowColors = Colors_Off;
4894 else if (value == "auto")
4895 ShowColors = Colors_Auto;
4896 else
4897 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004898 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00004899 }
4900 }
4901 if (ShowColors == Colors_On ||
4902 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00004903 CmdArgs.push_back("-fcolor-diagnostics");
4904
Nico Rieck7857d462013-09-11 00:38:02 +00004905 if (Args.hasArg(options::OPT_fansi_escape_codes))
4906 CmdArgs.push_back("-fansi-escape-codes");
4907
Daniel Dunbardb097022009-06-08 21:13:54 +00004908 if (!Args.hasFlag(options::OPT_fshow_source_location,
4909 options::OPT_fno_show_source_location))
4910 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00004911
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004912 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00004913 true))
4914 CmdArgs.push_back("-fno-show-column");
4915
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004916 if (!Args.hasFlag(options::OPT_fspell_checking,
4917 options::OPT_fno_spell_checking))
4918 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004919
Chad Rosierc8e56e82012-12-05 21:08:21 +00004920 // -fno-asm-blocks is default.
4921 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4922 false))
4923 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004924
Steven Wucb0d13f2015-01-16 23:05:28 +00004925 // -fgnu-inline-asm is default.
4926 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
4927 options::OPT_fno_gnu_inline_asm, true))
4928 CmdArgs.push_back("-fno-gnu-inline-asm");
4929
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004930 // Enable vectorization per default according to the optimization level
4931 // selected. For optimization levels that want vectorization we use the alias
4932 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004933 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004934 OptSpecifier VectorizeAliasOption =
4935 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004936 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004937 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004938 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004939
Chad Rosier136d67d2014-04-28 19:30:57 +00004940 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004941 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004942 OptSpecifier SLPVectAliasOption =
4943 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00004944 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004945 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004946 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004947
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004948 // -fno-slp-vectorize-aggressive is default.
4949 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004950 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004951 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004952
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004953 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4954 A->render(Args, CmdArgs);
4955
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004956 // -fdollars-in-identifiers default varies depending on platform and
4957 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004958 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004959 options::OPT_fno_dollars_in_identifiers)) {
4960 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004961 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004962 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004963 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004964 }
4965
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004966 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4967 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004968 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004969 options::OPT_fno_unit_at_a_time)) {
4970 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004971 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004972 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004973
Eli Friedman055c9702011-11-02 01:53:16 +00004974 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4975 options::OPT_fno_apple_pragma_pack, false))
4976 CmdArgs.push_back("-fapple-pragma-pack");
4977
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004978 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004979 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4980 // by default.
4981 if (getToolChain().getArch() == llvm::Triple::le32) {
4982 CmdArgs.push_back("-fno-math-builtin");
4983 }
4984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004985// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
4986//
4987// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004988#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004989 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004990 (getToolChain().getArch() == llvm::Triple::arm ||
4991 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004992 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4993 CmdArgs.push_back("-fno-builtin-strcat");
4994 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4995 CmdArgs.push_back("-fno-builtin-strcpy");
4996 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004997#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004998
Justin Bognera88f0122014-06-20 22:59:50 +00004999 // Enable rewrite includes if the user's asked for it or if we're generating
5000 // diagnostics.
5001 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5002 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005003 if (Args.hasFlag(options::OPT_frewrite_includes,
5004 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005005 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005006 CmdArgs.push_back("-frewrite-includes");
5007
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005008 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005009 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005010 options::OPT_traditional_cpp)) {
5011 if (isa<PreprocessJobAction>(JA))
5012 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005013 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005014 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005015 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005016
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005017 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005018 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005019
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005020 // Handle serialized diagnostics.
5021 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5022 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005023 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005024 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005025
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005026 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5027 CmdArgs.push_back("-fretain-comments-from-system-headers");
5028
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005029 // Forward -fcomment-block-commands to -cc1.
5030 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005031 // Forward -fparse-all-comments to -cc1.
5032 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005033
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005034 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5035 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005036 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005037 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5038 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005039
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005040 // We translate this by hand to the -cc1 argument, since nightly test uses
5041 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005042 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005043 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005044 } else
Sean Silva14facf32015-06-09 01:57:17 +00005045 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005046 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005047
Bob Wilson23a55f12014-12-21 07:00:00 +00005048 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005049 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5050 // by the frontend.
5051 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5052 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005053
Daniel Dunbard67a3222009-03-30 06:36:42 +00005054 if (Output.getType() == types::TY_Dependencies) {
5055 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005056 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005057 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005058 CmdArgs.push_back(Output.getFilename());
5059 } else {
5060 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005061 }
5062
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005063 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005064
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005065 if (Input.isFilename())
5066 CmdArgs.push_back(Input.getFilename());
5067 else
5068 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005069
Chris Lattnere9d7d782009-11-03 19:50:27 +00005070 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5071
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005072 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005073
5074 // Optionally embed the -cc1 level arguments into the debug info, for build
5075 // analysis.
5076 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005077 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005078 for (const auto &Arg : Args)
5079 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005080
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005081 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005082 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005083 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005084 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005085 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005086 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005087 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005088 }
5089 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005090 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005091 }
5092
Eric Christopherd3804002013-02-22 20:12:52 +00005093 // Add the split debug info name to the command lines here so we
5094 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005095 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005096 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5097 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005098 const char *SplitDwarfOut;
5099 if (SplitDwarf) {
5100 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005101 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005102 CmdArgs.push_back(SplitDwarfOut);
5103 }
5104
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005105 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5106 // Include them with -fcuda-include-gpubinary.
5107 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005108 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005109 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005110 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005111 }
5112
Eric Christopherd3804002013-02-22 20:12:52 +00005113 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005114 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005115 Output.getType() == types::TY_Object &&
5116 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005117 auto CLCommand =
5118 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005119 C.addCommand(llvm::make_unique<FallbackCommand>(
5120 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005121 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005122 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005123 }
5124
Eric Christopherf1545832013-02-22 23:50:16 +00005125 // Handle the debug info splitting at object creation time if we're
5126 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005127 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005128 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005129 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005130
Roman Divacky178e01602011-02-10 16:52:03 +00005131 if (Arg *A = Args.getLastArg(options::OPT_pg))
5132 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005133 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5134 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005135
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005136 // Claim some arguments which clang supports automatically.
5137
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005138 // -fpch-preprocess is used with gcc to add a special marker in the output to
5139 // include the PCH file. Clang's PTH solution is completely transparent, so we
5140 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005141 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005142
Daniel Dunbar17731772009-03-23 19:03:36 +00005143 // Claim some arguments which clang doesn't support, but we don't
5144 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005145 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5146 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005147
Rafael Espindolab0092d72013-09-04 19:37:35 +00005148 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005149 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005150}
5151
John McCall5fb5df92012-06-20 06:18:46 +00005152/// Add options related to the Objective-C runtime/ABI.
5153///
5154/// Returns true if the runtime is non-fragile.
5155ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5156 ArgStringList &cmdArgs,
5157 RewriteKind rewriteKind) const {
5158 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005159 Arg *runtimeArg =
5160 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5161 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005162
5163 // Just forward -fobjc-runtime= to the frontend. This supercedes
5164 // options about fragility.
5165 if (runtimeArg &&
5166 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5167 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005168 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005169 if (runtime.tryParse(value)) {
5170 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005171 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005172 }
5173
5174 runtimeArg->render(args, cmdArgs);
5175 return runtime;
5176 }
5177
5178 // Otherwise, we'll need the ABI "version". Version numbers are
5179 // slightly confusing for historical reasons:
5180 // 1 - Traditional "fragile" ABI
5181 // 2 - Non-fragile ABI, version 1
5182 // 3 - Non-fragile ABI, version 2
5183 unsigned objcABIVersion = 1;
5184 // If -fobjc-abi-version= is present, use that to set the version.
5185 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005186 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005187 if (value == "1")
5188 objcABIVersion = 1;
5189 else if (value == "2")
5190 objcABIVersion = 2;
5191 else if (value == "3")
5192 objcABIVersion = 3;
5193 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005194 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005195 } else {
5196 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005197 bool nonFragileABIIsDefault =
5198 (rewriteKind == RK_NonFragile ||
5199 (rewriteKind == RK_None &&
5200 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005201 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5202 options::OPT_fno_objc_nonfragile_abi,
5203 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005204// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005205#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5206 unsigned nonFragileABIVersion = 1;
5207#else
5208 unsigned nonFragileABIVersion = 2;
5209#endif
5210
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005211 if (Arg *abiArg =
5212 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005213 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005214 if (value == "1")
5215 nonFragileABIVersion = 1;
5216 else if (value == "2")
5217 nonFragileABIVersion = 2;
5218 else
5219 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005221 }
5222
5223 objcABIVersion = 1 + nonFragileABIVersion;
5224 } else {
5225 objcABIVersion = 1;
5226 }
5227 }
5228
5229 // We don't actually care about the ABI version other than whether
5230 // it's non-fragile.
5231 bool isNonFragile = objcABIVersion != 1;
5232
5233 // If we have no runtime argument, ask the toolchain for its default runtime.
5234 // However, the rewriter only really supports the Mac runtime, so assume that.
5235 ObjCRuntime runtime;
5236 if (!runtimeArg) {
5237 switch (rewriteKind) {
5238 case RK_None:
5239 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5240 break;
5241 case RK_Fragile:
5242 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5243 break;
5244 case RK_NonFragile:
5245 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5246 break;
5247 }
5248
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005249 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005250 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5251 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005252 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005253 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5254
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005256 } else {
5257 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5258 }
5259
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005260 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005261 } else {
5262 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005263 // Legacy behaviour is to target the gnustep runtime if we are i
5264 // non-fragile mode or the GCC runtime in fragile mode.
5265 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005266 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005267 else
5268 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005269 }
5270
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005271 cmdArgs.push_back(
5272 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005273 return runtime;
5274}
5275
Reid Klecknerc542d372014-06-27 17:02:02 +00005276static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5277 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5278 I += HaveDash;
5279 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005280}
Reid Klecknerc542d372014-06-27 17:02:02 +00005281
5282struct EHFlags {
5283 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5284 bool Synch;
5285 bool Asynch;
5286 bool NoExceptC;
5287};
5288
5289/// /EH controls whether to run destructor cleanups when exceptions are
5290/// thrown. There are three modifiers:
5291/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5292/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5293/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5294/// - c: Assume that extern "C" functions are implicitly noexcept. This
5295/// modifier is an optimization, so we ignore it for now.
5296/// The default is /EHs-c-, meaning cleanups are disabled.
5297static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5298 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005299
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005300 std::vector<std::string> EHArgs =
5301 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005302 for (auto EHVal : EHArgs) {
5303 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5304 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 case 'a':
5306 EH.Asynch = maybeConsumeDash(EHVal, I);
5307 continue;
5308 case 'c':
5309 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5310 continue;
5311 case 's':
5312 EH.Synch = maybeConsumeDash(EHVal, I);
5313 continue;
5314 default:
5315 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005316 }
5317 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5318 break;
5319 }
5320 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005321
Reid Kleckner5c6efed2015-07-14 18:16:48 +00005322 // FIXME: Disable C++ EH completely, until it becomes more reliable. Users
5323 // can use -Xclang to manually enable C++ EH until then.
5324 EH = EHFlags();
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005325
Reid Klecknerc542d372014-06-27 17:02:02 +00005326 return EH;
5327}
5328
Hans Wennborg75958c42013-08-08 00:17:41 +00005329void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
5330 unsigned RTOptionID = options::OPT__SLASH_MT;
5331
Hans Wennborgf1a74252013-09-10 20:18:04 +00005332 if (Args.hasArg(options::OPT__SLASH_LDd))
5333 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5334 // but defining _DEBUG is sticky.
5335 RTOptionID = options::OPT__SLASH_MTd;
5336
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005337 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005338 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005339
David Majnemere2afb472015-07-24 06:49:13 +00005340 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005341 switch (RTOptionID) {
5342 case options::OPT__SLASH_MD:
5343 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005344 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005345 CmdArgs.push_back("-D_MT");
5346 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005347 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005348 break;
5349 case options::OPT__SLASH_MDd:
5350 CmdArgs.push_back("-D_DEBUG");
5351 CmdArgs.push_back("-D_MT");
5352 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005353 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354 break;
5355 case options::OPT__SLASH_MT:
5356 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005357 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005358 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005359 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 break;
5361 case options::OPT__SLASH_MTd:
5362 CmdArgs.push_back("-D_DEBUG");
5363 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005364 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 break;
5366 default:
5367 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005368 }
5369
David Majnemere2afb472015-07-24 06:49:13 +00005370 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5371 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5372 } else {
5373 CmdArgs.push_back(FlagForCRT.data());
5374
5375 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5376 // users want. The /Za flag to cl.exe turns this off, but it's not
5377 // implemented in clang.
5378 CmdArgs.push_back("--dependent-lib=oldnames");
5379 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005380
Hans Wennborg8858a032014-07-21 23:42:07 +00005381 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5382 // would produce interleaved output, so ignore /showIncludes in such cases.
5383 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5384 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5385 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005386
David Majnemerf6072342014-07-01 22:24:56 +00005387 // This controls whether or not we emit RTTI data for polymorphic types.
5388 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5389 /*default=*/false))
5390 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005391
Reid Kleckner124955a2015-08-05 18:51:13 +00005392 // Emit CodeView if -Z7 is present.
5393 bool EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
5394 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5395 // If we are emitting CV but not DWARF, don't build information that LLVM
5396 // can't yet process.
5397 if (EmitCodeView && !EmitDwarf)
5398 CmdArgs.push_back("-gline-tables-only");
5399 if (EmitCodeView)
5400 CmdArgs.push_back("-gcodeview");
5401
Reid Klecknerc542d372014-06-27 17:02:02 +00005402 const Driver &D = getToolChain().getDriver();
5403 EHFlags EH = parseClangCLEHFlags(D, Args);
5404 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005405 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005406 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005407 CmdArgs.push_back("-fexceptions");
5408 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005409
Hans Wennborge50cec32014-06-13 20:59:54 +00005410 // /EP should expand to -E -P.
5411 if (Args.hasArg(options::OPT__SLASH_EP)) {
5412 CmdArgs.push_back("-E");
5413 CmdArgs.push_back("-P");
5414 }
5415
David Majnemera5b195a2015-02-14 01:35:12 +00005416 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005417 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5418 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005419 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5420 else
5421 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5422
5423 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5424 VolatileOptionID = A->getOption().getID();
5425
5426 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5427 CmdArgs.push_back("-fms-volatile");
5428
David Majnemer86c318f2014-02-11 21:05:00 +00005429 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5430 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5431 if (MostGeneralArg && BestCaseArg)
5432 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5433 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5434
5435 if (MostGeneralArg) {
5436 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5437 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5438 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5439
5440 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5441 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5442 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5443 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5444 << FirstConflict->getAsString(Args)
5445 << SecondConflict->getAsString(Args);
5446
5447 if (SingleArg)
5448 CmdArgs.push_back("-fms-memptr-rep=single");
5449 else if (MultipleArg)
5450 CmdArgs.push_back("-fms-memptr-rep=multiple");
5451 else
5452 CmdArgs.push_back("-fms-memptr-rep=virtual");
5453 }
5454
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005455 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5456 A->render(Args, CmdArgs);
5457
Hans Wennborg81f74482013-09-10 01:07:07 +00005458 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5459 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005460 if (Args.hasArg(options::OPT__SLASH_fallback))
5461 CmdArgs.push_back("msvc-fallback");
5462 else
5463 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005464 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005465}
5466
Douglas Katzman95354292015-06-23 20:42:09 +00005467visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005468 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005469 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005470 return CLFallback.get();
5471}
5472
Daniel Sanders7f933f42015-01-30 17:35:23 +00005473void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5474 ArgStringList &CmdArgs) const {
5475 StringRef CPUName;
5476 StringRef ABIName;
5477 const llvm::Triple &Triple = getToolChain().getTriple();
5478 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5479
5480 CmdArgs.push_back("-target-abi");
5481 CmdArgs.push_back(ABIName.data());
5482}
5483
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005484void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005485 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005486 const ArgList &Args,
5487 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005488 ArgStringList CmdArgs;
5489
5490 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5491 const InputInfo &Input = Inputs[0];
5492
James Y Knight2db38f32015-08-15 03:45:25 +00005493 std::string TripleStr =
5494 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5495 const llvm::Triple Triple(TripleStr);
5496
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005497 // Don't warn about "clang -w -c foo.s"
5498 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005499 // and "clang -emit-llvm -c foo.s"
5500 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005501
Rafael Espindola577637a2015-01-03 00:06:04 +00005502 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005503
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005504 // Invoke ourselves in -cc1as mode.
5505 //
5506 // FIXME: Implement custom jobs for internal actions.
5507 CmdArgs.push_back("-cc1as");
5508
5509 // Add the "effective" target triple.
5510 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005511 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5512
5513 // Set the output mode, we currently only expect to be used as a real
5514 // assembler.
5515 CmdArgs.push_back("-filetype");
5516 CmdArgs.push_back("obj");
5517
Eric Christopher45f2e712012-12-18 00:31:10 +00005518 // Set the main file name, so that debug info works even with
5519 // -save-temps or preprocessed assembly.
5520 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005521 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005522
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005523 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005524 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005525 if (!CPU.empty()) {
5526 CmdArgs.push_back("-target-cpu");
5527 CmdArgs.push_back(Args.MakeArgString(CPU));
5528 }
5529
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005530 // Add the target features
5531 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00005532 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005533
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005534 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005535 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005536
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005537 // Pass along any -I options so we get proper .include search paths.
5538 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5539
Eric Christopherfc3ee562012-01-10 00:38:01 +00005540 // Determine the original source input.
5541 const Action *SourceAction = &JA;
5542 while (SourceAction->getKind() != Action::InputClass) {
5543 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5544 SourceAction = SourceAction->getInputs()[0];
5545 }
5546
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005547 // Forward -g and handle debug info related flags, assuming we are dealing
5548 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005549 if (SourceAction->getType() == types::TY_Asm ||
5550 SourceAction->getType() == types::TY_PP_Asm) {
5551 Args.ClaimAllArgs(options::OPT_g_Group);
5552 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
5553 if (!A->getOption().matches(options::OPT_g0))
5554 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005555
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005556 if (Args.hasArg(options::OPT_gdwarf_2))
5557 CmdArgs.push_back("-gdwarf-2");
5558 if (Args.hasArg(options::OPT_gdwarf_3))
5559 CmdArgs.push_back("-gdwarf-3");
5560 if (Args.hasArg(options::OPT_gdwarf_4))
5561 CmdArgs.push_back("-gdwarf-4");
5562
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005563 // Add the -fdebug-compilation-dir flag if needed.
5564 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005565
5566 // Set the AT_producer to the clang version when using the integrated
5567 // assembler on assembly source files.
5568 CmdArgs.push_back("-dwarf-debug-producer");
5569 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005570
5571 // And pass along -I options
5572 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005573 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005574
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005575 // Handle -fPIC et al -- the relocation-model affects the assembler
5576 // for some targets.
5577 llvm::Reloc::Model RelocationModel;
5578 unsigned PICLevel;
5579 bool IsPIE;
5580 std::tie(RelocationModel, PICLevel, IsPIE) =
5581 ParsePICArgs(getToolChain(), Triple, Args);
5582
5583 const char *RMName = RelocationModelName(RelocationModel);
5584 if (RMName) {
5585 CmdArgs.push_back("-mrelocation-model");
5586 CmdArgs.push_back(RMName);
5587 }
5588
Kevin Enderby292dc082011-12-22 19:31:58 +00005589 // Optionally embed the -cc1as level arguments into the debug info, for build
5590 // analysis.
5591 if (getToolChain().UseDwarfDebugFlags()) {
5592 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005593 for (const auto &Arg : Args)
5594 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005595
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005596 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005597 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5598 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005599 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005600 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005601 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005602 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005603 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005604 }
5605 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005606 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005607 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005608
5609 // FIXME: Add -static support, once we have it.
5610
Daniel Sanders7f933f42015-01-30 17:35:23 +00005611 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005612 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005613 default:
5614 break;
5615
5616 case llvm::Triple::mips:
5617 case llvm::Triple::mipsel:
5618 case llvm::Triple::mips64:
5619 case llvm::Triple::mips64el:
5620 AddMIPSTargetArgs(Args, CmdArgs);
5621 break;
5622 }
5623
David Blaikie372d9502014-01-17 03:17:40 +00005624 // Consume all the warning flags. Usually this would be handled more
5625 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5626 // doesn't handle that so rather than warning about unused flags that are
5627 // actually used, we'll lie by omission instead.
5628 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005629 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5630 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005631
David Blaikie9260ed62013-07-25 21:19:01 +00005632 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5633 getToolChain().getDriver());
5634
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005635 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005636
5637 assert(Output.isFilename() && "Unexpected lipo output.");
5638 CmdArgs.push_back("-o");
5639 CmdArgs.push_back(Output.getFilename());
5640
Daniel Dunbarb440f562010-08-02 02:38:21 +00005641 assert(Input.isFilename() && "Invalid input.");
5642 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005643
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005644 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005645 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005646
5647 // Handle the debug info splitting at object creation time if we're
5648 // creating an object.
5649 // TODO: Currently only works on linux with newer objcopy.
5650 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005651 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005652 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005653 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005654}
5655
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005656void GnuTool::anchor() {}
5657
Daniel Dunbara3246a02009-03-18 08:07:30 +00005658void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005659 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005660 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005661 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005662 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005663 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005664
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005665 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005666 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005667 // Don't forward any -g arguments to assembly steps.
5668 if (isa<AssembleJobAction>(JA) &&
5669 A->getOption().matches(options::OPT_g_Group))
5670 continue;
5671
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005672 // Don't forward any -W arguments to assembly and link steps.
5673 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5674 A->getOption().matches(options::OPT_W_Group))
5675 continue;
5676
Daniel Dunbar2da02722009-03-19 07:55:12 +00005677 // It is unfortunate that we have to claim here, as this means
5678 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005679 // platforms using a generic gcc, even if we are just using gcc
5680 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005681 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005682 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005683 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005684 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005685
Daniel Dunbar4e295052010-01-25 22:35:08 +00005686 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005687
5688 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005689 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005690 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005691 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005692 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005693 }
5694
Daniel Dunbar5716d872009-05-02 21:41:52 +00005695 // Try to force gcc to match the tool chain we want, if we recognize
5696 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005697 //
5698 // FIXME: The triple class should directly provide the information we want
5699 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005700 switch (getToolChain().getArch()) {
5701 default:
5702 break;
5703 case llvm::Triple::x86:
5704 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005705 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005706 break;
5707 case llvm::Triple::x86_64:
5708 case llvm::Triple::ppc64:
5709 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005710 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005711 break;
5712 case llvm::Triple::sparcel:
5713 CmdArgs.push_back("-EL");
5714 break;
5715 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005716
Daniel Dunbarb440f562010-08-02 02:38:21 +00005717 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005718 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005719 CmdArgs.push_back(Output.getFilename());
5720 } else {
5721 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005722 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005723 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005725 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005726
5727 // Only pass -x if gcc will understand it; otherwise hope gcc
5728 // understands the suffix correctly. The main use case this would go
5729 // wrong in is for linker inputs if they happened to have an odd
5730 // suffix; really the only way to get this to happen is a command
5731 // like '-x foobar a.c' which will treat a.c like a linker input.
5732 //
5733 // FIXME: For the linker case specifically, can we safely convert
5734 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005735 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005736 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00005737 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5738 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005739 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005740 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005741 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005743 else if (II.getType() == types::TY_ModuleFile)
5744 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005745 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005746
Daniel Dunbara3246a02009-03-18 08:07:30 +00005747 if (types::canTypeBeUserSpecified(II.getType())) {
5748 CmdArgs.push_back("-x");
5749 CmdArgs.push_back(types::getTypeName(II.getType()));
5750 }
5751
Daniel Dunbarb440f562010-08-02 02:38:21 +00005752 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005753 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005754 else {
5755 const Arg &A = II.getInputArg();
5756
5757 // Reverse translate some rewritten options.
5758 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5759 CmdArgs.push_back("-lstdc++");
5760 continue;
5761 }
5762
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005763 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00005764 A.render(Args, CmdArgs);
5765 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005766 }
5767
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005768 const std::string customGCCName = D.getCCCGenericGCCName();
5769 const char *GCCName;
5770 if (!customGCCName.empty())
5771 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00005772 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005773 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00005774 } else
5775 GCCName = "gcc";
5776
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005777 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005778 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005779}
5780
Douglas Katzman95354292015-06-23 20:42:09 +00005781void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
5782 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005783 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005784}
5785
Douglas Katzman95354292015-06-23 20:42:09 +00005786void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
5787 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005788 const Driver &D = getToolChain().getDriver();
5789
Eric Christophercc7ff502015-01-29 00:56:17 +00005790 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00005791 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00005792 case types::TY_LLVM_IR:
5793 case types::TY_LTO_IR:
5794 case types::TY_LLVM_BC:
5795 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005796 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00005797 break;
5798 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00005799 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00005800 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00005801 case types::TY_Nothing:
5802 CmdArgs.push_back("-fsyntax-only");
5803 break;
5804 default:
5805 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00005806 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005807}
5808
Douglas Katzman95354292015-06-23 20:42:09 +00005809void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
5810 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005811 // The types are (hopefully) good enough.
5812}
5813
Tony Linthicum76329bf2011-12-12 21:14:55 +00005814// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00005815void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
5816 ArgStringList &CmdArgs) const {}
5817void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
5818 const InputInfo &Output,
5819 const InputInfoList &Inputs,
5820 const ArgList &Args,
5821 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00005822 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005823
5824 const Driver &D = getToolChain().getDriver();
5825 ArgStringList CmdArgs;
5826
5827 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00005828 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005829 CmdArgs.push_back(Args.MakeArgString(MarchString));
5830
5831 RenderExtraToolArgs(JA, CmdArgs);
5832
5833 if (Output.isFilename()) {
5834 CmdArgs.push_back("-o");
5835 CmdArgs.push_back(Output.getFilename());
5836 } else {
5837 assert(Output.isNothing() && "Unexpected output");
5838 CmdArgs.push_back("-fsyntax-only");
5839 }
5840
Douglas Katzman54366072015-07-27 16:53:08 +00005841 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005842 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005844 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00005845
Tony Linthicum76329bf2011-12-12 21:14:55 +00005846 // Only pass -x if gcc will understand it; otherwise hope gcc
5847 // understands the suffix correctly. The main use case this would go
5848 // wrong in is for linker inputs if they happened to have an odd
5849 // suffix; really the only way to get this to happen is a command
5850 // like '-x foobar a.c' which will treat a.c like a linker input.
5851 //
5852 // FIXME: For the linker case specifically, can we safely convert
5853 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005854 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005855 // Don't try to pass LLVM or AST inputs to a generic gcc.
5856 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
5857 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
5858 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860 else if (II.getType() == types::TY_AST)
5861 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005862 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005863 else if (II.getType() == types::TY_ModuleFile)
5864 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005865 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00005866
5867 if (II.isFilename())
5868 CmdArgs.push_back(II.getFilename());
5869 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005870 // Don't render as input, we need gcc to do the translations.
5871 // FIXME: Pranav: What is this ?
Tony Linthicum76329bf2011-12-12 21:14:55 +00005872 II.getInputArg().render(Args, CmdArgs);
5873 }
5874
5875 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005876 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00005877 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00005878}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005879
Douglas Katzman95354292015-06-23 20:42:09 +00005880void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
5881 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005882 // The types are (hopefully) good enough.
5883}
5884
Douglas Katzman54366072015-07-27 16:53:08 +00005885static void
5886constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
5887 const toolchains::HexagonToolChain &ToolChain,
5888 const InputInfo &Output, const InputInfoList &Inputs,
5889 const ArgList &Args, ArgStringList &CmdArgs,
5890 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005891
Matthew Curtise689b052012-12-06 15:46:07 +00005892 const Driver &D = ToolChain.getDriver();
5893
Matthew Curtise689b052012-12-06 15:46:07 +00005894 //----------------------------------------------------------------------------
5895 //
5896 //----------------------------------------------------------------------------
5897 bool hasStaticArg = Args.hasArg(options::OPT_static);
5898 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005899 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00005900 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
5901 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
5902 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005903 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005904 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005905
Matthew Curtise689b052012-12-06 15:46:07 +00005906 //----------------------------------------------------------------------------
5907 // Silence warnings for various options
5908 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00005909
Matthew Curtise689b052012-12-06 15:46:07 +00005910 Args.ClaimAllArgs(options::OPT_g_Group);
5911 Args.ClaimAllArgs(options::OPT_emit_llvm);
5912 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
5913 // handled somewhere else.
5914 Args.ClaimAllArgs(options::OPT_static_libgcc);
5915
5916 //----------------------------------------------------------------------------
5917 //
5918 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005919 for (const auto &Opt : ToolChain.ExtraOpts)
5920 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005921
Douglas Katzman54366072015-07-27 16:53:08 +00005922 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00005923 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00005924
Matthew Curtise689b052012-12-06 15:46:07 +00005925 if (buildingLib) {
5926 CmdArgs.push_back("-shared");
5927 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
5928 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00005929 }
5930
Matthew Curtise689b052012-12-06 15:46:07 +00005931 if (hasStaticArg)
5932 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005933
Matthew Curtise8f80a12012-12-06 17:49:03 +00005934 if (buildPIE && !buildingLib)
5935 CmdArgs.push_back("-pie");
5936
Douglas Katzman54366072015-07-27 16:53:08 +00005937 if (const char *v =
5938 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00005939 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00005940 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00005941 }
5942
Matthew Curtise689b052012-12-06 15:46:07 +00005943 //----------------------------------------------------------------------------
5944 //
5945 //----------------------------------------------------------------------------
5946 CmdArgs.push_back("-o");
5947 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00005948
Matthew Curtise689b052012-12-06 15:46:07 +00005949 const std::string MarchSuffix = "/" + MarchString;
5950 const std::string G0Suffix = "/G0";
5951 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Samuel Antaoc909c992014-11-07 17:48:03 +00005952 const std::string RootDir =
Douglas Katzman54366072015-07-27 16:53:08 +00005953 toolchains::HexagonToolChain::GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005954 const std::string StartFilesDir =
5955 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00005956
5957 //----------------------------------------------------------------------------
5958 // moslib
5959 //----------------------------------------------------------------------------
5960 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00005962
Sean Silva14facf32015-06-09 01:57:17 +00005963 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
5964 A->claim();
5965 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00005966 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005967 }
Matthew Curtise689b052012-12-06 15:46:07 +00005968 if (oslibs.empty()) {
5969 oslibs.push_back("standalone");
5970 hasStandalone = true;
5971 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005972
Matthew Curtise689b052012-12-06 15:46:07 +00005973 //----------------------------------------------------------------------------
5974 // Start Files
5975 //----------------------------------------------------------------------------
5976 if (incStdLib && incStartFiles) {
5977
5978 if (!buildingLib) {
5979 if (hasStandalone) {
5980 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00005982 }
5983 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
5984 }
5985 std::string initObj = useShared ? "/initS.o" : "/init.o";
5986 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
5987 }
5988
5989 //----------------------------------------------------------------------------
5990 // Library Search Paths
5991 //----------------------------------------------------------------------------
5992 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005993 for (const auto &LibPath : LibPaths)
5994 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00005995
5996 //----------------------------------------------------------------------------
5997 //
5998 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00005999 Args.AddAllArgs(CmdArgs,
6000 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6001 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006002
6003 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6004
6005 //----------------------------------------------------------------------------
6006 // Libraries
6007 //----------------------------------------------------------------------------
6008 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006009 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006010 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6011 CmdArgs.push_back("-lm");
6012 }
6013
6014 CmdArgs.push_back("--start-group");
6015
6016 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006017 for (const std::string &Lib : oslibs)
6018 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006019 CmdArgs.push_back("-lc");
6020 }
6021 CmdArgs.push_back("-lgcc");
6022
6023 CmdArgs.push_back("--end-group");
6024 }
6025
6026 //----------------------------------------------------------------------------
6027 // End files
6028 //----------------------------------------------------------------------------
6029 if (incStdLib && incStartFiles) {
6030 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6031 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6032 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006033}
6034
Douglas Katzman95354292015-06-23 20:42:09 +00006035void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6036 const InputInfo &Output,
6037 const InputInfoList &Inputs,
6038 const ArgList &Args,
6039 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006040
Douglas Katzman54366072015-07-27 16:53:08 +00006041 const toolchains::HexagonToolChain &ToolChain =
6042 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006043
6044 ArgStringList CmdArgs;
6045 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6046 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006047
6048 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006049 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006050 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006051}
6052// Hexagon tools end.
6053
Tom Stellard8fa33092015-07-18 01:49:05 +00006054void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6055 const InputInfo &Output,
6056 const InputInfoList &Inputs,
6057 const ArgList &Args,
6058 const char *LinkingOutput) const {
6059
6060 std::string Linker = getToolChain().GetProgramPath(getShortName());
6061 ArgStringList CmdArgs;
6062 CmdArgs.push_back("-flavor");
6063 CmdArgs.push_back("gnu");
6064 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006065 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006066 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6067 CmdArgs.push_back("-o");
6068 CmdArgs.push_back(Output.getFilename());
6069 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6070 CmdArgs, Inputs));
6071}
6072// AMDGPU tools end.
6073
Renato Golin7c542b42015-07-27 23:44:45 +00006074const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006075 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006076 if (!Arch.empty())
6077 MArch = Arch;
6078 else
Bernard Ogden31561762013-12-12 13:27:11 +00006079 MArch = Triple.getArchName();
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006080 MArch = StringRef(MArch).lower();
John Brawn94fd9632015-05-21 12:19:49 +00006081
6082 // Handle -march=native.
6083 if (MArch == "native") {
6084 std::string CPU = llvm::sys::getHostCPUName();
6085 if (CPU != "generic") {
6086 // Translate the native cpu into the architecture suffix for that CPU.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006087 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch);
John Brawn94fd9632015-05-21 12:19:49 +00006088 // If there is no valid architecture suffix for this CPU we don't know how
6089 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006090 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006091 MArch = "";
6092 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006093 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006094 }
6095 }
6096
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006097 return MArch;
6098}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006099
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006100/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006101StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006102 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006103 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6104 // here means an -march=native that we can't handle, so instead return no CPU.
6105 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006106 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006107
John Brawna95c1a82015-05-08 12:52:18 +00006108 // We need to return an empty string here on invalid MArch values as the
6109 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006110 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006111}
6112
6113/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006114std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006115 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006116 // FIXME: Warn on inconsistent use of -mcpu and -march.
6117 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006118 if (!CPU.empty()) {
6119 std::string MCPU = StringRef(CPU).lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006120 // Handle -mcpu=native.
6121 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006122 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006123 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006124 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006125 }
6126
Renato Goline17c5802015-07-27 23:44:42 +00006127 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006128}
6129
6130/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006131/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006132// FIXME: This is redundant with -mcpu, why does LLVM use this.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006133StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch) {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00006134 if (CPU == "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006135 return llvm::ARM::getSubArch(
6136 llvm::ARM::parseArch(Arch));
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006137
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006138 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin3c007252015-05-28 15:05:53 +00006139 if (ArchKind == llvm::ARM::AK_INVALID)
6140 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006141 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006142}
6143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006144void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006145 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006146 if (Args.hasArg(options::OPT_r))
6147 return;
6148
John Brawn94fd9632015-05-21 12:19:49 +00006149 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6150 // to generate BE-8 executables.
6151 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6152 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006153}
6154
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006155mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
6156 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6157 .Case("mips1", NanLegacy)
6158 .Case("mips2", NanLegacy)
6159 .Case("mips3", NanLegacy)
6160 .Case("mips4", NanLegacy)
6161 .Case("mips5", NanLegacy)
6162 .Case("mips32", NanLegacy)
6163 .Case("mips32r2", NanLegacy)
6164 .Case("mips32r3", NanLegacy | Nan2008)
6165 .Case("mips32r5", NanLegacy | Nan2008)
6166 .Case("mips32r6", Nan2008)
6167 .Case("mips64", NanLegacy)
6168 .Case("mips64r2", NanLegacy)
6169 .Case("mips64r3", NanLegacy | Nan2008)
6170 .Case("mips64r5", NanLegacy | Nan2008)
6171 .Case("mips64r6", Nan2008)
6172 .Default(NanLegacy);
6173}
6174
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006175bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6176 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6177 return A && (A->getValue() == StringRef(Value));
6178}
6179
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006180bool mips::isUCLibc(const ArgList &Args) {
6181 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006182 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006183}
6184
Daniel Sanders2bf13662014-07-10 14:40:57 +00006185bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006186 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6187 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006188 .Case("2008", true)
6189 .Case("legacy", false)
6190 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006191
6192 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006193 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006194 .Cases("mips32r6", "mips64r6", true)
6195 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006196
6197 return false;
6198}
6199
Daniel Sanders379d44b2014-07-16 11:52:23 +00006200bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Toma Tabacu94ea6862015-06-16 13:54:13 +00006201 StringRef ABIName, StringRef FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006202 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006203 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006204 return false;
6205
6206 if (ABIName != "32")
6207 return false;
6208
Toma Tabacu94ea6862015-06-16 13:54:13 +00006209 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6210 // present.
6211 if (FloatABI == "soft")
6212 return false;
6213
Daniel Sanders379d44b2014-07-16 11:52:23 +00006214 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006215 .Cases("mips2", "mips3", "mips4", "mips5", true)
6216 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6217 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6218 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006219}
6220
Toma Tabacu94ea6862015-06-16 13:54:13 +00006221bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6222 StringRef CPUName, StringRef ABIName,
6223 StringRef FloatABI) {
6224 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6225
6226 // FPXX shouldn't be used if -msingle-float is present.
6227 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6228 options::OPT_mdouble_float))
6229 if (A->getOption().matches(options::OPT_msingle_float))
6230 UseFPXX = false;
6231
6232 return UseFPXX;
6233}
6234
Tim Northover157d9112014-01-16 08:48:16 +00006235llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006236 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6237 // archs which Darwin doesn't use.
6238
6239 // The matching this routine does is fairly pointless, since it is neither the
6240 // complete architecture list, nor a reasonable subset. The problem is that
6241 // historically the driver driver accepts this and also ties its -march=
6242 // handling to the architecture name, so we need to be careful before removing
6243 // support for it.
6244
6245 // This code must be kept in sync with Clang's Darwin specific argument
6246 // translation.
6247
6248 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006249 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6250 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6251 .Case("ppc64", llvm::Triple::ppc64)
6252 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6253 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6254 llvm::Triple::x86)
6255 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6256 // This is derived from the driver driver.
6257 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6258 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6259 .Cases("armv7s", "xscale", llvm::Triple::arm)
6260 .Case("arm64", llvm::Triple::aarch64)
6261 .Case("r600", llvm::Triple::r600)
6262 .Case("amdgcn", llvm::Triple::amdgcn)
6263 .Case("nvptx", llvm::Triple::nvptx)
6264 .Case("nvptx64", llvm::Triple::nvptx64)
6265 .Case("amdil", llvm::Triple::amdil)
6266 .Case("spir", llvm::Triple::spir)
6267 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006268}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006269
Tim Northover157d9112014-01-16 08:48:16 +00006270void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006271 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006272 T.setArch(Arch);
6273
6274 if (Str == "x86_64h")
6275 T.setArchName(Str);
6276 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6277 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006278 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006279 }
6280}
6281
Bob Wilsondecc03e2012-11-23 06:14:39 +00006282const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006283 const InputInfo &Input) {
6284 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006285}
6286
Bob Wilsondecc03e2012-11-23 06:14:39 +00006287const char *Clang::getBaseInputStem(const ArgList &Args,
6288 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006289 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006290
Chris Lattner906bb902011-01-16 08:14:11 +00006291 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006292 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006293
6294 return Str;
6295}
6296
Bob Wilsondecc03e2012-11-23 06:14:39 +00006297const char *Clang::getDependencyFileName(const ArgList &Args,
6298 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006299 // FIXME: Think about this more.
6300 std::string Res;
6301
6302 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006303 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006304 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006305 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006306 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006307 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006308 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006309}
6310
Douglas Katzman95354292015-06-23 20:42:09 +00006311void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6312 const InputInfo &Output,
6313 const InputInfoList &Inputs,
6314 const ArgList &Args,
6315 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006316 const ToolChain &ToolChain = getToolChain();
6317 const Driver &D = ToolChain.getDriver();
6318 ArgStringList CmdArgs;
6319
6320 // Silence warning for "clang -g foo.o -o foo"
6321 Args.ClaimAllArgs(options::OPT_g_Group);
6322 // and "clang -emit-llvm foo.o -o foo"
6323 Args.ClaimAllArgs(options::OPT_emit_llvm);
6324 // and for "clang -w foo.o -o foo". Other warning options are already
6325 // handled somewhere else.
6326 Args.ClaimAllArgs(options::OPT_w);
6327
6328 if (!D.SysRoot.empty())
6329 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6330
6331 // CloudABI only supports static linkage.
6332 CmdArgs.push_back("-Bstatic");
6333 CmdArgs.push_back("--eh-frame-hdr");
6334 CmdArgs.push_back("--gc-sections");
6335
6336 if (Output.isFilename()) {
6337 CmdArgs.push_back("-o");
6338 CmdArgs.push_back(Output.getFilename());
6339 } else {
6340 assert(Output.isNothing() && "Invalid output.");
6341 }
6342
6343 if (!Args.hasArg(options::OPT_nostdlib) &&
6344 !Args.hasArg(options::OPT_nostartfiles)) {
6345 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6347 }
6348
6349 Args.AddAllArgs(CmdArgs, options::OPT_L);
6350 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
6351 for (const auto &Path : Paths)
6352 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006353 Args.AddAllArgs(CmdArgs,
6354 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6355 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006356
Alexey Samsonov907880e2015-06-19 19:57:46 +00006357 if (D.IsUsingLTO(Args))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006358 AddGoldPlugin(ToolChain, Args, CmdArgs);
6359
6360 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6361
6362 if (!Args.hasArg(options::OPT_nostdlib) &&
6363 !Args.hasArg(options::OPT_nodefaultlibs)) {
6364 if (D.CCCIsCXX())
6365 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6366 CmdArgs.push_back("-lc");
6367 CmdArgs.push_back("-lcompiler_rt");
6368 }
6369
6370 if (!Args.hasArg(options::OPT_nostdlib) &&
6371 !Args.hasArg(options::OPT_nostartfiles))
6372 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6373
6374 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006375 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006376}
6377
Douglas Katzman95354292015-06-23 20:42:09 +00006378void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6379 const InputInfo &Output,
6380 const InputInfoList &Inputs,
6381 const ArgList &Args,
6382 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006383 ArgStringList CmdArgs;
6384
6385 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6386 const InputInfo &Input = Inputs[0];
6387
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006388 // Determine the original source input.
6389 const Action *SourceAction = &JA;
6390 while (SourceAction->getKind() != Action::InputClass) {
6391 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6392 SourceAction = SourceAction->getInputs()[0];
6393 }
6394
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006395 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006396 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006397 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6398 // FIXME: at run-time detect assembler capabilities or rely on version
6399 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006400 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006401 const llvm::Triple &T(getToolChain().getTriple());
6402 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006403 CmdArgs.push_back("-Q");
6404 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006405
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006406 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006407 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006408 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006409 if (Args.hasArg(options::OPT_gstabs))
6410 CmdArgs.push_back("--gstabs");
6411 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006412 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006413 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006414
Daniel Dunbarbe220842009-03-20 16:06:39 +00006415 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006416 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006417
Daniel Dunbar6d484762010-07-22 01:47:22 +00006418 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006419 if (getToolChain().getArch() == llvm::Triple::x86 ||
6420 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006421 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6422 CmdArgs.push_back("-force_cpusubtype_ALL");
6423
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006424 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006425 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006426 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006427 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006428 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006429 CmdArgs.push_back("-static");
6430
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006431 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006432
6433 assert(Output.isFilename() && "Unexpected lipo output.");
6434 CmdArgs.push_back("-o");
6435 CmdArgs.push_back(Output.getFilename());
6436
Daniel Dunbarb440f562010-08-02 02:38:21 +00006437 assert(Input.isFilename() && "Invalid input.");
6438 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006439
6440 // asm_final spec is empty.
6441
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006442 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006443 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006444}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006445
Tim Northover157d9112014-01-16 08:48:16 +00006446void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006447
Tim Northover157d9112014-01-16 08:48:16 +00006448void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6449 ArgStringList &CmdArgs) const {
6450 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006451
Daniel Dunbarc1964212009-03-26 16:23:12 +00006452 // Derived from darwin_arch spec.
6453 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006454 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006455
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006456 // FIXME: Is this needed anymore?
6457 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006458 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006459}
6460
Douglas Katzman95354292015-06-23 20:42:09 +00006461bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006462 // We only need to generate a temp path for LTO if we aren't compiling object
6463 // files. When compiling source files, we run 'dsymutil' after linking. We
6464 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006465 for (const auto &Input : Inputs)
6466 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006467 return true;
6468
6469 return false;
6470}
6471
Douglas Katzman95354292015-06-23 20:42:09 +00006472void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6473 ArgStringList &CmdArgs,
6474 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006475 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006476 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006477
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006478 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006479 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6480 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006481 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6482 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006483 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006484 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006485 }
6486
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006487 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006488 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006489 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6490 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006491
Bob Wilson3d27dad2013-08-02 22:25:34 +00006492 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6493 CmdArgs.push_back("-export_dynamic");
6494
Bob Wilsonb111ec92015-03-02 19:01:14 +00006495 // If we are using App Extension restrictions, pass a flag to the linker
6496 // telling it that the compiled code has been audited.
6497 if (Args.hasFlag(options::OPT_fapplication_extension,
6498 options::OPT_fno_application_extension, false))
6499 CmdArgs.push_back("-application_extension");
6500
Bill Wendling313b6bf2012-11-16 23:03:00 +00006501 // If we are using LTO, then automatically create a temporary file path for
6502 // the linker to use, so that it's lifetime will extend past a possible
6503 // dsymutil step.
Alexey Samsonov907880e2015-06-19 19:57:46 +00006504 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Bill Wendling313b6bf2012-11-16 23:03:00 +00006505 const char *TmpPath = C.getArgs().MakeArgString(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006506 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Bill Wendling313b6bf2012-11-16 23:03:00 +00006507 C.addTempFile(TmpPath);
6508 CmdArgs.push_back("-object_path_lto");
6509 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00006510 }
6511
Daniel Dunbarc1964212009-03-26 16:23:12 +00006512 // Derived from the "link" spec.
6513 Args.AddAllArgs(CmdArgs, options::OPT_static);
6514 if (!Args.hasArg(options::OPT_static))
6515 CmdArgs.push_back("-dynamic");
6516 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6517 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6518 // here. How do we wish to handle such things?
6519 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006520
Daniel Dunbarc1964212009-03-26 16:23:12 +00006521 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006522 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006523 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006524 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006525
6526 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6527 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6528 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6529
6530 Arg *A;
6531 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6532 (A = Args.getLastArg(options::OPT_current__version)) ||
6533 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006534 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6535 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006536
6537 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6538 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6539 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6540 } else {
6541 CmdArgs.push_back("-dylib");
6542
6543 Arg *A;
6544 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6545 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6546 (A = Args.getLastArg(options::OPT_client__name)) ||
6547 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6548 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6549 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006550 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6551 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006552
Daniel Dunbarc1964212009-03-26 16:23:12 +00006553 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6554 "-dylib_compatibility_version");
6555 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6556 "-dylib_current_version");
6557
Tim Northover157d9112014-01-16 08:48:16 +00006558 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006559
6560 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6561 "-dylib_install_name");
6562 }
6563
6564 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6565 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6566 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006567 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006568 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006569 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6570 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6571 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6572 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6573 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6574 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006575 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006576 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6577 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6578 Args.AddAllArgs(CmdArgs, options::OPT_init);
6579
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006580 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006581 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006582
Daniel Dunbarc1964212009-03-26 16:23:12 +00006583 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6584 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6585 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6586 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6587 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006588
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006589 if (const Arg *A =
6590 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6591 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006592 if (A->getOption().matches(options::OPT_fpie) ||
6593 A->getOption().matches(options::OPT_fPIE))
6594 CmdArgs.push_back("-pie");
6595 else
6596 CmdArgs.push_back("-no_pie");
6597 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006598
6599 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6600 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6601 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6602 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6603 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6604 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6605 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6606 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6607 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6608 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6609 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6610 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6611 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6612 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6613 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6614 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006615
Daniel Dunbar84384642011-05-02 21:03:47 +00006616 // Give --sysroot= preference, over the Apple specific behavior to also use
6617 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006618 StringRef sysroot = C.getSysRoot();
6619 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006620 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006621 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006622 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6623 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006624 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006625 }
6626
Daniel Dunbarc1964212009-03-26 16:23:12 +00006627 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6628 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6629 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6630 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6631 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006632 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006633 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6634 Args.AddAllArgs(CmdArgs, options::OPT_y);
6635 Args.AddLastArg(CmdArgs, options::OPT_w);
6636 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6637 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6638 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6639 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6640 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6641 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6642 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6643 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6644 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6645 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6646 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6647 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6648}
6649
Douglas Katzman95354292015-06-23 20:42:09 +00006650void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6651 const InputInfo &Output,
6652 const InputInfoList &Inputs,
6653 const ArgList &Args,
6654 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006655 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006656
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006657 // If the number of arguments surpasses the system limits, we will encode the
6658 // input files in a separate file, shortening the command line. To this end,
6659 // build a list of input file names that can be passed via a file with the
6660 // -filelist linker option.
6661 llvm::opt::ArgStringList InputFileList;
6662
Daniel Dunbarc1964212009-03-26 16:23:12 +00006663 // The logic here is derived from gcc's behavior; most of which
6664 // comes from specs (starting with link_command). Consult gcc for
6665 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006666 ArgStringList CmdArgs;
6667
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006668 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6669 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6670 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006671 for (const auto &Arg : Args)
6672 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006673 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006674 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006675 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006676 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006677 return;
6678 }
6679
Daniel Dunbarc1964212009-03-26 16:23:12 +00006680 // I'm not sure why this particular decomposition exists in gcc, but
6681 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006682 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006683
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006684 // It seems that the 'e' option is completely ignored for dynamic executables
6685 // (the default), and with static executables, the last one wins, as expected.
6686 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6687 options::OPT_Z_Flag, options::OPT_u_Group,
6688 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006689
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006690 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6691 // members of static archive libraries which implement Objective-C classes or
6692 // categories.
6693 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6694 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006695
Daniel Dunbarc1964212009-03-26 16:23:12 +00006696 CmdArgs.push_back("-o");
6697 CmdArgs.push_back(Output.getFilename());
6698
Chad Rosier06fd3c62012-05-16 23:45:12 +00006699 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00006700 !Args.hasArg(options::OPT_nostartfiles))
6701 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006702
Peter Collingbournec4122c12015-06-15 21:08:13 +00006703 // SafeStack requires its own runtime libraries
6704 // These libraries should be linked first, to make sure the
6705 // __safestack_init constructor executes before everything else
6706 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6707 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6708 "libclang_rt.safestack_osx.a",
6709 /*AlwaysLink=*/true);
6710 }
6711
Daniel Dunbarc1964212009-03-26 16:23:12 +00006712 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006713
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006714 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
6715 options::OPT_fno_openmp, false)) {
6716 switch (getOpenMPRuntime(getToolChain(), Args)) {
6717 case OMPRT_OMP:
6718 CmdArgs.push_back("-lomp");
6719 break;
6720 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00006721 CmdArgs.push_back("-lgomp");
6722 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006723 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00006724 CmdArgs.push_back("-liomp5");
6725 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00006726 case OMPRT_Unknown:
6727 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00006728 break;
6729 }
Alexey Bataev186b28a2014-03-06 05:43:53 +00006730 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006731
Douglas Gregor9295df02012-05-15 21:00:27 +00006732 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006733 // Build the input file for -filelist (list of linker input files) in case we
6734 // need it later
6735 for (const auto &II : Inputs) {
6736 if (!II.isFilename()) {
6737 // This is a linker input argument.
6738 // We cannot mix input arguments and file names in a -filelist input, thus
6739 // we prematurely stop our list (remaining files shall be passed as
6740 // arguments).
6741 if (InputFileList.size() > 0)
6742 break;
6743
6744 continue;
6745 }
6746
6747 InputFileList.push_back(II.getFilename());
6748 }
6749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006750 if (isObjCRuntimeLinked(Args) && !Args.hasArg(options::OPT_nostdlib) &&
Bob Wilson16d93952012-05-15 18:57:39 +00006751 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006752 // We use arclite library for both ARC and subscripting support.
6753 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6754
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006755 CmdArgs.push_back("-framework");
6756 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00006757 // Link libobj.
6758 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00006759 }
John McCall31168b02011-06-15 23:02:42 +00006760
Daniel Dunbarc1964212009-03-26 16:23:12 +00006761 if (LinkingOutput) {
6762 CmdArgs.push_back("-arch_multiple");
6763 CmdArgs.push_back("-final_output");
6764 CmdArgs.push_back(LinkingOutput);
6765 }
6766
Daniel Dunbarc1964212009-03-26 16:23:12 +00006767 if (Args.hasArg(options::OPT_fnested_functions))
6768 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006769
Justin Bognerc7701242015-05-12 05:44:36 +00006770 // TODO: It would be nice to use addProfileRT() here, but darwin's compiler-rt
6771 // paths are different enough from other toolchains that this needs a fair
6772 // amount of refactoring done first.
6773 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
6774
Daniel Dunbarc1964212009-03-26 16:23:12 +00006775 if (!Args.hasArg(options::OPT_nostdlib) &&
6776 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006777 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006778 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00006779
Daniel Dunbarc1964212009-03-26 16:23:12 +00006780 // link_ssp spec is empty.
6781
Daniel Dunbar26d482a2009-09-18 08:15:03 +00006782 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00006783 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006784 }
6785
Chad Rosier06fd3c62012-05-16 23:45:12 +00006786 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00006787 !Args.hasArg(options::OPT_nostartfiles)) {
6788 // endfile_spec is empty.
6789 }
6790
6791 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6792 Args.AddAllArgs(CmdArgs, options::OPT_F);
6793
Steven Wu3ffb61b2015-02-06 18:08:29 +00006794 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00006795 for (const Arg *A : Args.filtered(options::OPT_iframework))
6796 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00006797
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00006798 if (!Args.hasArg(options::OPT_nostdlib) &&
6799 !Args.hasArg(options::OPT_nodefaultlibs)) {
6800 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
6801 if (A->getValue() == StringRef("Accelerate")) {
6802 CmdArgs.push_back("-framework");
6803 CmdArgs.push_back("Accelerate");
6804 }
6805 }
6806 }
6807
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006808 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006809 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00006810 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006811 Cmd->setInputFileList(std::move(InputFileList));
6812 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00006813}
6814
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006815void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006816 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006817 const InputInfoList &Inputs,
6818 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006819 const char *LinkingOutput) const {
6820 ArgStringList CmdArgs;
6821
6822 CmdArgs.push_back("-create");
6823 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006824
6825 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006826 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00006827
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006828 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006829 assert(II.isFilename() && "Unexpected lipo input.");
6830 CmdArgs.push_back(II.getFilename());
6831 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006832
6833 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006834 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006835}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006836
Daniel Dunbar88299622010-06-04 18:28:36 +00006837void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006838 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00006839 const InputInfoList &Inputs,
6840 const ArgList &Args,
6841 const char *LinkingOutput) const {
6842 ArgStringList CmdArgs;
6843
Daniel Dunbareb86b042011-05-09 17:23:16 +00006844 CmdArgs.push_back("-o");
6845 CmdArgs.push_back(Output.getFilename());
6846
Daniel Dunbar88299622010-06-04 18:28:36 +00006847 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6848 const InputInfo &Input = Inputs[0];
6849 assert(Input.isFilename() && "Unexpected dsymutil input.");
6850 CmdArgs.push_back(Input.getFilename());
6851
Daniel Dunbar88299622010-06-04 18:28:36 +00006852 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006853 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00006855}
6856
Eric Christopher551ef452011-08-23 17:56:55 +00006857void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00006858 const InputInfo &Output,
6859 const InputInfoList &Inputs,
6860 const ArgList &Args,
6861 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00006862 ArgStringList CmdArgs;
6863 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00006864 CmdArgs.push_back("--debug-info");
6865 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00006866 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00006867
6868 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
6869 const InputInfo &Input = Inputs[0];
6870 assert(Input.isFilename() && "Unexpected verify input");
6871
6872 // Grabbing the output of the earlier dsymutil run.
6873 CmdArgs.push_back(Input.getFilename());
6874
6875 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006876 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006877 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00006878}
6879
Douglas Katzman95354292015-06-23 20:42:09 +00006880void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00006881 const InputInfo &Output,
6882 const InputInfoList &Inputs,
6883 const ArgList &Args,
6884 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006885 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00006886 ArgStringList CmdArgs;
6887
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006888 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00006889
6890 CmdArgs.push_back("-o");
6891 CmdArgs.push_back(Output.getFilename());
6892
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006893 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00006894 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00006895
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006896 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006897 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006898}
6899
Douglas Katzman95354292015-06-23 20:42:09 +00006900void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6901 const InputInfo &Output,
6902 const InputInfoList &Inputs,
6903 const ArgList &Args,
6904 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00006905 ArgStringList CmdArgs;
6906
David Chisnall272a0712012-02-29 15:06:12 +00006907 // Demangle C++ names in errors
6908 CmdArgs.push_back("-C");
6909
David Chisnallf571cde2012-02-15 13:39:01 +00006910 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6911 (!Args.hasArg(options::OPT_shared))) {
6912 CmdArgs.push_back("-e");
6913 CmdArgs.push_back("_start");
6914 }
6915
6916 if (Args.hasArg(options::OPT_static)) {
6917 CmdArgs.push_back("-Bstatic");
6918 CmdArgs.push_back("-dn");
6919 } else {
6920 CmdArgs.push_back("-Bdynamic");
6921 if (Args.hasArg(options::OPT_shared)) {
6922 CmdArgs.push_back("-shared");
6923 } else {
6924 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006925 CmdArgs.push_back(
6926 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00006927 }
6928 }
6929
6930 if (Output.isFilename()) {
6931 CmdArgs.push_back("-o");
6932 CmdArgs.push_back(Output.getFilename());
6933 } else {
6934 assert(Output.isNothing() && "Invalid output.");
6935 }
6936
6937 if (!Args.hasArg(options::OPT_nostdlib) &&
6938 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006939 if (!Args.hasArg(options::OPT_shared))
6940 CmdArgs.push_back(
6941 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6942
6943 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6944 CmdArgs.push_back(
6945 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
6946 CmdArgs.push_back(
6947 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6948
Hans Wennborg70850d82013-07-18 20:29:38 +00006949 if (getToolChain().getDriver().CCCIsCXX())
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006950 CmdArgs.push_back(
6951 Args.MakeArgString(getToolChain().GetFilePath("cxa_finalize.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006952 }
6953
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006954 const ToolChain::path_list &Paths = getToolChain().getFilePaths();
6955 for (const auto &Path : Paths)
6956 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
David Chisnallf571cde2012-02-15 13:39:01 +00006957
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006958 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
6959 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00006960
6961 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6962
6963 if (!Args.hasArg(options::OPT_nostdlib) &&
6964 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006965 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00006966 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00006967 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006968 if (!Args.hasArg(options::OPT_shared)) {
6969 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00006970 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00006971 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00006972 }
David Chisnallf571cde2012-02-15 13:39:01 +00006973 }
6974
6975 if (!Args.hasArg(options::OPT_nostdlib) &&
6976 !Args.hasArg(options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006977 CmdArgs.push_back(
6978 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006979 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00006980 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00006981
Alexey Samsonov7811d192014-02-20 13:57:37 +00006982 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00006983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006984 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006985 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00006986}
6987
Douglas Katzman95354292015-06-23 20:42:09 +00006988void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6989 const InputInfo &Output,
6990 const InputInfoList &Inputs,
6991 const ArgList &Args,
6992 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006993 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006994 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00006995 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006996
Rafael Espindolacc126272014-02-28 01:55:21 +00006997 switch (getToolChain().getArch()) {
6998 case llvm::Triple::x86:
6999 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7000 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007001 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007002 break;
7003
7004 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007005 CmdArgs.push_back("-mppc");
7006 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007007 break;
7008
7009 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007010 case llvm::Triple::sparcel:
Rafael Espindolacc126272014-02-28 01:55:21 +00007011 CmdArgs.push_back("-32");
7012 NeedsKPIC = true;
7013 break;
7014
7015 case llvm::Triple::sparcv9:
7016 CmdArgs.push_back("-64");
7017 CmdArgs.push_back("-Av9a");
7018 NeedsKPIC = true;
7019 break;
7020
7021 case llvm::Triple::mips64:
7022 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007023 StringRef CPUName;
7024 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007025 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007026
7027 CmdArgs.push_back("-mabi");
7028 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7029
7030 if (getToolChain().getArch() == llvm::Triple::mips64)
7031 CmdArgs.push_back("-EB");
7032 else
7033 CmdArgs.push_back("-EL");
7034
Rafael Espindolacc126272014-02-28 01:55:21 +00007035 NeedsKPIC = true;
7036 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007037 }
7038
Rafael Espindolacc126272014-02-28 01:55:21 +00007039 default:
7040 break;
7041 }
7042
7043 if (NeedsKPIC)
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007044 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007045
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007046 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007047
7048 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007049 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007050
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007051 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007052 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007053
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007054 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007055 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007056}
7057
Douglas Katzman95354292015-06-23 20:42:09 +00007058void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7059 const InputInfo &Output,
7060 const InputInfoList &Inputs,
7061 const ArgList &Args,
7062 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007063 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007064 ArgStringList CmdArgs;
7065
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007066 // Silence warning for "clang -g foo.o -o foo"
7067 Args.ClaimAllArgs(options::OPT_g_Group);
7068 // and "clang -emit-llvm foo.o -o foo"
7069 Args.ClaimAllArgs(options::OPT_emit_llvm);
7070 // and for "clang -w foo.o -o foo". Other warning options are already
7071 // handled somewhere else.
7072 Args.ClaimAllArgs(options::OPT_w);
7073
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007074 if (getToolChain().getArch() == llvm::Triple::mips64)
7075 CmdArgs.push_back("-EB");
7076 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7077 CmdArgs.push_back("-EL");
7078
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007079 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007080 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007081 CmdArgs.push_back("-e");
7082 CmdArgs.push_back("__start");
7083 }
7084
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007085 if (Args.hasArg(options::OPT_static)) {
7086 CmdArgs.push_back("-Bstatic");
7087 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007088 if (Args.hasArg(options::OPT_rdynamic))
7089 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007090 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007091 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007092 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007093 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007094 } else {
7095 CmdArgs.push_back("-dynamic-linker");
7096 CmdArgs.push_back("/usr/libexec/ld.so");
7097 }
7098 }
7099
Rafael Espindola044f7832013-06-05 04:28:55 +00007100 if (Args.hasArg(options::OPT_nopie))
7101 CmdArgs.push_back("-nopie");
7102
Daniel Dunbarb440f562010-08-02 02:38:21 +00007103 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007104 CmdArgs.push_back("-o");
7105 CmdArgs.push_back(Output.getFilename());
7106 } else {
7107 assert(Output.isNothing() && "Invalid output.");
7108 }
7109
7110 if (!Args.hasArg(options::OPT_nostdlib) &&
7111 !Args.hasArg(options::OPT_nostartfiles)) {
7112 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007113 if (Args.hasArg(options::OPT_pg))
7114 CmdArgs.push_back(
7115 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007116 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007117 CmdArgs.push_back(
7118 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7119 CmdArgs.push_back(
7120 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007121 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007122 CmdArgs.push_back(
7123 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007124 }
7125 }
7126
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007127 std::string Triple = getToolChain().getTripleString();
7128 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007129 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007130 CmdArgs.push_back(
7131 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007132
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007133 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7134 options::OPT_e, options::OPT_s, options::OPT_t,
7135 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007136
Daniel Dunbar54423b22010-09-17 00:24:54 +00007137 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007138
7139 if (!Args.hasArg(options::OPT_nostdlib) &&
7140 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007141 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007142 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007143 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007144 CmdArgs.push_back("-lm_p");
7145 else
7146 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007147 }
7148
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007149 // FIXME: For some reason GCC passes -lgcc before adding
7150 // the default system libraries. Just mimic this for now.
7151 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007152
Eric Christopher17674ec2012-09-13 06:32:34 +00007153 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007154 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7155 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007156 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007157 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007158 }
7159
Chandler Carruth45661652011-12-17 22:32:42 +00007160 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007161 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007162 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007163 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007164 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007165 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007166
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007167 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007168 }
7169
7170 if (!Args.hasArg(options::OPT_nostdlib) &&
7171 !Args.hasArg(options::OPT_nostartfiles)) {
7172 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007173 CmdArgs.push_back(
7174 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007175 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007176 CmdArgs.push_back(
7177 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007178 }
7179
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007180 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007181 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007182}
Ed Schoutene33194b2009-04-02 19:13:12 +00007183
Douglas Katzman95354292015-06-23 20:42:09 +00007184void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7185 const InputInfo &Output,
7186 const InputInfoList &Inputs,
7187 const ArgList &Args,
7188 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007189 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007190 ArgStringList CmdArgs;
7191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007192 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007193
7194 CmdArgs.push_back("-o");
7195 CmdArgs.push_back(Output.getFilename());
7196
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007198 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007199
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007200 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007201 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007202}
7203
Douglas Katzman95354292015-06-23 20:42:09 +00007204void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7205 const InputInfo &Output,
7206 const InputInfoList &Inputs,
7207 const ArgList &Args,
7208 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007209 const Driver &D = getToolChain().getDriver();
7210 ArgStringList CmdArgs;
7211
7212 if ((!Args.hasArg(options::OPT_nostdlib)) &&
7213 (!Args.hasArg(options::OPT_shared))) {
7214 CmdArgs.push_back("-e");
7215 CmdArgs.push_back("__start");
7216 }
7217
7218 if (Args.hasArg(options::OPT_static)) {
7219 CmdArgs.push_back("-Bstatic");
7220 } else {
7221 if (Args.hasArg(options::OPT_rdynamic))
7222 CmdArgs.push_back("-export-dynamic");
7223 CmdArgs.push_back("--eh-frame-hdr");
7224 CmdArgs.push_back("-Bdynamic");
7225 if (Args.hasArg(options::OPT_shared)) {
7226 CmdArgs.push_back("-shared");
7227 } else {
7228 CmdArgs.push_back("-dynamic-linker");
7229 CmdArgs.push_back("/usr/libexec/ld.so");
7230 }
7231 }
7232
7233 if (Output.isFilename()) {
7234 CmdArgs.push_back("-o");
7235 CmdArgs.push_back(Output.getFilename());
7236 } else {
7237 assert(Output.isNothing() && "Invalid output.");
7238 }
7239
7240 if (!Args.hasArg(options::OPT_nostdlib) &&
7241 !Args.hasArg(options::OPT_nostartfiles)) {
7242 if (!Args.hasArg(options::OPT_shared)) {
7243 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007244 CmdArgs.push_back(
7245 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007246 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007247 CmdArgs.push_back(
7248 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7249 CmdArgs.push_back(
7250 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007251 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007252 CmdArgs.push_back(
7253 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007254 }
7255 }
7256
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007257 Args.AddAllArgs(CmdArgs,
7258 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007259
7260 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7261
7262 if (!Args.hasArg(options::OPT_nostdlib) &&
7263 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007264 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007265 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7266 if (Args.hasArg(options::OPT_pg))
7267 CmdArgs.push_back("-lm_p");
7268 else
7269 CmdArgs.push_back("-lm");
7270 }
7271
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007272 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007273 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007274 CmdArgs.push_back("-lpthread_p");
7275 else
7276 CmdArgs.push_back("-lpthread");
7277 }
7278
Eli Friedman9fa28852012-08-08 23:57:20 +00007279 if (!Args.hasArg(options::OPT_shared)) {
7280 if (Args.hasArg(options::OPT_pg))
7281 CmdArgs.push_back("-lc_p");
7282 else
7283 CmdArgs.push_back("-lc");
7284 }
7285
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007286 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007287 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007288 case llvm::Triple::arm:
7289 MyArch = "arm";
7290 break;
7291 case llvm::Triple::x86:
7292 MyArch = "i386";
7293 break;
7294 case llvm::Triple::x86_64:
7295 MyArch = "amd64";
7296 break;
7297 default:
7298 llvm_unreachable("Unsupported architecture");
7299 }
7300 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007301 }
7302
7303 if (!Args.hasArg(options::OPT_nostdlib) &&
7304 !Args.hasArg(options::OPT_nostartfiles)) {
7305 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007306 CmdArgs.push_back(
7307 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007308 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007309 CmdArgs.push_back(
7310 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007311 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007313 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007314 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007315}
7316
Douglas Katzman95354292015-06-23 20:42:09 +00007317void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7318 const InputInfo &Output,
7319 const InputInfoList &Inputs,
7320 const ArgList &Args,
7321 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007322 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007323 ArgStringList CmdArgs;
7324
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007325 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7326 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007327 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007328 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007329 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00007330 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007331 else if (getToolChain().getArch() == llvm::Triple::mips ||
7332 getToolChain().getArch() == llvm::Triple::mipsel ||
7333 getToolChain().getArch() == llvm::Triple::mips64 ||
7334 getToolChain().getArch() == llvm::Triple::mips64el) {
7335 StringRef CPUName;
7336 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007337 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007338
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007339 CmdArgs.push_back("-march");
7340 CmdArgs.push_back(CPUName.data());
7341
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007342 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007343 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007344
7345 if (getToolChain().getArch() == llvm::Triple::mips ||
7346 getToolChain().getArch() == llvm::Triple::mips64)
7347 CmdArgs.push_back("-EB");
7348 else
7349 CmdArgs.push_back("-EL");
7350
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007351 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007352 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007353 getToolChain().getArch() == llvm::Triple::armeb ||
7354 getToolChain().getArch() == llvm::Triple::thumb ||
7355 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00007356 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00007357 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00007358 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
7359
7360 if (FloatABI == "hard") {
7361 CmdArgs.push_back("-mfpu=vfp");
7362 } else {
7363 CmdArgs.push_back("-mfpu=softvfp");
7364 }
7365
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007366 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007367 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007368 case llvm::Triple::GNUEABI:
7369 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007370 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007371 break;
7372
7373 default:
7374 CmdArgs.push_back("-matpcs");
7375 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00007376 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007377 getToolChain().getArch() == llvm::Triple::sparcel ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00007378 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00007379 if (getToolChain().getArch() == llvm::Triple::sparc)
7380 CmdArgs.push_back("-Av8plusa");
7381 else
7382 CmdArgs.push_back("-Av9a");
7383
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007384 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007385 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007387 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007388
7389 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007390 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007391
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007392 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007393 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007394
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007395 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007396 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007397}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007398
Douglas Katzman95354292015-06-23 20:42:09 +00007399void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7400 const InputInfo &Output,
7401 const InputInfoList &Inputs,
7402 const ArgList &Args,
7403 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007404 const toolchains::FreeBSD &ToolChain =
7405 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007406 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007407 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007408 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007409 !Args.hasArg(options::OPT_shared) &&
7410 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007411 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007412
7413 // Silence warning for "clang -g foo.o -o foo"
7414 Args.ClaimAllArgs(options::OPT_g_Group);
7415 // and "clang -emit-llvm foo.o -o foo"
7416 Args.ClaimAllArgs(options::OPT_emit_llvm);
7417 // and for "clang -w foo.o -o foo". Other warning options are already
7418 // handled somewhere else.
7419 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007420
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007421 if (!D.SysRoot.empty())
7422 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7423
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007424 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007425 CmdArgs.push_back("-pie");
7426
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007427 if (Args.hasArg(options::OPT_static)) {
7428 CmdArgs.push_back("-Bstatic");
7429 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007430 if (Args.hasArg(options::OPT_rdynamic))
7431 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007432 CmdArgs.push_back("--eh-frame-hdr");
7433 if (Args.hasArg(options::OPT_shared)) {
7434 CmdArgs.push_back("-Bshareable");
7435 } else {
7436 CmdArgs.push_back("-dynamic-linker");
7437 CmdArgs.push_back("/libexec/ld-elf.so.1");
7438 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007439 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007440 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7441 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7442 CmdArgs.push_back("--hash-style=both");
7443 }
7444 }
7445 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007446 }
7447
7448 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7449 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007450 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007451 CmdArgs.push_back("-m");
7452 CmdArgs.push_back("elf_i386_fbsd");
7453 }
7454
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007455 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007456 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007457 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007458 }
7459
Daniel Dunbarb440f562010-08-02 02:38:21 +00007460 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007461 CmdArgs.push_back("-o");
7462 CmdArgs.push_back(Output.getFilename());
7463 } else {
7464 assert(Output.isNothing() && "Invalid output.");
7465 }
7466
7467 if (!Args.hasArg(options::OPT_nostdlib) &&
7468 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007469 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007470 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007471 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007472 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007473 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007474 crt1 = "Scrt1.o";
7475 else
7476 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007477 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007478 if (crt1)
7479 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7480
7481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7482
Craig Topper92fc2df2014-05-17 16:56:41 +00007483 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007484 if (Args.hasArg(options::OPT_static))
7485 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007486 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007487 crtbegin = "crtbeginS.o";
7488 else
7489 crtbegin = "crtbegin.o";
7490
7491 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007492 }
7493
7494 Args.AddAllArgs(CmdArgs, options::OPT_L);
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00007495 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007496 for (const auto &Path : Paths)
7497 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007498 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7499 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007500 Args.AddAllArgs(CmdArgs, options::OPT_s);
7501 Args.AddAllArgs(CmdArgs, options::OPT_t);
7502 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7503 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007504
Alexey Samsonov907880e2015-06-19 19:57:46 +00007505 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00007506 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007507
Alexey Samsonov52550342014-09-15 19:58:40 +00007508 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007509 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007510
7511 if (!Args.hasArg(options::OPT_nostdlib) &&
7512 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007513 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007514 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007515 if (Args.hasArg(options::OPT_pg))
7516 CmdArgs.push_back("-lm_p");
7517 else
7518 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007519 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007520 if (NeedsSanitizerDeps)
7521 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007522 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7523 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007524 if (Args.hasArg(options::OPT_pg))
7525 CmdArgs.push_back("-lgcc_p");
7526 else
7527 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007528 if (Args.hasArg(options::OPT_static)) {
7529 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007530 } else if (Args.hasArg(options::OPT_pg)) {
7531 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007532 } else {
7533 CmdArgs.push_back("--as-needed");
7534 CmdArgs.push_back("-lgcc_s");
7535 CmdArgs.push_back("--no-as-needed");
7536 }
7537
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007538 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007539 if (Args.hasArg(options::OPT_pg))
7540 CmdArgs.push_back("-lpthread_p");
7541 else
7542 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007543 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007544
Roman Divacky66f22762011-02-10 16:59:40 +00007545 if (Args.hasArg(options::OPT_pg)) {
7546 if (Args.hasArg(options::OPT_shared))
7547 CmdArgs.push_back("-lc");
7548 else
7549 CmdArgs.push_back("-lc_p");
7550 CmdArgs.push_back("-lgcc_p");
7551 } else {
7552 CmdArgs.push_back("-lc");
7553 CmdArgs.push_back("-lgcc");
7554 }
7555
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007556 if (Args.hasArg(options::OPT_static)) {
7557 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007558 } else if (Args.hasArg(options::OPT_pg)) {
7559 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007560 } else {
7561 CmdArgs.push_back("--as-needed");
7562 CmdArgs.push_back("-lgcc_s");
7563 CmdArgs.push_back("--no-as-needed");
7564 }
7565 }
7566
7567 if (!Args.hasArg(options::OPT_nostdlib) &&
7568 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007569 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007570 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007571 else
7572 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007573 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007574 }
7575
Alexey Samsonov7811d192014-02-20 13:57:37 +00007576 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007577
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007578 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007579 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007580}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007581
Douglas Katzman95354292015-06-23 20:42:09 +00007582void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007583 const InputInfo &Output,
7584 const InputInfoList &Inputs,
7585 const ArgList &Args,
7586 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007587 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007588 ArgStringList CmdArgs;
7589
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007590 // GNU as needs different flags for creating the correct output format
7591 // on architectures with different ABIs or optional feature sets.
7592 switch (getToolChain().getArch()) {
7593 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007594 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007595 break;
7596 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007597 case llvm::Triple::armeb:
7598 case llvm::Triple::thumb:
7599 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007600 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007601 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7602 std::string Arch =
7603 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007604 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007605 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007606 }
7607
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007608 case llvm::Triple::mips:
7609 case llvm::Triple::mipsel:
7610 case llvm::Triple::mips64:
7611 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007612 StringRef CPUName;
7613 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007614 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007615
7616 CmdArgs.push_back("-march");
7617 CmdArgs.push_back(CPUName.data());
7618
7619 CmdArgs.push_back("-mabi");
7620 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7621
7622 if (getToolChain().getArch() == llvm::Triple::mips ||
7623 getToolChain().getArch() == llvm::Triple::mips64)
7624 CmdArgs.push_back("-EB");
7625 else
7626 CmdArgs.push_back("-EL");
7627
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007628 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007629 break;
7630 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007631
7632 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007633 case llvm::Triple::sparcel:
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007634 CmdArgs.push_back("-32");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007635 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007636 break;
7637
7638 case llvm::Triple::sparcv9:
7639 CmdArgs.push_back("-64");
7640 CmdArgs.push_back("-Av9");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007641 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007642 break;
7643
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007644 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007645 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007646 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007647
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007648 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007649
7650 CmdArgs.push_back("-o");
7651 CmdArgs.push_back(Output.getFilename());
7652
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007653 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007654 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007655
David Chisnallddbd68f2011-09-27 22:03:18 +00007656 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007657 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007658}
7659
Douglas Katzman95354292015-06-23 20:42:09 +00007660void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7661 const InputInfo &Output,
7662 const InputInfoList &Inputs,
7663 const ArgList &Args,
7664 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007665 const Driver &D = getToolChain().getDriver();
7666 ArgStringList CmdArgs;
7667
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007668 if (!D.SysRoot.empty())
7669 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7670
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007671 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007672 if (Args.hasArg(options::OPT_static)) {
7673 CmdArgs.push_back("-Bstatic");
7674 } else {
7675 if (Args.hasArg(options::OPT_rdynamic))
7676 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007677 if (Args.hasArg(options::OPT_shared)) {
7678 CmdArgs.push_back("-Bshareable");
7679 } else {
7680 CmdArgs.push_back("-dynamic-linker");
7681 CmdArgs.push_back("/libexec/ld.elf_so");
7682 }
7683 }
7684
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007685 // Many NetBSD architectures support more than one ABI.
7686 // Determine the correct emulation for ld.
7687 switch (getToolChain().getArch()) {
7688 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007689 CmdArgs.push_back("-m");
7690 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007691 break;
7692 case llvm::Triple::arm:
7693 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007694 CmdArgs.push_back("-m");
7695 switch (getToolChain().getTriple().getEnvironment()) {
7696 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007697 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007698 CmdArgs.push_back("armelf_nbsd_eabi");
7699 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007700 case llvm::Triple::EABIHF:
7701 case llvm::Triple::GNUEABIHF:
7702 CmdArgs.push_back("armelf_nbsd_eabihf");
7703 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007704 default:
7705 CmdArgs.push_back("armelf_nbsd");
7706 break;
7707 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007708 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007709 case llvm::Triple::armeb:
7710 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007711 arm::appendEBLinkFlags(
7712 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007713 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007714 CmdArgs.push_back("-m");
7715 switch (getToolChain().getTriple().getEnvironment()) {
7716 case llvm::Triple::EABI:
7717 case llvm::Triple::GNUEABI:
7718 CmdArgs.push_back("armelfb_nbsd_eabi");
7719 break;
7720 case llvm::Triple::EABIHF:
7721 case llvm::Triple::GNUEABIHF:
7722 CmdArgs.push_back("armelfb_nbsd_eabihf");
7723 break;
7724 default:
7725 CmdArgs.push_back("armelfb_nbsd");
7726 break;
7727 }
7728 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007729 case llvm::Triple::mips64:
7730 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007731 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007732 CmdArgs.push_back("-m");
7733 if (getToolChain().getArch() == llvm::Triple::mips64)
7734 CmdArgs.push_back("elf32btsmip");
7735 else
7736 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007737 } else if (mips::hasMipsAbiArg(Args, "64")) {
7738 CmdArgs.push_back("-m");
7739 if (getToolChain().getArch() == llvm::Triple::mips64)
7740 CmdArgs.push_back("elf64btsmip");
7741 else
7742 CmdArgs.push_back("elf64ltsmip");
7743 }
7744 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007745 case llvm::Triple::ppc:
7746 CmdArgs.push_back("-m");
7747 CmdArgs.push_back("elf32ppc_nbsd");
7748 break;
7749
7750 case llvm::Triple::ppc64:
7751 case llvm::Triple::ppc64le:
7752 CmdArgs.push_back("-m");
7753 CmdArgs.push_back("elf64ppc");
7754 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007755
7756 case llvm::Triple::sparc:
7757 CmdArgs.push_back("-m");
7758 CmdArgs.push_back("elf32_sparc");
7759 break;
7760
7761 case llvm::Triple::sparcv9:
7762 CmdArgs.push_back("-m");
7763 CmdArgs.push_back("elf64_sparc");
7764 break;
7765
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007766 default:
7767 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007768 }
7769
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007770 if (Output.isFilename()) {
7771 CmdArgs.push_back("-o");
7772 CmdArgs.push_back(Output.getFilename());
7773 } else {
7774 assert(Output.isNothing() && "Invalid output.");
7775 }
7776
7777 if (!Args.hasArg(options::OPT_nostdlib) &&
7778 !Args.hasArg(options::OPT_nostartfiles)) {
7779 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007780 CmdArgs.push_back(
7781 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7782 CmdArgs.push_back(
7783 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7784 CmdArgs.push_back(
7785 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007786 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007787 CmdArgs.push_back(
7788 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7789 CmdArgs.push_back(
7790 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007791 }
7792 }
7793
7794 Args.AddAllArgs(CmdArgs, options::OPT_L);
7795 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7796 Args.AddAllArgs(CmdArgs, options::OPT_e);
7797 Args.AddAllArgs(CmdArgs, options::OPT_s);
7798 Args.AddAllArgs(CmdArgs, options::OPT_t);
7799 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7800 Args.AddAllArgs(CmdArgs, options::OPT_r);
7801
7802 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7803
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007804 unsigned Major, Minor, Micro;
7805 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
7806 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007807 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007808 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00007809 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00007810 case llvm::Triple::arm:
7811 case llvm::Triple::armeb:
7812 case llvm::Triple::thumb:
7813 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00007814 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007815 case llvm::Triple::ppc64:
7816 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007817 case llvm::Triple::x86:
7818 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007819 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00007820 break;
7821 default:
7822 break;
7823 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007824 }
7825
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007826 if (!Args.hasArg(options::OPT_nostdlib) &&
7827 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007828 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007829 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7830 CmdArgs.push_back("-lm");
7831 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007832 if (Args.hasArg(options::OPT_pthread))
7833 CmdArgs.push_back("-lpthread");
7834 CmdArgs.push_back("-lc");
7835
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00007836 if (useLibgcc) {
7837 if (Args.hasArg(options::OPT_static)) {
7838 // libgcc_eh depends on libc, so resolve as much as possible,
7839 // pull in any new requirements from libc and then get the rest
7840 // of libgcc.
7841 CmdArgs.push_back("-lgcc_eh");
7842 CmdArgs.push_back("-lc");
7843 CmdArgs.push_back("-lgcc");
7844 } else {
7845 CmdArgs.push_back("-lgcc");
7846 CmdArgs.push_back("--as-needed");
7847 CmdArgs.push_back("-lgcc_s");
7848 CmdArgs.push_back("--no-as-needed");
7849 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007850 }
7851 }
7852
7853 if (!Args.hasArg(options::OPT_nostdlib) &&
7854 !Args.hasArg(options::OPT_nostartfiles)) {
7855 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 CmdArgs.push_back(
7857 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007858 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007859 CmdArgs.push_back(
7860 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
7861 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007862 }
7863
Alexey Samsonov7811d192014-02-20 13:57:37 +00007864 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007865
Logan Chieneb9162f2014-06-26 14:23:45 +00007866 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007867 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007868}
7869
Douglas Katzman95354292015-06-23 20:42:09 +00007870void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7871 const InputInfo &Output,
7872 const InputInfoList &Inputs,
7873 const ArgList &Args,
7874 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007875 claimNoWarnArgs(Args);
7876
James Y Knight2db38f32015-08-15 03:45:25 +00007877 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
7878 llvm::Triple Triple = llvm::Triple(TripleStr);
7879
Rafael Espindola92b00932010-08-10 00:25:48 +00007880 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007881 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00007882
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007883 llvm::Reloc::Model RelocationModel;
7884 unsigned PICLevel;
7885 bool IsPIE;
7886 std::tie(RelocationModel, PICLevel, IsPIE) =
7887 ParsePICArgs(getToolChain(), Triple, Args);
7888
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007889 switch (getToolChain().getArch()) {
7890 default:
7891 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00007892 // Add --32/--64 to make sure we get the format we want.
7893 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007894 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00007895 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007896 break;
7897 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00007898 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
7899 CmdArgs.push_back("--x32");
7900 else
7901 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007902 break;
7903 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007904 CmdArgs.push_back("-a32");
7905 CmdArgs.push_back("-mppc");
7906 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007907 break;
7908 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00007909 CmdArgs.push_back("-a64");
7910 CmdArgs.push_back("-mppc64");
7911 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007912 break;
7913 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00007914 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007915 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00007916 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007917 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007918 break;
7919 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007920 case llvm::Triple::sparcel:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007921 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007922 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007923 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007924 break;
7925 case llvm::Triple::sparcv9:
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00007926 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00007927 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00007928 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007929 break;
7930 case llvm::Triple::arm:
7931 case llvm::Triple::armeb:
7932 case llvm::Triple::thumb:
7933 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00007934 const llvm::Triple &Triple2 = getToolChain().getTriple();
7935 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00007936 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00007937 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00007938 break;
7939 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00007940 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00007941 break;
7942 default:
7943 break;
7944 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007945
James Y Knight2db38f32015-08-15 03:45:25 +00007946 StringRef ARMFloatABI =
7947 tools::arm::getARMFloatABI(getToolChain().getDriver(), Args, Triple);
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00007948 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007949
7950 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00007951
7952 // FIXME: remove krait check when GNU tools support krait cpu
7953 // for now replace it with -march=armv7-a to avoid a lower
7954 // march from being picked in the absence of a cpu flag.
7955 Arg *A;
7956 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007957 StringRef(A->getValue()).lower() == "krait")
7958 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00007959 else
7960 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00007961 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00007962 break;
7963 }
7964 case llvm::Triple::mips:
7965 case llvm::Triple::mipsel:
7966 case llvm::Triple::mips64:
7967 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007968 StringRef CPUName;
7969 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007970 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007971 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00007972
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007973 CmdArgs.push_back("-march");
7974 CmdArgs.push_back(CPUName.data());
7975
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00007976 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00007977 CmdArgs.push_back(ABIName.data());
7978
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007979 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
7980 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007981 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00007982 CmdArgs.push_back("-mno-shared");
7983
Daniel Sanders379d44b2014-07-16 11:52:23 +00007984 // LLVM doesn't support -mplt yet and acts as if it is always given.
7985 // However, -mplt has no effect with the N64 ABI.
7986 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00007987
7988 if (getToolChain().getArch() == llvm::Triple::mips ||
7989 getToolChain().getArch() == llvm::Triple::mips64)
7990 CmdArgs.push_back("-EB");
7991 else
7992 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00007993
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007994 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
7995 if (StringRef(A->getValue()) == "2008")
7996 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
7997 }
7998
Daniel Sanders379d44b2014-07-16 11:52:23 +00007999 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
Toma Tabacu94ea6862015-06-16 13:54:13 +00008000 StringRef MIPSFloatABI = getMipsFloatABI(getToolChain().getDriver(), Args);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008001 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8002 options::OPT_mfp64)) {
8003 A->claim();
8004 A->render(Args, CmdArgs);
Toma Tabacu94ea6862015-06-16 13:54:13 +00008005 } else if (mips::shouldUseFPXX(Args, getToolChain().getTriple(), CPUName,
8006 ABIName, MIPSFloatABI))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008007 CmdArgs.push_back("-mfpxx");
8008
8009 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8010 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008011 if (Arg *A =
8012 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008013 if (A->getOption().matches(options::OPT_mips16)) {
8014 A->claim();
8015 A->render(Args, CmdArgs);
8016 } else {
8017 A->claim();
8018 CmdArgs.push_back("-no-mips16");
8019 }
8020 }
8021
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008022 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8023 options::OPT_mno_micromips);
8024 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8025 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8026
Simon Atanasyanbd986632013-11-26 11:58:04 +00008027 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8028 // Do not use AddLastArg because not all versions of MIPS assembler
8029 // support -mmsa / -mno-msa options.
8030 if (A->getOption().matches(options::OPT_mmsa))
8031 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8032 }
8033
Daniel Sanders379d44b2014-07-16 11:52:23 +00008034 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8035 options::OPT_msoft_float);
8036
Toma Tabacub36d6102015-06-11 12:13:18 +00008037 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8038 options::OPT_msingle_float);
8039
Daniel Sanders379d44b2014-07-16 11:52:23 +00008040 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8041 options::OPT_mno_odd_spreg);
8042
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008043 NeedsKPIC = true;
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008044 break;
8045 }
8046 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008047 // Always pass an -march option, since our default of z10 is later
8048 // than the GNU assembler's default.
8049 StringRef CPUName = getSystemZTargetCPU(Args);
8050 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008051 break;
8052 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008053 }
8054
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008055 if (NeedsKPIC) {
8056 if (RelocationModel != llvm::Reloc::Static)
8057 CmdArgs.push_back("-KPIC");
8058 }
Rafael Espindola92b00932010-08-10 00:25:48 +00008059
Renato Golina74bbc72015-07-22 15:32:36 +00008060 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008061 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008062
8063 CmdArgs.push_back("-o");
8064 CmdArgs.push_back(Output.getFilename());
8065
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008066 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008067 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008068
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008069 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008070 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008071
8072 // Handle the debug info splitting at object creation time if we're
8073 // creating an object.
8074 // TODO: Currently only works on linux with newer objcopy.
8075 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008076 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008077 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008078 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008079}
8080
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008081static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008082 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00008083 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Reid Kleckner0213a472015-07-22 16:01:38 +00008084 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008085 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8086 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008087 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008088 CmdArgs.push_back("-lgcc");
8089
Logan Chien3d3373c2012-11-19 12:04:11 +00008090 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008091 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008092 CmdArgs.push_back("-lgcc");
8093 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008094 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008095 CmdArgs.push_back("--as-needed");
8096 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008097 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008098 CmdArgs.push_back("--no-as-needed");
8099 }
8100
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008101 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008102 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008103 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008104 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008105
8106 // According to Android ABI, we have to link with libdl if we are
8107 // linking with non-static libgcc.
8108 //
8109 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8110 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8111 if (isAndroid && !StaticLibgcc)
8112 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008113}
8114
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008115static std::string getLinuxDynamicLinker(const ArgList &Args,
8116 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008117 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8118
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008119 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
8120 if (ToolChain.getTriple().isArch64Bit())
8121 return "/system/bin/linker64";
8122 else
8123 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008124 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8125 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008126 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008127 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008128 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008129 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008130 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008131 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008132 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8133 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008134 return "/lib/ld-linux-armhf.so.3";
8135 else
8136 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008137 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8138 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008139 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
8140 tools::arm::getARMFloatABI(ToolChain.getDriver(), Args, ToolChain.getTriple()) == "hard")
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008142 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008143 return "/lib/ld-linux.so.3";
8144 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8145 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008146 StringRef CPUName;
8147 StringRef ABIName;
8148 mips::getMipsCPUAndABI(Args, ToolChain.getTriple(), CPUName, ABIName);
8149 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
8150
8151 StringRef LibDir = llvm::StringSwitch<llvm::StringRef>(ABIName)
8152 .Case("o32", "/lib")
8153 .Case("n32", "/lib32")
8154 .Case("n64", "/lib64")
8155 .Default("/lib");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008156 StringRef LibName;
8157 if (mips::isUCLibc(Args))
8158 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
8159 else
8160 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008161
8162 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008163 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008164 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008165 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008166 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8167 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008168 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008169 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008170 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8171 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008172 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008173 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008174 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008175 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008176 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008177 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008178 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8179 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008180 else
8181 return "/lib64/ld-linux-x86-64.so.2";
8182}
8183
Renato Golinc4b49242014-02-13 10:01:16 +00008184static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008185 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008186 // Make use of compiler-rt if --rtlib option is used
8187 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8188
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008189 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008190 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008191 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008192 default:
8193 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008194 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008195 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008196 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008197 break;
8198 }
Renato Golinc4b49242014-02-13 10:01:16 +00008199 break;
8200 case ToolChain::RLT_Libgcc:
8201 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8202 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008203 }
8204}
8205
Rafael Espindola1e085772014-08-15 17:14:35 +00008206static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8207 switch (T.getArch()) {
8208 case llvm::Triple::x86:
8209 return "elf_i386";
8210 case llvm::Triple::aarch64:
8211 return "aarch64linux";
8212 case llvm::Triple::aarch64_be:
8213 return "aarch64_be_linux";
8214 case llvm::Triple::arm:
8215 case llvm::Triple::thumb:
8216 return "armelf_linux_eabi";
8217 case llvm::Triple::armeb:
8218 case llvm::Triple::thumbeb:
8219 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8220 case llvm::Triple::ppc:
8221 return "elf32ppclinux";
8222 case llvm::Triple::ppc64:
8223 return "elf64ppc";
8224 case llvm::Triple::ppc64le:
8225 return "elf64lppc";
8226 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008227 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008228 return "elf32_sparc";
8229 case llvm::Triple::sparcv9:
8230 return "elf64_sparc";
8231 case llvm::Triple::mips:
8232 return "elf32btsmip";
8233 case llvm::Triple::mipsel:
8234 return "elf32ltsmip";
8235 case llvm::Triple::mips64:
8236 if (mips::hasMipsAbiArg(Args, "n32"))
8237 return "elf32btsmipn32";
8238 return "elf64btsmip";
8239 case llvm::Triple::mips64el:
8240 if (mips::hasMipsAbiArg(Args, "n32"))
8241 return "elf32ltsmipn32";
8242 return "elf64ltsmip";
8243 case llvm::Triple::systemz:
8244 return "elf64_s390";
8245 case llvm::Triple::x86_64:
8246 if (T.getEnvironment() == llvm::Triple::GNUX32)
8247 return "elf32_x86_64";
8248 return "elf_x86_64";
8249 default:
8250 llvm_unreachable("Unexpected arch");
8251 }
8252}
8253
Douglas Katzman95354292015-06-23 20:42:09 +00008254void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8255 const InputInfo &Output,
8256 const InputInfoList &Inputs,
8257 const ArgList &Args,
8258 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008259 const toolchains::Linux &ToolChain =
8260 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008261 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008262
8263 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8264 llvm::Triple Triple = llvm::Triple(TripleStr);
8265
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008266 const llvm::Triple::ArchType Arch = ToolChain.getArch();
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008267 const bool isAndroid =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008268 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008269 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008270 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8271 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008272
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008273 ArgStringList CmdArgs;
8274
Rafael Espindolad1002f62010-11-15 18:28:16 +00008275 // Silence warning for "clang -g foo.o -o foo"
8276 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008277 // and "clang -emit-llvm foo.o -o foo"
8278 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008279 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008280 // handled somewhere else.
8281 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008282
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008283 if (!D.SysRoot.empty())
8284 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008285
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008286 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008287 CmdArgs.push_back("-pie");
8288
Rafael Espindola1c76c592010-11-07 22:57:16 +00008289 if (Args.hasArg(options::OPT_rdynamic))
8290 CmdArgs.push_back("-export-dynamic");
8291
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008292 if (Args.hasArg(options::OPT_s))
8293 CmdArgs.push_back("-s");
8294
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008295 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008296 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008297
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008298 for (const auto &Opt : ToolChain.ExtraOpts)
8299 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008300
8301 if (!Args.hasArg(options::OPT_static)) {
8302 CmdArgs.push_back("--eh-frame-hdr");
8303 }
8304
8305 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008306 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008307
8308 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008309 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8310 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008311 CmdArgs.push_back("-Bstatic");
8312 else
8313 CmdArgs.push_back("-static");
8314 } else if (Args.hasArg(options::OPT_shared)) {
8315 CmdArgs.push_back("-shared");
8316 }
8317
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008318 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8319 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008320 (!Args.hasArg(options::OPT_static) &&
8321 !Args.hasArg(options::OPT_shared))) {
8322 CmdArgs.push_back("-dynamic-linker");
8323 CmdArgs.push_back(Args.MakeArgString(
8324 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8325 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008326
8327 CmdArgs.push_back("-o");
8328 CmdArgs.push_back(Output.getFilename());
8329
Rafael Espindola81937ec2010-12-01 01:52:43 +00008330 if (!Args.hasArg(options::OPT_nostdlib) &&
8331 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008332 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008333 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008334 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008335 if (Args.hasArg(options::OPT_pg))
8336 crt1 = "gcrt1.o";
8337 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008338 crt1 = "Scrt1.o";
8339 else
8340 crt1 = "crt1.o";
8341 }
8342 if (crt1)
8343 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008344
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008345 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8346 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008347
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008348 const char *crtbegin;
8349 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008350 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008351 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008352 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008353 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008354 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008355 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008356 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008357 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008358
8359 // Add crtfastmath.o if available and fast math is enabled.
8360 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008361 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008362
8363 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008364 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008365
Benjamin Kramer22c68ef2014-09-11 14:13:49 +00008366 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008367
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008368 for (const auto &Path : Paths)
8369 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008370
Alexey Samsonov907880e2015-06-19 19:57:46 +00008371 if (D.IsUsingLTO(Args))
Alp Tokerce365ca2013-12-02 12:43:03 +00008372 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00008373
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008374 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8375 CmdArgs.push_back("--no-demangle");
8376
Alexey Samsonov52550342014-09-15 19:58:40 +00008377 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008378 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008379 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00008380 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008381
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008382 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Chandler Carruth94a32012012-05-14 18:31:18 +00008383 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008384 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008385 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008386 if (OnlyLibstdcxxStatic)
8387 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008388 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008389 if (OnlyLibstdcxxStatic)
8390 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008391 CmdArgs.push_back("-lm");
8392 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008393 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8394 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008395
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008396 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008397 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8398 if (Args.hasArg(options::OPT_static))
8399 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008400
Alexey Samsonov52550342014-09-15 19:58:40 +00008401 if (NeedsSanitizerDeps)
8402 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8403
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008404 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8405 Args.hasArg(options::OPT_pthreads);
8406
8407 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8408 options::OPT_fno_openmp, false)) {
8409 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8410 // FIXME: Does this really make sense for all GNU toolchains?
8411 WantPthread = true;
8412
8413 // Also link the particular OpenMP runtimes.
8414 switch (getOpenMPRuntime(ToolChain, Args)) {
8415 case OMPRT_OMP:
8416 CmdArgs.push_back("-lomp");
8417 break;
8418 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008419 CmdArgs.push_back("-lgomp");
8420
8421 // FIXME: Exclude this for platforms with libgomp that don't require
8422 // librt. Most modern Linux platforms require it, but some may not.
8423 CmdArgs.push_back("-lrt");
8424 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008425 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008426 CmdArgs.push_back("-liomp5");
8427 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008428 case OMPRT_Unknown:
8429 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008430 break;
8431 }
Chandler Carruth01538002013-01-17 13:19:29 +00008432 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008433
Renato Golinc4b49242014-02-13 10:01:16 +00008434 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008435
Richard Smith31d1de22015-05-20 22:48:44 +00008436 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008437 CmdArgs.push_back("-lpthread");
8438
8439 CmdArgs.push_back("-lc");
8440
8441 if (Args.hasArg(options::OPT_static))
8442 CmdArgs.push_back("--end-group");
8443 else
Renato Golinc4b49242014-02-13 10:01:16 +00008444 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008445 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008446
Rafael Espindola81937ec2010-12-01 01:52:43 +00008447 if (!Args.hasArg(options::OPT_nostartfiles)) {
8448 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008449 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008450 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008451 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008452 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008453 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008454 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008455
Rafael Espindola81937ec2010-12-01 01:52:43 +00008456 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008457 if (!isAndroid)
8458 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008459 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008460 }
8461
Justin Bognerd3371d82015-07-17 03:35:54 +00008462 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8463 CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008464}
8465
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008466// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8467// for the various SFI requirements like register masking. The assembly tool
8468// inserts the file containing the macros as an input into all the assembly
8469// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008470void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8471 const InputInfo &Output,
8472 const InputInfoList &Inputs,
8473 const ArgList &Args,
8474 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008475 const toolchains::NaClToolChain &ToolChain =
8476 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008477 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8478 "nacl-arm-macros.s");
8479 InputInfoList NewInputs;
8480 NewInputs.push_back(NaClMacros);
8481 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008482 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8483 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008484}
8485
Douglas Katzman750cfc52015-06-29 18:42:16 +00008486// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008487// we use static by default, do not yet support sanitizers or LTO, and a few
8488// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008489// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008490void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8491 const InputInfo &Output,
8492 const InputInfoList &Inputs,
8493 const ArgList &Args,
8494 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008495
Douglas Katzman54366072015-07-27 16:53:08 +00008496 const toolchains::NaClToolChain &ToolChain =
8497 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008498 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008499 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008500 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008501 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008502
8503 ArgStringList CmdArgs;
8504
8505 // Silence warning for "clang -g foo.o -o foo"
8506 Args.ClaimAllArgs(options::OPT_g_Group);
8507 // and "clang -emit-llvm foo.o -o foo"
8508 Args.ClaimAllArgs(options::OPT_emit_llvm);
8509 // and for "clang -w foo.o -o foo". Other warning options are already
8510 // handled somewhere else.
8511 Args.ClaimAllArgs(options::OPT_w);
8512
8513 if (!D.SysRoot.empty())
8514 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8515
8516 if (Args.hasArg(options::OPT_rdynamic))
8517 CmdArgs.push_back("-export-dynamic");
8518
8519 if (Args.hasArg(options::OPT_s))
8520 CmdArgs.push_back("-s");
8521
Douglas Katzman54366072015-07-27 16:53:08 +00008522 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8523 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008524 CmdArgs.push_back("--build-id");
8525
8526 if (!IsStatic)
8527 CmdArgs.push_back("--eh-frame-hdr");
8528
8529 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008530 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008531 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008532 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008533 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008534 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008535 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008536 else if (Arch == llvm::Triple::mipsel)
8537 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008538 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008539 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8540 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008541
8542 if (IsStatic)
8543 CmdArgs.push_back("-static");
8544 else if (Args.hasArg(options::OPT_shared))
8545 CmdArgs.push_back("-shared");
8546
8547 CmdArgs.push_back("-o");
8548 CmdArgs.push_back(Output.getFilename());
8549 if (!Args.hasArg(options::OPT_nostdlib) &&
8550 !Args.hasArg(options::OPT_nostartfiles)) {
8551 if (!Args.hasArg(options::OPT_shared))
8552 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8553 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8554
8555 const char *crtbegin;
8556 if (IsStatic)
8557 crtbegin = "crtbeginT.o";
8558 else if (Args.hasArg(options::OPT_shared))
8559 crtbegin = "crtbeginS.o";
8560 else
8561 crtbegin = "crtbegin.o";
8562 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8563 }
8564
8565 Args.AddAllArgs(CmdArgs, options::OPT_L);
8566 Args.AddAllArgs(CmdArgs, options::OPT_u);
8567
8568 const ToolChain::path_list &Paths = ToolChain.getFilePaths();
8569
8570 for (const auto &Path : Paths)
8571 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
8572
8573 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8574 CmdArgs.push_back("--no-demangle");
8575
8576 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8577
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008578 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008579 !Args.hasArg(options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008580 bool OnlyLibstdcxxStatic =
8581 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008582 if (OnlyLibstdcxxStatic)
8583 CmdArgs.push_back("-Bstatic");
8584 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8585 if (OnlyLibstdcxxStatic)
8586 CmdArgs.push_back("-Bdynamic");
8587 CmdArgs.push_back("-lm");
8588 }
8589
8590 if (!Args.hasArg(options::OPT_nostdlib)) {
8591 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8592 // Always use groups, since it has no effect on dynamic libraries.
8593 CmdArgs.push_back("--start-group");
8594 CmdArgs.push_back("-lc");
8595 // NaCl's libc++ currently requires libpthread, so just always include it
8596 // in the group for C++.
8597 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008598 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008599 // Gold, used by Mips, handles nested groups differently than ld, and
8600 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8601 // which is not a desired behaviour here.
8602 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8603 if (getToolChain().getArch() == llvm::Triple::mipsel)
8604 CmdArgs.push_back("-lnacl");
8605
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008606 CmdArgs.push_back("-lpthread");
8607 }
8608
8609 CmdArgs.push_back("-lgcc");
8610 CmdArgs.push_back("--as-needed");
8611 if (IsStatic)
8612 CmdArgs.push_back("-lgcc_eh");
8613 else
8614 CmdArgs.push_back("-lgcc_s");
8615 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008616
8617 // Mips needs to create and use pnacl_legacy library that contains
8618 // definitions from bitcode/pnaclmm.c and definitions for
8619 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8620 if (getToolChain().getArch() == llvm::Triple::mipsel)
8621 CmdArgs.push_back("-lpnacl_legacy");
8622
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008623 CmdArgs.push_back("--end-group");
8624 }
8625
8626 if (!Args.hasArg(options::OPT_nostartfiles)) {
8627 const char *crtend;
8628 if (Args.hasArg(options::OPT_shared))
8629 crtend = "crtendS.o";
8630 else
8631 crtend = "crtend.o";
8632
8633 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8634 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8635 }
8636 }
8637
Justin Bognerd3371d82015-07-17 03:35:54 +00008638 C.addCommand(llvm::make_unique<Command>(JA, *this, ToolChain.Linker.c_str(),
8639 CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008640}
8641
Douglas Katzman95354292015-06-23 20:42:09 +00008642void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8643 const InputInfo &Output,
8644 const InputInfoList &Inputs,
8645 const ArgList &Args,
8646 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008647 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008648 ArgStringList CmdArgs;
8649
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008650 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008651
8652 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008653 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008654
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008655 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008656 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008657
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008658 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008659 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008660}
8661
Douglas Katzman95354292015-06-23 20:42:09 +00008662void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8663 const InputInfo &Output,
8664 const InputInfoList &Inputs,
8665 const ArgList &Args,
8666 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008667 const Driver &D = getToolChain().getDriver();
8668 ArgStringList CmdArgs;
8669
Daniel Dunbarb440f562010-08-02 02:38:21 +00008670 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008671 CmdArgs.push_back("-o");
8672 CmdArgs.push_back(Output.getFilename());
8673 } else {
8674 assert(Output.isNothing() && "Invalid output.");
8675 }
8676
8677 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00008678 !Args.hasArg(options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008679 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8680 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8681 CmdArgs.push_back(
8682 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8683 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008684 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008685
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008686 Args.AddAllArgs(CmdArgs,
8687 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008688
Daniel Dunbar54423b22010-09-17 00:24:54 +00008689 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008690
Alexey Samsonov7811d192014-02-20 13:57:37 +00008691 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008692
Chris Lattner3e2ee142010-07-07 16:01:42 +00008693 if (!Args.hasArg(options::OPT_nostdlib) &&
8694 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008695 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008696 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008697 CmdArgs.push_back("-lm");
8698 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008699 }
8700
8701 if (!Args.hasArg(options::OPT_nostdlib) &&
8702 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008703 if (Args.hasArg(options::OPT_pthread))
8704 CmdArgs.push_back("-lpthread");
8705 CmdArgs.push_back("-lc");
8706 CmdArgs.push_back("-lCompilerRT-Generic");
8707 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8708 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008709 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008710 }
8711
Logan Chieneb9162f2014-06-26 14:23:45 +00008712 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008713 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008714}
8715
Daniel Dunbarcc912342009-05-02 18:28:39 +00008716/// DragonFly Tools
8717
8718// For now, DragonFly Assemble does just about the same as for
8719// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008720void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8721 const InputInfo &Output,
8722 const InputInfoList &Inputs,
8723 const ArgList &Args,
8724 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008725 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008726 ArgStringList CmdArgs;
8727
8728 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8729 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008730 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008731 CmdArgs.push_back("--32");
8732
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008733 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008734
8735 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008736 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008737
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008738 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008739 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008740
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008741 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008742 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008743}
8744
Douglas Katzman95354292015-06-23 20:42:09 +00008745void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8746 const InputInfo &Output,
8747 const InputInfoList &Inputs,
8748 const ArgList &Args,
8749 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008750 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008751 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008752 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008753
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008754 if (!D.SysRoot.empty())
8755 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8756
John McCall65b8da02013-04-11 22:55:55 +00008757 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008758 if (Args.hasArg(options::OPT_static)) {
8759 CmdArgs.push_back("-Bstatic");
8760 } else {
John McCall65b8da02013-04-11 22:55:55 +00008761 if (Args.hasArg(options::OPT_rdynamic))
8762 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008763 if (Args.hasArg(options::OPT_shared))
8764 CmdArgs.push_back("-Bshareable");
8765 else {
8766 CmdArgs.push_back("-dynamic-linker");
8767 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8768 }
John McCall65b8da02013-04-11 22:55:55 +00008769 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008770 }
8771
8772 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8773 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008774 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008775 CmdArgs.push_back("-m");
8776 CmdArgs.push_back("elf_i386");
8777 }
8778
Daniel Dunbarb440f562010-08-02 02:38:21 +00008779 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00008780 CmdArgs.push_back("-o");
8781 CmdArgs.push_back(Output.getFilename());
8782 } else {
8783 assert(Output.isNothing() && "Invalid output.");
8784 }
8785
8786 if (!Args.hasArg(options::OPT_nostdlib) &&
8787 !Args.hasArg(options::OPT_nostartfiles)) {
8788 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00008789 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008790 CmdArgs.push_back(
8791 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008792 else {
8793 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008794 CmdArgs.push_back(
8795 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008796 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008797 CmdArgs.push_back(
8798 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00008799 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008800 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008801 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00008802 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008803 CmdArgs.push_back(
8804 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008805 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008806 CmdArgs.push_back(
8807 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008808 }
8809
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008810 Args.AddAllArgs(CmdArgs,
8811 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00008812
Daniel Dunbar54423b22010-09-17 00:24:54 +00008813 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008814
8815 if (!Args.hasArg(options::OPT_nostdlib) &&
8816 !Args.hasArg(options::OPT_nodefaultlibs)) {
8817 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
8818 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00008819 if (UseGCC47)
8820 CmdArgs.push_back("-L/usr/lib/gcc47");
8821 else
8822 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008823
8824 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00008825 if (UseGCC47) {
8826 CmdArgs.push_back("-rpath");
8827 CmdArgs.push_back("/usr/lib/gcc47");
8828 } else {
8829 CmdArgs.push_back("-rpath");
8830 CmdArgs.push_back("/usr/lib/gcc44");
8831 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008832 }
8833
Hans Wennborg70850d82013-07-18 20:29:38 +00008834 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008835 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00008836 CmdArgs.push_back("-lm");
8837 }
8838
Daniel Dunbarcc912342009-05-02 18:28:39 +00008839 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00008840 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008841
8842 if (!Args.hasArg(options::OPT_nolibc)) {
8843 CmdArgs.push_back("-lc");
8844 }
8845
John McCall65b8da02013-04-11 22:55:55 +00008846 if (UseGCC47) {
8847 if (Args.hasArg(options::OPT_static) ||
8848 Args.hasArg(options::OPT_static_libgcc)) {
8849 CmdArgs.push_back("-lgcc");
8850 CmdArgs.push_back("-lgcc_eh");
8851 } else {
8852 if (Args.hasArg(options::OPT_shared_libgcc)) {
8853 CmdArgs.push_back("-lgcc_pic");
8854 if (!Args.hasArg(options::OPT_shared))
8855 CmdArgs.push_back("-lgcc");
8856 } else {
8857 CmdArgs.push_back("-lgcc");
8858 CmdArgs.push_back("--as-needed");
8859 CmdArgs.push_back("-lgcc_pic");
8860 CmdArgs.push_back("--no-as-needed");
8861 }
8862 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008863 } else {
John McCall65b8da02013-04-11 22:55:55 +00008864 if (Args.hasArg(options::OPT_shared)) {
8865 CmdArgs.push_back("-lgcc_pic");
8866 } else {
8867 CmdArgs.push_back("-lgcc");
8868 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00008869 }
8870 }
8871
8872 if (!Args.hasArg(options::OPT_nostdlib) &&
8873 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00008874 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008875 CmdArgs.push_back(
8876 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00008877 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008878 CmdArgs.push_back(
8879 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
8880 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008881 }
8882
Alexey Samsonov7811d192014-02-20 13:57:37 +00008883 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008884
Logan Chieneb9162f2014-06-26 14:23:45 +00008885 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008886 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008887}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008888
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00008889// Try to find Exe from a Visual Studio distribution. This first tries to find
8890// an installed copy of Visual Studio and, failing that, looks in the PATH,
8891// making sure that whatever executable that's found is not a same-named exe
8892// from clang itself to prevent clang from falling back to itself.
8893static std::string FindVisualStudioExecutable(const ToolChain &TC,
8894 const char *Exe,
8895 const char *ClangProgramPath) {
8896 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
8897 std::string visualStudioBinDir;
8898 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
8899 visualStudioBinDir)) {
8900 SmallString<128> FilePath(visualStudioBinDir);
8901 llvm::sys::path::append(FilePath, Exe);
8902 if (llvm::sys::fs::can_execute(FilePath.c_str()))
8903 return FilePath.str();
8904 }
8905
8906 return Exe;
8907}
8908
Douglas Katzman95354292015-06-23 20:42:09 +00008909void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8910 const InputInfo &Output,
8911 const InputInfoList &Inputs,
8912 const ArgList &Args,
8913 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008914 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008915 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008916
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008917 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
8918 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008919 CmdArgs.push_back(
8920 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008921
8922 if (!Args.hasArg(options::OPT_nostdlib) &&
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00008923 !Args.hasArg(options::OPT_nostartfiles) && !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008924 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008925
Zachary Turner10d75b22014-10-22 20:40:43 +00008926 if (!llvm::sys::Process::GetEnv("LIB")) {
8927 // If the VC environment hasn't been configured (perhaps because the user
8928 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00008929 // the environment variable is set however, assume the user knows what
8930 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00008931 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008932 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00008933 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
8934 SmallString<128> LibDir(VisualStudioDir);
8935 llvm::sys::path::append(LibDir, "VC", "lib");
8936 switch (MSVC.getArch()) {
8937 case llvm::Triple::x86:
8938 // x86 just puts the libraries directly in lib
8939 break;
8940 case llvm::Triple::x86_64:
8941 llvm::sys::path::append(LibDir, "amd64");
8942 break;
8943 case llvm::Triple::arm:
8944 llvm::sys::path::append(LibDir, "arm");
8945 break;
8946 default:
8947 break;
8948 }
8949 CmdArgs.push_back(
8950 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00008951
8952 if (MSVC.useUniversalCRT(VisualStudioDir)) {
8953 std::string UniversalCRTLibPath;
8954 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
8955 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8956 UniversalCRTLibPath.c_str()));
8957 }
Zachary Turner10d75b22014-10-22 20:40:43 +00008958 }
8959
8960 std::string WindowsSdkLibPath;
8961 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
8962 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
8963 WindowsSdkLibPath.c_str()));
8964 }
8965
Michael J. Spencerb186bc32010-08-21 21:55:07 +00008966 CmdArgs.push_back("-nologo");
8967
Reid Kleckner124955a2015-08-05 18:51:13 +00008968 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008969 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00008970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008971 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00008972 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00008973 if (DLL) {
8974 CmdArgs.push_back(Args.MakeArgString("-dll"));
8975
8976 SmallString<128> ImplibName(Output.getFilename());
8977 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008978 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00008979 }
8980
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00008981 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00008982 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00008983 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008984 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008985 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008986 "asan_dynamic", "asan_dynamic_runtime_thunk",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008987 };
8988 for (const auto &Component : CompilerRTComponents)
8989 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00008990 // Make sure the dynamic runtime thunk is not optimized out at link time
8991 // to ensure proper SEH handling.
8992 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00008993 } else if (DLL) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008994 CmdArgs.push_back(
8995 Args.MakeArgString(getCompilerRT(TC, "asan_dll_thunk")));
Alexey Samsonov6424e022014-05-12 20:20:20 +00008996 } else {
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008997 static const char *CompilerRTComponents[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008998 "asan", "asan_cxx",
Saleem Abdulrasool1d59f492015-01-02 20:00:55 +00008999 };
9000 for (const auto &Component : CompilerRTComponents)
9001 CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Component)));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009002 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009003 }
9004
Hans Wennborg2e274592013-08-13 23:38:57 +00009005 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009006
Alexey Bataevc7e84352015-08-19 04:49:01 +00009007 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9008 options::OPT_fno_openmp, false)) {
9009 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9010 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9011 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9012 TC.getDriver().Dir + "/../lib"));
9013 switch (getOpenMPRuntime(getToolChain(), Args)) {
9014 case OMPRT_OMP:
9015 CmdArgs.push_back("-defaultlib:libomp.lib");
9016 break;
9017 case OMPRT_IOMP5:
9018 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9019 break;
9020 case OMPRT_GOMP:
9021 break;
9022 case OMPRT_Unknown:
9023 // Already diagnosed.
9024 break;
9025 }
9026 }
9027
Reid Kleckner337188f2014-09-16 19:22:00 +00009028 // Add filenames, libraries, and other linker inputs.
9029 for (const auto &Input : Inputs) {
9030 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009031 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009032 continue;
9033 }
9034
9035 const Arg &A = Input.getInputArg();
9036
9037 // Render -l options differently for the MSVC linker.
9038 if (A.getOption().matches(options::OPT_l)) {
9039 StringRef Lib = A.getValue();
9040 const char *LinkLibArg;
9041 if (Lib.endswith(".lib"))
9042 LinkLibArg = Args.MakeArgString(Lib);
9043 else
9044 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9045 CmdArgs.push_back(LinkLibArg);
9046 continue;
9047 }
9048
9049 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9050 // or -L. Render it, even if MSVC doesn't understand it.
9051 A.renderAsInput(Args, CmdArgs);
9052 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009053
Zachary Turner719f58c2014-12-01 23:06:47 +00009054 // We need to special case some linker paths. In the case of lld, we need to
9055 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9056 // linker, we need to use a special search algorithm.
9057 llvm::SmallString<128> linkPath;
9058 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9059 if (Linker.equals_lower("lld"))
9060 Linker = "lld-link";
9061
9062 if (Linker.equals_lower("link")) {
9063 // If we're using the MSVC linker, it's not sufficient to just use link
9064 // from the program PATH, because other environments like GnuWin32 install
9065 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009066 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009067 C.getDriver().getClangProgramPath());
9068 } else {
9069 linkPath = Linker;
9070 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009071 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009072 }
9073
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009074 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009076}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009077
Douglas Katzman95354292015-06-23 20:42:09 +00009078void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9079 const InputInfo &Output,
9080 const InputInfoList &Inputs,
9081 const ArgList &Args,
9082 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009083 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9084}
9085
Douglas Katzman95354292015-06-23 20:42:09 +00009086std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009087 Compilation &C, const JobAction &JA, const InputInfo &Output,
9088 const InputInfoList &Inputs, const ArgList &Args,
9089 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009090 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009091 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009092 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009093 CmdArgs.push_back("/W0"); // No warnings.
9094
9095 // The goal is to be able to invoke this tool correctly based on
9096 // any flag accepted by clang-cl.
9097
9098 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009099 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009100
9101 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009102 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9103 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9104 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009105 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9106 if (A->getOption().getID() == options::OPT_O0) {
9107 CmdArgs.push_back("/Od");
9108 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009109 CmdArgs.push_back("/Og");
9110
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009111 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009112 if (OptLevel == "s" || OptLevel == "z")
9113 CmdArgs.push_back("/Os");
9114 else
9115 CmdArgs.push_back("/Ot");
9116
9117 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009118 }
9119 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009120 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9121 options::OPT_fno_omit_frame_pointer))
9122 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9123 ? "/Oy"
9124 : "/Oy-");
9125 if (!Args.hasArg(options::OPT_fwritable_strings))
9126 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009127
Nico Weber3f8dafb2015-03-12 19:37:10 +00009128 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009129 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9130
David Majnemerf6072342014-07-01 22:24:56 +00009131 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9132 /*default=*/false))
9133 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009134 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9135 options::OPT_fno_function_sections))
9136 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9137 ? "/Gy"
9138 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009139 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9140 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009141 CmdArgs.push_back(
9142 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009143 if (Args.hasArg(options::OPT_fsyntax_only))
9144 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009145 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9146 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009147 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009148
Nico Weber3f8dafb2015-03-12 19:37:10 +00009149 std::vector<std::string> Includes =
9150 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009151 for (const auto &Include : Includes)
9152 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009153
Hans Wennborg87cfa712013-09-19 20:32:16 +00009154 // Flags that can simply be passed through.
9155 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9156 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009157 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009158 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009159
9160 // The order of these flags is relevant, so pick the last one.
9161 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9162 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9163 A->render(Args, CmdArgs);
9164
Hans Wennborg87cfa712013-09-19 20:32:16 +00009165 // Input filename.
9166 assert(Inputs.size() == 1);
9167 const InputInfo &II = Inputs[0];
9168 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9169 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9170 if (II.isFilename())
9171 CmdArgs.push_back(II.getFilename());
9172 else
9173 II.getInputArg().renderAsInput(Args, CmdArgs);
9174
9175 // Output filename.
9176 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009177 const char *Fo =
9178 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009179 CmdArgs.push_back(Fo);
9180
Hans Wennborg188382e2013-09-20 18:16:35 +00009181 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009182 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9183 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009184 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009185 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009186}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009187
Yaron Keren1c0070c2015-07-02 04:45:27 +00009188/// MinGW Tools
9189void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9190 const InputInfo &Output,
9191 const InputInfoList &Inputs,
9192 const ArgList &Args,
9193 const char *LinkingOutput) const {
9194 claimNoWarnArgs(Args);
9195 ArgStringList CmdArgs;
9196
9197 if (getToolChain().getArch() == llvm::Triple::x86) {
9198 CmdArgs.push_back("--32");
9199 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9200 CmdArgs.push_back("--64");
9201 }
9202
9203 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9204
9205 CmdArgs.push_back("-o");
9206 CmdArgs.push_back(Output.getFilename());
9207
9208 for (const auto &II : Inputs)
9209 CmdArgs.push_back(II.getFilename());
9210
9211 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009212 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009213
9214 if (Args.hasArg(options::OPT_gsplit_dwarf))
9215 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9216 SplitDebugName(Args, Inputs[0]));
9217}
9218
9219void MinGW::Linker::AddLibGCC(const ArgList &Args,
9220 ArgStringList &CmdArgs) const {
9221 if (Args.hasArg(options::OPT_mthreads))
9222 CmdArgs.push_back("-lmingwthrd");
9223 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009224
Yaron Kerenaa281332015-08-09 00:24:07 +00009225 // Make use of compiler-rt if --rtlib option is used
9226 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9227 if (RLT == ToolChain::RLT_Libgcc) {
9228 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9229 Args.hasArg(options::OPT_static);
9230 bool Shared = Args.hasArg(options::OPT_shared);
9231 bool CXX = getToolChain().getDriver().CCCIsCXX();
9232
9233 if (Static || (!CXX && !Shared)) {
9234 CmdArgs.push_back("-lgcc");
9235 CmdArgs.push_back("-lgcc_eh");
9236 } else {
9237 CmdArgs.push_back("-lgcc_s");
9238 CmdArgs.push_back("-lgcc");
9239 }
9240 } else {
9241 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9242 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009243
Yaron Keren1c0070c2015-07-02 04:45:27 +00009244 CmdArgs.push_back("-lmoldname");
9245 CmdArgs.push_back("-lmingwex");
9246 CmdArgs.push_back("-lmsvcrt");
9247}
9248
9249void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9250 const InputInfo &Output,
9251 const InputInfoList &Inputs,
9252 const ArgList &Args,
9253 const char *LinkingOutput) const {
9254 const ToolChain &TC = getToolChain();
9255 const Driver &D = TC.getDriver();
9256 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9257
9258 ArgStringList CmdArgs;
9259
9260 // Silence warning for "clang -g foo.o -o foo"
9261 Args.ClaimAllArgs(options::OPT_g_Group);
9262 // and "clang -emit-llvm foo.o -o foo"
9263 Args.ClaimAllArgs(options::OPT_emit_llvm);
9264 // and for "clang -w foo.o -o foo". Other warning options are already
9265 // handled somewhere else.
9266 Args.ClaimAllArgs(options::OPT_w);
9267
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009268 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9269 if (LinkerName.equals_lower("lld")) {
9270 CmdArgs.push_back("-flavor");
9271 CmdArgs.push_back("gnu");
9272 }
9273
Yaron Keren1c0070c2015-07-02 04:45:27 +00009274 if (!D.SysRoot.empty())
9275 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9276
9277 if (Args.hasArg(options::OPT_s))
9278 CmdArgs.push_back("-s");
9279
9280 CmdArgs.push_back("-m");
9281 if (TC.getArch() == llvm::Triple::x86)
9282 CmdArgs.push_back("i386pe");
9283 if (TC.getArch() == llvm::Triple::x86_64)
9284 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009285 if (TC.getArch() == llvm::Triple::arm)
9286 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009287
9288 if (Args.hasArg(options::OPT_mwindows)) {
9289 CmdArgs.push_back("--subsystem");
9290 CmdArgs.push_back("windows");
9291 } else if (Args.hasArg(options::OPT_mconsole)) {
9292 CmdArgs.push_back("--subsystem");
9293 CmdArgs.push_back("console");
9294 }
9295
9296 if (Args.hasArg(options::OPT_static))
9297 CmdArgs.push_back("-Bstatic");
9298 else {
9299 if (Args.hasArg(options::OPT_mdll))
9300 CmdArgs.push_back("--dll");
9301 else if (Args.hasArg(options::OPT_shared))
9302 CmdArgs.push_back("--shared");
9303 CmdArgs.push_back("-Bdynamic");
9304 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9305 CmdArgs.push_back("-e");
9306 if (TC.getArch() == llvm::Triple::x86)
9307 CmdArgs.push_back("_DllMainCRTStartup@12");
9308 else
9309 CmdArgs.push_back("DllMainCRTStartup");
9310 CmdArgs.push_back("--enable-auto-image-base");
9311 }
9312 }
9313
9314 CmdArgs.push_back("-o");
9315 CmdArgs.push_back(Output.getFilename());
9316
9317 Args.AddAllArgs(CmdArgs, options::OPT_e);
9318 // FIXME: add -N, -n flags
9319 Args.AddLastArg(CmdArgs, options::OPT_r);
9320 Args.AddLastArg(CmdArgs, options::OPT_s);
9321 Args.AddLastArg(CmdArgs, options::OPT_t);
9322 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9323 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9324
9325 if (!Args.hasArg(options::OPT_nostdlib) &&
9326 !Args.hasArg(options::OPT_nostartfiles)) {
9327 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9328 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9329 } else {
9330 if (Args.hasArg(options::OPT_municode))
9331 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9332 else
9333 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9334 }
9335 if (Args.hasArg(options::OPT_pg))
9336 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9337 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9338 }
9339
9340 Args.AddAllArgs(CmdArgs, options::OPT_L);
9341 const ToolChain::path_list Paths = TC.getFilePaths();
9342 for (const auto &Path : Paths)
9343 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9344
9345 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9346
9347 // TODO: Add ASan stuff here
9348
9349 // TODO: Add profile stuff here
9350
9351 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9352 !Args.hasArg(options::OPT_nodefaultlibs)) {
9353 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9354 !Args.hasArg(options::OPT_static);
9355 if (OnlyLibstdcxxStatic)
9356 CmdArgs.push_back("-Bstatic");
9357 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9358 if (OnlyLibstdcxxStatic)
9359 CmdArgs.push_back("-Bdynamic");
9360 }
9361
9362 if (!Args.hasArg(options::OPT_nostdlib)) {
9363 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9364 if (Args.hasArg(options::OPT_static))
9365 CmdArgs.push_back("--start-group");
9366
9367 if (Args.hasArg(options::OPT_fstack_protector) ||
9368 Args.hasArg(options::OPT_fstack_protector_strong) ||
9369 Args.hasArg(options::OPT_fstack_protector_all)) {
9370 CmdArgs.push_back("-lssp_nonshared");
9371 CmdArgs.push_back("-lssp");
9372 }
9373 if (Args.hasArg(options::OPT_fopenmp))
9374 CmdArgs.push_back("-lgomp");
9375
9376 AddLibGCC(Args, CmdArgs);
9377
9378 if (Args.hasArg(options::OPT_pg))
9379 CmdArgs.push_back("-lgmon");
9380
Yaron Kerenadce68e2015-07-06 18:52:19 +00009381 if (Args.hasArg(options::OPT_pthread))
9382 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009383
9384 // add system libraries
9385 if (Args.hasArg(options::OPT_mwindows)) {
9386 CmdArgs.push_back("-lgdi32");
9387 CmdArgs.push_back("-lcomdlg32");
9388 }
9389 CmdArgs.push_back("-ladvapi32");
9390 CmdArgs.push_back("-lshell32");
9391 CmdArgs.push_back("-luser32");
9392 CmdArgs.push_back("-lkernel32");
9393
9394 if (Args.hasArg(options::OPT_static))
9395 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009396 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009397 AddLibGCC(Args, CmdArgs);
9398 }
9399
9400 if (!Args.hasArg(options::OPT_nostartfiles)) {
9401 // Add crtfastmath.o if available and fast math is enabled.
9402 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9403
9404 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9405 }
9406 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009407 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009408 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009409}
9410
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009411/// XCore Tools
9412// We pass assemble and link construction to the xcc tool.
9413
Douglas Katzman95354292015-06-23 20:42:09 +00009414void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9415 const InputInfo &Output,
9416 const InputInfoList &Inputs,
9417 const ArgList &Args,
9418 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009419 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009420 ArgStringList CmdArgs;
9421
9422 CmdArgs.push_back("-o");
9423 CmdArgs.push_back(Output.getFilename());
9424
9425 CmdArgs.push_back("-c");
9426
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009427 if (Args.hasArg(options::OPT_v))
9428 CmdArgs.push_back("-v");
9429
Robert Lytton894d25c2014-05-02 09:33:25 +00009430 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9431 if (!A->getOption().matches(options::OPT_g0))
9432 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009433
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009434 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9435 false))
9436 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009437
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009438 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009439
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009440 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009441 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009442
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009443 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009444 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009445}
9446
Douglas Katzman95354292015-06-23 20:42:09 +00009447void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9448 const InputInfo &Output,
9449 const InputInfoList &Inputs,
9450 const ArgList &Args,
9451 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009452 ArgStringList CmdArgs;
9453
9454 if (Output.isFilename()) {
9455 CmdArgs.push_back("-o");
9456 CmdArgs.push_back(Output.getFilename());
9457 } else {
9458 assert(Output.isNothing() && "Invalid output.");
9459 }
9460
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009461 if (Args.hasArg(options::OPT_v))
9462 CmdArgs.push_back("-v");
9463
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009464 // Pass -fexceptions through to the linker if it was present.
9465 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9466 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009467 CmdArgs.push_back("-fexceptions");
9468
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009469 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9470
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009471 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009472 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009473}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009474
Douglas Katzman95354292015-06-23 20:42:09 +00009475void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9476 const InputInfo &Output,
9477 const InputInfoList &Inputs,
9478 const ArgList &Args,
9479 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009480 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009481 const auto &TC =
9482 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9483 ArgStringList CmdArgs;
9484 const char *Exec;
9485
9486 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009487 default:
9488 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009489 case llvm::Triple::arm:
9490 case llvm::Triple::thumb:
9491 break;
9492 case llvm::Triple::x86:
9493 CmdArgs.push_back("--32");
9494 break;
9495 case llvm::Triple::x86_64:
9496 CmdArgs.push_back("--64");
9497 break;
9498 }
9499
9500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9501
9502 CmdArgs.push_back("-o");
9503 CmdArgs.push_back(Output.getFilename());
9504
9505 for (const auto &Input : Inputs)
9506 CmdArgs.push_back(Input.getFilename());
9507
9508 const std::string Assembler = TC.GetProgramPath("as");
9509 Exec = Args.MakeArgString(Assembler);
9510
Justin Bognerd3371d82015-07-17 03:35:54 +00009511 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009512}
9513
Douglas Katzman95354292015-06-23 20:42:09 +00009514void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9515 const InputInfo &Output,
9516 const InputInfoList &Inputs,
9517 const ArgList &Args,
9518 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009519 const auto &TC =
9520 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9521 const llvm::Triple &T = TC.getTriple();
9522 const Driver &D = TC.getDriver();
9523 SmallString<128> EntryPoint;
9524 ArgStringList CmdArgs;
9525 const char *Exec;
9526
9527 // Silence warning for "clang -g foo.o -o foo"
9528 Args.ClaimAllArgs(options::OPT_g_Group);
9529 // and "clang -emit-llvm foo.o -o foo"
9530 Args.ClaimAllArgs(options::OPT_emit_llvm);
9531 // and for "clang -w foo.o -o foo"
9532 Args.ClaimAllArgs(options::OPT_w);
9533 // Other warning options are already handled somewhere else.
9534
9535 if (!D.SysRoot.empty())
9536 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9537
9538 if (Args.hasArg(options::OPT_pie))
9539 CmdArgs.push_back("-pie");
9540 if (Args.hasArg(options::OPT_rdynamic))
9541 CmdArgs.push_back("-export-dynamic");
9542 if (Args.hasArg(options::OPT_s))
9543 CmdArgs.push_back("--strip-all");
9544
9545 CmdArgs.push_back("-m");
9546 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009547 default:
9548 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009549 case llvm::Triple::arm:
9550 case llvm::Triple::thumb:
9551 // FIXME: this is incorrect for WinCE
9552 CmdArgs.push_back("thumb2pe");
9553 break;
9554 case llvm::Triple::x86:
9555 CmdArgs.push_back("i386pe");
9556 EntryPoint.append("_");
9557 break;
9558 case llvm::Triple::x86_64:
9559 CmdArgs.push_back("i386pep");
9560 break;
9561 }
9562
9563 if (Args.hasArg(options::OPT_shared)) {
9564 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009565 default:
9566 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009567 case llvm::Triple::arm:
9568 case llvm::Triple::thumb:
9569 case llvm::Triple::x86_64:
9570 EntryPoint.append("_DllMainCRTStartup");
9571 break;
9572 case llvm::Triple::x86:
9573 EntryPoint.append("_DllMainCRTStartup@12");
9574 break;
9575 }
9576
9577 CmdArgs.push_back("-shared");
9578 CmdArgs.push_back("-Bdynamic");
9579
9580 CmdArgs.push_back("--enable-auto-image-base");
9581
9582 CmdArgs.push_back("--entry");
9583 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9584 } else {
9585 EntryPoint.append("mainCRTStartup");
9586
9587 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9588 : "-Bdynamic");
9589
9590 if (!Args.hasArg(options::OPT_nostdlib) &&
9591 !Args.hasArg(options::OPT_nostartfiles)) {
9592 CmdArgs.push_back("--entry");
9593 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9594 }
9595
9596 // FIXME: handle subsystem
9597 }
9598
9599 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009600 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009601
9602 CmdArgs.push_back("-o");
9603 CmdArgs.push_back(Output.getFilename());
9604
9605 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9606 SmallString<261> ImpLib(Output.getFilename());
9607 llvm::sys::path::replace_extension(ImpLib, ".lib");
9608
9609 CmdArgs.push_back("--out-implib");
9610 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9611 }
9612
9613 if (!Args.hasArg(options::OPT_nostdlib) &&
9614 !Args.hasArg(options::OPT_nostartfiles)) {
9615 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9616 const char *CRTBegin;
9617
9618 CRTBegin =
9619 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9620 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9621 }
9622
9623 Args.AddAllArgs(CmdArgs, options::OPT_L);
9624
9625 const auto &Paths = TC.getFilePaths();
9626 for (const auto &Path : Paths)
9627 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
9628
9629 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9630
9631 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9632 !Args.hasArg(options::OPT_nodefaultlibs)) {
9633 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9634 !Args.hasArg(options::OPT_static);
9635 if (StaticCXX)
9636 CmdArgs.push_back("-Bstatic");
9637 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9638 if (StaticCXX)
9639 CmdArgs.push_back("-Bdynamic");
9640 }
9641
9642 if (!Args.hasArg(options::OPT_nostdlib)) {
9643 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9644 // TODO handle /MT[d] /MD[d]
9645 CmdArgs.push_back("-lmsvcrt");
9646 AddRunTimeLibs(TC, D, CmdArgs, Args);
9647 }
9648 }
9649
9650 const std::string Linker = TC.GetProgramPath("ld");
9651 Exec = Args.MakeArgString(Linker);
9652
Justin Bognerd3371d82015-07-17 03:35:54 +00009653 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009654}
Douglas Katzman84a75642015-06-19 14:55:19 +00009655
Douglas Katzman95354292015-06-23 20:42:09 +00009656void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9657 const InputInfo &Output,
9658 const InputInfoList &Inputs,
9659 const ArgList &Args,
9660 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009661
9662 ArgStringList CmdArgs;
9663
9664 assert(Inputs.size() == 1);
9665 const InputInfo &II = Inputs[0];
9666 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9667 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9668
Douglas Katzman84a75642015-06-19 14:55:19 +00009669 CmdArgs.push_back("-DMYRIAD2");
9670 CmdArgs.push_back("-mcpu=myriad2");
9671 CmdArgs.push_back("-S");
9672
Douglas Katzmanf6071112015-08-03 14:34:22 +00009673 // Append all -I, -iquote, -isystem paths, defines/undefines,
9674 // 'f' flags, optimize flags, and warning options.
9675 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009676 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
9677 options::OPT_D, options::OPT_U,
9678 options::OPT_f_Group, options::OPT_f_clang_Group,
9679 options::OPT_g_Group, options::OPT_M_Group,
9680 options::OPT_O_Group, options::OPT_W_Group});
9681
9682 // If we're producing a dependency file, and assembly is the final action,
9683 // then the name of the target in the dependency file should be the '.o'
9684 // file, not the '.s' file produced by this step. For example, instead of
9685 // /tmp/mumble.s: mumble.c .../someheader.h
9686 // the filename on the lefthand side should be "mumble.o"
9687 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9688 C.getActions().size() == 1 &&
9689 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9690 Arg *A = Args.getLastArg(options::OPT_o);
9691 if (A) {
9692 CmdArgs.push_back("-MT");
9693 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9694 }
9695 }
9696
Douglas Katzman84a75642015-06-19 14:55:19 +00009697 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9698
9699 CmdArgs.push_back(II.getFilename());
9700 CmdArgs.push_back("-o");
9701 CmdArgs.push_back(Output.getFilename());
9702
9703 std::string Exec =
9704 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009705 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9706 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009707}
9708
Douglas Katzman95354292015-06-23 20:42:09 +00009709void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9710 const InputInfo &Output,
9711 const InputInfoList &Inputs,
9712 const ArgList &Args,
9713 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009714 ArgStringList CmdArgs;
9715
9716 assert(Inputs.size() == 1);
9717 const InputInfo &II = Inputs[0];
9718 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9719 assert(Output.getType() == types::TY_Object);
9720
9721 CmdArgs.push_back("-no6thSlotCompression");
9722 CmdArgs.push_back("-cv:myriad2"); // Chip Version ?
9723 CmdArgs.push_back("-noSPrefixing");
9724 CmdArgs.push_back("-a"); // Mystery option.
9725 for (auto Arg : Args.filtered(options::OPT_I)) {
9726 Arg->claim();
9727 CmdArgs.push_back(
9728 Args.MakeArgString(std::string("-i:") + Arg->getValue(0)));
9729 }
9730 CmdArgs.push_back("-elf"); // Output format.
9731 CmdArgs.push_back(II.getFilename());
9732 CmdArgs.push_back(
9733 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9734
9735 std::string Exec =
9736 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009737 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9738 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009739}